commit 94cf0b247d4e4bb95cf3bd6398ae94060ac35844 Author: Sebastian Baginski sebthestampede@gmail.com Date: Sat Sep 15 13:26:49 2012 +0200
test code for torrc classes --- CMakeLists.txt | 3 + changes/bug6128 | 2 + src/CMakeLists.txt | 4 +- src/tests/CMakeLists.txt | 332 ++++++++++++++++++++++++++ src/tests/TorrcTest.cpp | 589 ++++++++++++++++++++++++++++++++++++++++++++++ src/tests/Torrctest.h | 44 ++++ src/tests/testMain.cpp | 43 ++++ 7 files changed, 1016 insertions(+), 1 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt index 021de50..08a70bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,6 +115,9 @@ if (USE_GEOIP) include(${CMAKE_SOURCE_DIR}/cmake/FindGeoIP.cmake) endif(USE_GEOIP)
+## Optional include test sources +option(BUILD_TESTS "Build test sources" OFF) + ## Check for system header files check_include_file("limits.h" HAVE_LIMITS_H) check_include_file("sys/limits.h" HAVE_SYS_LIMITS_H) diff --git a/changes/bug6128 b/changes/bug6128 new file mode 100644 index 0000000..f261f06 --- /dev/null +++ b/changes/bug6128 @@ -0,0 +1,2 @@ + Internal cleanups and improvements: + o Create test code for Vidalia torrc classes. Fixes ticket 6128. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4a25aac..fefa2c6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -65,4 +65,6 @@ add_subdirectory(common) add_subdirectory(tools) add_subdirectory(torcontrol) add_subdirectory(vidalia) - +if (BUILD_TESTS) + add_subdirectory(tests) +endif (BUILD_TESTS) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt new file mode 100644 index 0000000..1d0bf34 --- /dev/null +++ b/src/tests/CMakeLists.txt @@ -0,0 +1,332 @@ +## +## $Id$ +## +## This file is part of Vidalia, and is subject to the license terms in the +## LICENSE file, found in the top level directory of this distribution. If +## you did not receive the LICENSE file with this file, you may obtain it +## from the Vidalia source package distributed by the Vidalia Project at +## http://www.torproject.org/projects/vidalia.html. No part of Vidalia, +## including this file, may be copied, modified, propagated, or distributed +## except according to the terms described in the LICENSE file. +## + +add_definitions( -DBUILD_TESTS ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/torrc + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/browser + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/prototypes + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions +) + +## About dialog sources +set(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about/AboutDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about/LicenseDialog.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about/AboutDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about/LicenseDialog.h +) + +## Plugin framework sources +set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/PluginEngine.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/PluginWrapper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/DebugDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/prototypes/HelperProcessPrototype.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/prototypes/TorrcPrototype.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/VidaliaExtensions.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/VidaliaExtensionsInit.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_BootstrapStatus.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_Circuit.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_ControlCommand.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_ControlConnection.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_ControlMethod.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_ControlReply.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_ControlSocket.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_ReplyLine.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_RouterDescriptor.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_RouterStatus.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_SendCommandEvent.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_Stream.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_TorControl.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_TorEvents.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_TorProcess.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_TorSignal.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscript_VidaliaTab.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_ControlConnection.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_ControlMethod.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_ControlSocket.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_TorControl.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_TorEvents.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_TorProcess.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_TorSignal.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/extensions/qtscriptshell_VidaliaTab.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/PluginEngine.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/PluginWrapper.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/DebugDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/prototypes/HelperProcessPrototype.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/prototypes/TorrcPrototype.h +) + +## Configuration dialog sources +set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AbstractTorSettings.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AdvancedPage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AppearancePage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/BridgeUsageDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ConfigDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ConfigPageStack.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/DomainValidator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ExitPolicy.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/GeneralPage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/IpValidator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/Local8BitStringValidator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NetworkPage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NetworkSettings.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NicknameValidator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/Policy.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/PortValidator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ServerPage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ServerSettings.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/TorrcDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/TorSettings.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/VidaliaSettings.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/VSettings.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/torrc/TorrcParser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/torrc/Torrc.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AbstractTorSettings.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AdvancedPage.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AppearancePage.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/BridgeUsageDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ConfigDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ConfigPage.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ConfigPageStack.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/DomainValidator.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/GeneralPage.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/Local8BitStringValidator.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NetworkPage.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NetworkSettings.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NicknameValidator.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/PortValidator.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ServerPage.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ServerSettings.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/TorrcDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/TorSettings.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/VidaliaSettings.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/VSettings.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/torrc/Torrc.h +) +if (USE_MINIUPNPC) + include_directories(${MINIUPNPC_INCLUDE_DIR}) + set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPControl.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPControlThread.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPTestDialog.cpp + ) + qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPControl.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPControlThread.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPTestDialog.h + ) +endif(USE_MINIUPNPC) + +## Main Vidalia sources (without main.cpp) +set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/Vidalia.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/LanguageSupport.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VTabWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VAttachButton.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/MainWindow.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VidaliaWindow.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VMessageBox.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/ControlPasswordInputDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VidaliaTab.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/StatusTab.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/HelperProcess.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/FirstRunWizard.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/Vidalia.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VTabWidget.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VAttachButton.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/MainWindow.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VidaliaWindow.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VMessageBox.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/ControlPasswordInputDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/VidaliaTab.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/StatusTab.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/HelperProcess.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/FirstRunWizard.h +) + +if (USE_MINIUPNPC) + qt4_wrap_ui(vidalia_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/UPNPTestDialog.ui) +endif(USE_MINIUPNPC) + +## Specify all the Qt Designer .ui files +qt4_wrap_ui(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/ControlPasswordInputDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/StatusTab.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/MainWindow.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about/AboutDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/about/LicenseDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AdvancedPage.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/AppearancePage.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/BridgeUsageDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ConfigDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/GeneralPage.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/NetworkPage.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/ServerPage.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/config/TorrcDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/MessageLog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/browser/HelpBrowser.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/NetViewer.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterInfoDialog.ui + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/plugin/DebugDialog.ui +) + +## Add the resource files (icons, etc.) +qt4_add_resources(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/res/vidalia.qrc + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/content/content.qrc + ${CMAKE_CURRENT_BINARY_DIR}/../vidalia/i18n/vidalia_i18n.qrc +) + +## Network map sources +set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/CircuitItem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/CircuitListWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/CountryInfo.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/GeoIpRecord.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/GeoIpResolver.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/NetViewer.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterDescriptorView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterInfoDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterListItem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterListWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/StreamItem.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/CircuitListWidget.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/CountryInfo.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/GeoIpResolver.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/NetViewer.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterDescriptorView.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterInfoDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/RouterListWidget.h +) +if (USE_MARBLE) + set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/TorMapWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/TorMapWidgetPopupMenu.cpp + ) + qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/TorMapWidget.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/TorMapWidgetPopupMenu.h + ) +else(USE_MARBLE) + set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/TorMapImageView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/ZImageView.cpp + ) + qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/TorMapImageView.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/ZImageView.h + ) +endif(USE_MARBLE) +if (USE_GEOIP) + set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/GeoIpDatabase.cpp + ) + qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/network/GeoIpDatabase.h + ) +endif(USE_GEOIP) + +## Help browser sources +set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/browser/HelpBrowser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/browser/HelpTextBrowser.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/browser/HelpBrowser.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/help/browser/HelpTextBrowser.h +) + +## Message log sources +set(vidalia_SRCS ${vidalia_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogFile.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogHeaderView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogMessageColumnDelegate.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogTreeItem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogTreeWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/MessageLog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/StatusEventItem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/StatusEventItemDelegate.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/StatusEventWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogFilter.cpp +) +qt4_wrap_cpp(vidalia_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogFile.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogHeaderView.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/LogTreeWidget.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/MessageLog.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/StatusEventItemDelegate.h + ${CMAKE_CURRENT_SOURCE_DIR}/../vidalia/log/StatusEventWidget.h +) + + +## Bootstrap test sources +set(vidalia_SRCS ${vidalia_SRCS} + testMain.cpp + TorrcTest.cpp +) +qt4_wrap_cpp(vidalia_SRCS + TorrcTest.h +) + +set(test_BIN VidaliaTestSuite) + +add_executable(${test_BIN} ${vidalia_SRCS}) +target_link_libraries(${test_BIN} + ${QT_LIBRARIES} + ${QT_QTTEST_LIBRARY} + common + torcontrol +) +if (USE_MINIUPNPC) + target_link_libraries(${test_BIN} miniupnpc) +endif(USE_MINIUPNPC) +if (USE_BREAKPAD) + target_link_libraries(${test_BIN} ${BREAKPAD_LIBRARY}) +endif(USE_BREAKPAD) +if (USE_MARBLE) + target_link_libraries(${test_BIN} + ${MARBLE_LIBRARIES} + ${QT_QTSVG_LIBRARY} + ) +endif(USE_MARBLE) +if (USE_GEOIP) + target_link_libraries(${test_BIN} ${GEOIP_LIBRARIES}) +endif(USE_GEOIP) + +if (APPLE) + target_link_libraries(${test_BIN} + "-framework AppKit" + iconv + ) +endif(APPLE) diff --git a/src/tests/TorrcTest.cpp b/src/tests/TorrcTest.cpp new file mode 100644 index 0000000..1e2a026 --- /dev/null +++ b/src/tests/TorrcTest.cpp @@ -0,0 +1,589 @@ +/* +** This file is part of Vidalia, and is subject to the license terms in the +** LICENSE file, found in the top level directory of this distribution. If you +** did not receive the LICENSE file with this file, you may obtain it from the +** Vidalia source package distributed by the Vidalia Project at +** http://www.torproject.org/projects/vidalia.html. No part of Vidalia, +** including this file, may be copied, modified, propagated, or distributed +** except according to the terms described in the LICENSE file. +*/ + +/* +** \file TorrcTest.cpp +** \brief test of torrc handling +*/ + +#include "TorrcTest.h" +#include "TorrcParser.h" +#include "Torrc.h" +#include "Vidalia.h" +#include "MainWindow.h" +#include <QTimer> +#include <QEventLoop> + +/** Constructor. */ +TorrcTestSuite::TorrcTestSuite(QObject *parent) + :QObject(parent) +{ + +} + +/** Destructor. */ +TorrcTestSuite::~TorrcTestSuite() +{ + +} + +/** Test TorrcLine class */ +void TorrcTestSuite::testTorrcLine() +{ + const int count = 100; + + // test single lined values + for (int i=0 ; i<count ; ++i) { + const QString content = QString("test_content_%1").arg(i); + const QString comment = QString("test_comment_%1").arg(i); + TorrcLine tLine(content,comment); + QCOMPARE(content, tLine.content()); + QCOMPARE(comment, tLine.comment()); + QVERIFY(tLine.isMultilined() == false); + tLine.setComment(content); + tLine.setContent(comment); + QCOMPARE(comment, tLine.content()); + QCOMPARE(content, tLine.comment()); + QVERIFY(tLine.isMultilined() == false); + } + + // test multilined TorrcLine + for (int i=0 ; i<count ; ++i) { + const QString content = QString("test\multiline\content\%1\").arg(i); + const QString comment = QString("test\multiline\comment\%1\").arg(i); + TorrcLine tLine(content,comment); + QCOMPARE(content, tLine.content()); + QCOMPARE(comment, tLine.comment()); + QVERIFY(tLine.isMultilined() == true); + tLine.setComment(content); + tLine.setContent(comment); + QCOMPARE(comment, tLine.content()); + QCOMPARE(content, tLine.comment()); + QVERIFY(tLine.isMultilined() == true); + } +} + +/** Test parser class */ +void TorrcTestSuite::testTorrcParser() +{ + const QString testFilePath("vidalia_test_suite_torrc_file.txt"); + QFile file(testFilePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + QVERIFY(false && "Cannot open test torrc file!"); + const int optCount = 100; + QList< QPair<QString,QString> > testData; + // create test file + QString content; + for (int i=0 ; i<optCount ; ++i) { + const QString optName = QString("option_%1 value_%1").arg(i); + const QString optComt = QString("#comment_%1").arg(i); + content += optName + optComt; + testData.append( QPair<QString,QString>(optName,optComt) ); + if (i<optCount-1) + content += "\n"; + } + file.write(content.toAscii()); + file.close(); + + TorrcParser parser; + QMap<QString, QPair<QString, TorOpt> > map; + QList<TorrcLine*> lines = parser.parse(testFilePath,map); + QVERIFY(lines.isEmpty() == false); + QCOMPARE(lines.count(), optCount); + + for (int i=0 ; i<optCount ; ++i) { + TorrcLine * line = lines.at(i); + QVERIFY(line != NULL); + QCOMPARE(line->content(), testData[i].first); + QCOMPARE(line->comment(), testData[i].second); + } + + // verify loaded values (all should be null) + QCOMPARE(map.count(), optCount); + foreach (QString key, map.keys()) { + QString value = map[key].first; + TorOpt opt = map[key].second; + QVERIFY(value.startsWith("value_")); + QVERIFY(opt.isNull()); + } + + qDeleteAll(lines); + QVERIFY( QFile::remove(testFilePath) ); +} + +QList<TorOpt> createTestOpts(); +QString createTestValue(TorOpt::OptType); +QString defaultValue(const QString &); + +/** Test main Torrc class */ +void TorrcTestSuite::testTorrc() +{ + const QString testFilePath("vidalia_test_suite_torrc_file.txt"); + QFile file(testFilePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + QVERIFY(false && "Cannot open test torrc file!"); + QList<TorOpt> opts = createTestOpts(); + QList< QPair<QString,QString> > testData; + foreach (const TorOpt &opt, opts) { + testData.append( QPair<QString,QString>(opt.name(),createTestValue(opt.type())) ); + } + // create test file with real option names and values + QString content; + for (int i=0 ; i<testData.count() ; ++i) { + const QString optName = testData[i].first + " " + testData[i].second; + const QString optComt = QString("#comment_%1").arg(i); + content += optName + optComt; + if (i<testData.count()-1) + content += "\n"; + } + file.write(content.toAscii()); + file.close(); + + TorrcParser parser; + QMap<QString, QPair<QString, TorOpt> > map; + QList<TorrcLine*> lines = parser.parse(testFilePath,map); + QVERIFY(lines.isEmpty() == false); + QCOMPARE(lines.count(), testData.count()); + + for (int i=0 ; i<testData.count() ; ++i) { + TorrcLine * line = lines.at(i); + QVERIFY(line != NULL); + QCOMPARE(line->content(), QString(testData[i].first + " " + testData[i].second).trimmed()); + QCOMPARE(line->comment(), QString("#comment_%1").arg(i)); + } + + // verify loaded values + foreach (QString key, map.keys()) { + QString value = map[key].first; + TorOpt opt = map[key].second; + QCOMPARE(value, createTestValue(opt.type())); + QVERIFY(opt.isNull() == false); + QVERIFY(testData.contains( QPair<QString,QString>(key,value) )); + } + + qDeleteAll(lines); + + // test torrc object + Torrc torrc(testFilePath); + QCOMPARE(torrc.getTorrcPath(), testFilePath); + for (int i=0 ; i<testData.count() ; ++i) { + // test the data in torrc file + QVERIFY(torrc.isValid(testData[i].first, testData[i].second)); + QStringList values = torrc.value(testData[i].first); + if (testData[i].second.isEmpty()==false) { + QVERIFY(values.contains(testData[i].second)); + } + // test if clearing a value works ok + torrc.clear(QStringList() << testData[i].first); + values = torrc.value(testData[i].first); + if (testData[i].second.isEmpty()==false) { + QVERIFY(values.contains(testData[i].second) == false); + } + } + QVERIFY(torrc.apply(Vidalia::torControl())); + // after applying changes, we test the file content + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); + content = file.readAll(); + file.close(); + for (int i=0 ; i<testData.count() ; ++i) { + QVERIFY(content.contains(testData[i].first) == false); + } + // test adding values to empty file + QVERIFY(QFile::remove(testFilePath)); + QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text)); + file.write(""); + file.close(); + torrc.load(testFilePath); + int lastKeyPos = -1; // value for checking if <key, value> pairs are present in the file + for (int i=0 ; i<testData.count() ; ++i) { + torrc.setValue(testData[i].first,testData[i].second); + QVERIFY(torrc.apply(Vidalia::torControl())); + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); + content = file.readAll(); + file.close(); + // if value is default for given key, file should not contain the entry + if (testData[i].second == defaultValue(testData[i].first)) { + QVERIFY(content.contains(testData[i].first)==false); + } else { + // check if key is in the file, and the value follows + QVERIFY(content.contains(testData[i].first)); + lastKeyPos = content.indexOf(testData[i].first,lastKeyPos+1); + int nlPos = content.indexOf("\n",lastKeyPos); + if (nlPos == -1) + nlPos = content.length(); + const int valPos = content.indexOf(testData[i].second,lastKeyPos); + QVERIFY(valPos != -1); + QVERIFY(valPos < nlPos); + } + } + QVERIFY(QFile::remove(testFilePath)); +} + +inline bool +compareValues(const QVariant& var, const QString& value){ + bool ok = false; + const double r = value.toDouble(&ok); + if (ok) + return qFuzzyCompare(var.toDouble(),r); + else + return var.toString() == value; +} + +void TorrcTestSuite::testRunningTor() +{ + MainWindow * mw = new MainWindow; + mw->show(); + TorControl * torControl = Vidalia::torControl(); + QVERIFY(torControl); + + // start tor, make sure we wont wait forever + QEventLoop loop; + QTimer timeoutCheck; + timeoutCheck.setSingleShot(true); + timeoutCheck.setInterval(120*1000); + connect(&timeoutCheck, SIGNAL(timeout()), &loop, SLOT(quit())); + connect(torControl, SIGNAL(started()), &loop, SLOT(quit())); + QTimer::singleShot(0,mw,SLOT(start())); + timeoutCheck.start(); + loop.exec(); + qApp->processEvents(); + + if (timeoutCheck.isActive()) { + vWarn("Tor process started."); + QVERIFY(torControl->isConnected()); + QVERIFY(torControl->isRunning()); + + // create test torrc file + const QString testFilePath("vidalia_test_suite_torrc_file.txt"); + QFile file(testFilePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + QVERIFY(false && "Cannot open test torrc file!"); + + QHash<QString,QString> testData; + testData["AccountingMax"] = "0"; + testData["AllowDotExit"] = "0"; + testData["AllowInvalidNodes"] = "middle,rendezvous"; + testData["AllowNonRFC953Hostnames"] = "0"; + testData["AllowSingleHopCircuits"] = "0"; + testData["BridgeRecordUsageByCountry"] = "0"; + testData["CircuitIdleTimeout"] = "3600"; + testData["CircuitPriorityHalflife"] = "-100.0"; + testData["ControlPort"] = "9051"; + testData["CookieAuthentication"] = "0"; + testData["DataDirectory"] = "C:\DifferentDataDirectory"; + testData["PortForwarding"] = "0"; + testData["ProtocolWarnings"] = "0"; + testData["User"] = "userid"; + // data directory should remain unchanged + const QString dataDir = torControl->getConf("DataDirectory").toString(); + + QString content; + foreach (QString key, testData) { + content += key + " " + testData[key] + "#comment\n"; + } + file.write(content.toAscii()); + file.close(); + Torrc torrc(testFilePath); + QVERIFY( torrc.apply(torControl) ); + + // check values in running tor instance + foreach (QString key, testData) { + const QVariant val = torControl->getConf(key); + if (key == "DataDirectory"){ + QCOMPARE(dataDir,val.toString()); + } else + QVERIFY(compareValues(val,testData[key])); + } + // create new test data, different from current tor values + testData.remove("DataDirectory"); + testData["AccountingMax"] = "1"; + testData["AllowDotExit"] = "1"; + testData["AllowInvalidNodes"] = "middle"; + testData["AllowNonRFC953Hostnames"] = "1"; + testData["AllowSingleHopCircuits"] = "1"; + testData["BridgeRecordUsageByCountry"] = "1"; + testData["CircuitIdleTimeout"] = "900"; + testData["CircuitPriorityHalflife"] = "-150.0"; + testData["ControlPort"] = "8974"; + testData["CookieAuthentication"] = "1"; + testData["PortForwarding"] = "1"; + testData["ProtocolWarnings"] = "1"; + testData["User"] = "u2id"; + + // check if values are applied ok + QVERIFY( torrc.apply(torControl) ); + foreach (QString key, testData) { + const QVariant val = torControl->getConf(key); + QVERIFY(compareValues(val,testData[key])); + } + QVERIFY(QFile::remove(testFilePath)); + } else { + QVERIFY(false && "Cannot start the tor process!"); + } + mw->deleteLater(); +} + +QList<TorOpt> +createTestOpts() +{ + QList<TorOpt> opt; + opt << TorOpt("AccountingMax", TorOpt::DataSize, "0"); + opt << TorOpt("AccountingStart", TorOpt::String, ""); + opt << TorOpt("Address", TorOpt::String, ""); + opt << TorOpt("AllowDotExit", TorOpt::Boolean, "0"); + opt << TorOpt("AllowInvalidNodes", TorOpt::CommaList, "middle,rendezvous"); + opt << TorOpt("AllowNonRFC953Hostnames", TorOpt::Boolean, "0"); + opt << TorOpt("AllowSingleHopCircuits", TorOpt::Boolean, "0"); + opt << TorOpt("AllowSingleHopExits", TorOpt::Boolean, "0"); + opt << TorOpt("AlternateBridgeAuthority", TorOpt::LineList, ""); + opt << TorOpt("AlternateDirAuthority", TorOpt::LineList, ""); + opt << TorOpt("AlternateHSAuthority", TorOpt::LineList, ""); + opt << TorOpt("AssumeReachable", TorOpt::Boolean, "0"); + opt << TorOpt("AuthDirBadDir", TorOpt::LineList, ""); + opt << TorOpt("AuthDirBadExit", TorOpt::LineList, ""); + opt << TorOpt("AuthDirInvalid", TorOpt::LineList, ""); + opt << TorOpt("AuthDirReject", TorOpt::LineList, ""); + opt << TorOpt("AuthDirRejectUnlisted", TorOpt::Boolean, "0"); + opt << TorOpt("AuthDirListBadDirs", TorOpt::Boolean, "0"); + opt << TorOpt("AuthDirListBadExits", TorOpt::Boolean, "0"); + opt << TorOpt("AuthDirMaxServersPerAddr", TorOpt::Integer, "2"); + opt << TorOpt("AuthDirMaxServersPerAuthAddr", TorOpt::Integer, "5"); + opt << TorOpt("AuthoritativeDirectory", TorOpt::Boolean, "0"); + opt << TorOpt("AutomapHostsOnResolve", TorOpt::Boolean, "0"); + opt << TorOpt("AutomapHostsSuffixes", TorOpt::CommaList, ".onion,.exit"); + opt << TorOpt("AvoidDiskWrites", TorOpt::Boolean, "0"); + opt << TorOpt("BandwidthBurst", TorOpt::DataSize, "10485760"); + opt << TorOpt("BandwidthRate", TorOpt::DataSize, "5242880"); + opt << TorOpt("BridgeAuthoritativeDir", TorOpt::Boolean, "0"); + opt << TorOpt("Bridge", TorOpt::LineList, ""); + opt << TorOpt("BridgePassword", TorOpt::String, ""); + opt << TorOpt("BridgeRecordUsageByCountry", TorOpt::Boolean, "1"); + opt << TorOpt("BridgeRelay", TorOpt::Boolean, "0"); + opt << TorOpt("CellStatistics", TorOpt::Boolean, "0"); + opt << TorOpt("LearnCircuitBuildTimeout", TorOpt::Boolean, "1"); + opt << TorOpt("CircuitBuildTimeout", TorOpt::TimeInterval, "0"); + opt << TorOpt("CircuitIdleTimeout", TorOpt::TimeInterval, "3600"); + opt << TorOpt("CircuitStreamTimeout", TorOpt::TimeInterval, "0"); + opt << TorOpt("CircuitPriorityHalflife", TorOpt::Float, "-100.0"); + opt << TorOpt("ClientDNSRejectInternalAddresses", TorOpt::Boolean, "1"); + opt << TorOpt("ClientOnly", TorOpt::Boolean, "0"); + opt << TorOpt("ClientRejectInternalAddresses", TorOpt::Boolean, "1"); + opt << TorOpt("ClientTransportPlugin", TorOpt::LineList, ""); + opt << TorOpt("ConsensusParams", TorOpt::String, ""); + opt << TorOpt("ConnLimit", TorOpt::Integer, "1000"); + opt << TorOpt("ConnDirectionStatistics", TorOpt::Boolean, "0"); + opt << TorOpt("ConstrainedSockets", TorOpt::Boolean, "0"); + opt << TorOpt("ConstrainedSockSize", TorOpt::DataSize, "8192"); + opt << TorOpt("ContactInfo", TorOpt::String, ""); + opt << TorOpt("ControlListenAddress", TorOpt::LineList, ""); + opt << TorOpt("ControlPort", TorOpt::Port, "9051"); + opt << TorOpt("ControlPortFileGroupReadable", TorOpt::Boolean, "0"); + opt << TorOpt("ControlPortWriteToFile", TorOpt::Filename, ""); + opt << TorOpt("ControlSocket", TorOpt::LineList, ""); + opt << TorOpt("ControlSocketsGroupWritable", TorOpt::Boolean, "0"); + opt << TorOpt("CookieAuthentication", TorOpt::Boolean, "0"); + opt << TorOpt("CookieAuthFileGroupReadable", TorOpt::Boolean, "0"); + opt << TorOpt("CookieAuthFile", TorOpt::String, ""); + opt << TorOpt("CountPrivateBandwidth", TorOpt::Boolean, "0"); + opt << TorOpt("DataDirectory", TorOpt::Filename, ""); + opt << TorOpt("DirAllowPrivateAddresses", TorOpt::Boolean, "0"); + opt << TorOpt("TestingAuthDirTimeToLearnReachability", TorOpt::TimeInterval, "1800"); + opt << TorOpt("DirListenAddress", TorOpt::LineList, ""); + opt << TorOpt("DirPolicy", TorOpt::LineList, ""); + opt << TorOpt("DirPort", TorOpt::Port, "0"); + opt << TorOpt("DirPortFrontPage", TorOpt::Filename, ""); + opt << TorOpt("DirServer", TorOpt::LineList, ""); + opt << TorOpt("DisableAllSwap", TorOpt::Boolean, "0"); + opt << TorOpt("DisableIOCP", TorOpt::Boolean, "1"); + opt << TorOpt("DisableNetwork", TorOpt::Boolean, "0"); + opt << TorOpt("DNSPort", TorOpt::LineList, ""); + opt << TorOpt("DNSListenAddress", TorOpt::LineList, ""); + opt << TorOpt("DownloadExtraInfo", TorOpt::Boolean, "0"); + opt << TorOpt("EnforceDistinctSubnets", TorOpt::Boolean, "1"); + opt << TorOpt("EntryNodes", TorOpt::RouterList, ""); + opt << TorOpt("EntryStatistics", TorOpt::Boolean, "0"); + opt << TorOpt("TestingEstimatedDescriptorPropagationTime", TorOpt::TimeInterval, "600"); + opt << TorOpt("ExcludeNodes", TorOpt::RouterList, ""); + opt << TorOpt("ExcludeExitNodes", TorOpt::RouterList, ""); + opt << TorOpt("ExcludeSingleHopRelays", TorOpt::Boolean, "1"); + opt << TorOpt("ExitNodes", TorOpt::RouterList, ""); + opt << TorOpt("ExitPolicy", TorOpt::LineList, ""); + opt << TorOpt("ExitPolicyRejectPrivate", TorOpt::Boolean, "1"); + opt << TorOpt("ExitPortStatistics", TorOpt::Boolean, "0"); + opt << TorOpt("ExtraInfoStatistics", TorOpt::Boolean, "1"); + opt << TorOpt("FallbackNetworkstatusFile", TorOpt::Filename, "/usr/local/share/tor/fallback-consensus"); + opt << TorOpt("FascistFirewall", TorOpt::Boolean, "0"); + opt << TorOpt("FirewallPorts", TorOpt::CommaList, ""); + opt << TorOpt("FastFirstHopPK", TorOpt::Boolean, "1"); + opt << TorOpt("FetchDirInfoEarly", TorOpt::Boolean, "0"); + opt << TorOpt("FetchDirInfoExtraEarly", TorOpt::Boolean, "0"); + opt << TorOpt("FetchServerDescriptors", TorOpt::Boolean, "1"); + opt << TorOpt("FetchHidServDescriptors", TorOpt::Boolean, "1"); + opt << TorOpt("FetchUselessDescriptors", TorOpt::Boolean, "0"); + opt << TorOpt("FetchV2Networkstatus", TorOpt::Boolean, "0"); + opt << TorOpt("GeoIPFile", TorOpt::Filename, "/usr/local/share/tor/geoip"); + opt << TorOpt("GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays", TorOpt::Boolean, "0"); + opt << TorOpt("HardwareAccel", TorOpt::Boolean, "0"); + opt << TorOpt("HeartbeatPeriod", TorOpt::TimeInterval, "21300"); + opt << TorOpt("AccelName", TorOpt::String, ""); + opt << TorOpt("AccelDir", TorOpt::Filename, ""); + opt << TorOpt("HashedControlPassword", TorOpt::String, ""); + opt << TorOpt("HidServDirectoryV2", TorOpt::Boolean, "1"); + opt << TorOpt("HiddenServiceDir", TorOpt::Dependant, ""); + opt << TorOpt("HiddenServiceOptions", TorOpt::Virtual, ""); + opt << TorOpt("HiddenServicePort", TorOpt::Dependant, ""); + opt << TorOpt("HiddenServiceVersion", TorOpt::Dependant, ""); + opt << TorOpt("HiddenServiceAuthorizeClient", TorOpt::Dependant, ""); + opt << TorOpt("HidServAuth", TorOpt::LineList, ""); + opt << TorOpt("HSAuthoritativeDir", TorOpt::Boolean, "0"); + opt << TorOpt("HTTPProxy", TorOpt::String, ""); + opt << TorOpt("HTTPProxyAuthenticator", TorOpt::String, ""); + opt << TorOpt("HTTPSProxy", TorOpt::String, ""); + opt << TorOpt("HTTPSProxyAuthenticator", TorOpt::String, ""); + opt << TorOpt("ServerTransportPlugin", TorOpt::LineList, ""); + opt << TorOpt("Socks4Proxy", TorOpt::String, ""); + opt << TorOpt("Socks5Proxy", TorOpt::String, ""); + opt << TorOpt("Socks5ProxyUsername", TorOpt::String, ""); + opt << TorOpt("Socks5ProxyPassword", TorOpt::String, ""); + opt << TorOpt("KeepalivePeriod", TorOpt::TimeInterval, "300"); + opt << TorOpt("Log", TorOpt::LineList, ""); + opt << TorOpt("LogMessageDomains", TorOpt::Boolean, "0"); + opt << TorOpt("LogTimeGranularity", TorOpt::TimeMsecInterval, "1000"); + opt << TorOpt("LongLivedPorts", TorOpt::CommaList, "21,22,706,1863,5050,5190,5222,5223,6523,6667,6697,8300"); + opt << TorOpt("MapAddress", TorOpt::LineList, ""); + opt << TorOpt("MaxAdvertisedBandwidth", TorOpt::DataSize, "1073741824"); + opt << TorOpt("MaxCircuitDirtiness", TorOpt::TimeInterval, "600"); + opt << TorOpt("MaxClientCircuitsPending", TorOpt::Integer, "32"); + opt << TorOpt("MaxOnionsPending", TorOpt::Integer, "100"); + opt << TorOpt("MyFamily", TorOpt::String, ""); + opt << TorOpt("NewCircuitPeriod", TorOpt::TimeInterval, "30"); + opt << TorOpt("NamingAuthoritativeDirectory", TorOpt::Boolean, "0"); + opt << TorOpt("NATDListenAddress", TorOpt::LineList, ""); + opt << TorOpt("NATDPort", TorOpt::LineList, "0"); + opt << TorOpt("Nickname", TorOpt::String, ""); + opt << TorOpt("WarnUnsafeSocks", TorOpt::Boolean, "1"); + opt << TorOpt("NodeFamily", TorOpt::LineList, ""); + opt << TorOpt("NumCPUs", TorOpt::Integer, "0"); + opt << TorOpt("NumEntryGuards", TorOpt::Integer, "3"); + opt << TorOpt("ORListenAddress", TorOpt::LineList, ""); + opt << TorOpt("ORPort", TorOpt::Port, "0"); + opt << TorOpt("OutboundBindAddress", TorOpt::String, ""); + opt << TorOpt("PerConnBWBurst", TorOpt::DataSize, "0"); + opt << TorOpt("PerConnBWRate", TorOpt::DataSize, "0"); + opt << TorOpt("PidFile", TorOpt::String, ""); + opt << TorOpt("TestingTorNetwork", TorOpt::Boolean, "0"); + opt << TorOpt("OptimisticData", TorOpt::BooleanAuto, "auto"); + opt << TorOpt("PortForwarding", TorOpt::Boolean, "0"); + opt << TorOpt("PortForwardingHelper", TorOpt::Filename, "tor-fw-helper"); + opt << TorOpt("PreferTunneledDirConns", TorOpt::Boolean, "1"); + opt << TorOpt("ProtocolWarnings", TorOpt::Boolean, "0"); + opt << TorOpt("PublishServerDescriptor", TorOpt::CommaList, "1"); + opt << TorOpt("PublishHidServDescriptors", TorOpt::Boolean, "1"); + opt << TorOpt("ReachableAddresses", TorOpt::LineList, ""); + opt << TorOpt("ReachableDirAddresses", TorOpt::LineList, ""); + opt << TorOpt("ReachableORAddresses", TorOpt::LineList, ""); + opt << TorOpt("RecommendedVersions", TorOpt::LineList, ""); + opt << TorOpt("RecommendedClientVersions", TorOpt::LineList, ""); + opt << TorOpt("RecommendedServerVersions", TorOpt::LineList, ""); + opt << TorOpt("RefuseUnknownExits", TorOpt::BooleanAuto, "auto"); + opt << TorOpt("RejectPlaintextPorts", TorOpt::CommaList, ""); + opt << TorOpt("RelayBandwidthBurst", TorOpt::DataSize, "0"); + opt << TorOpt("RelayBandwidthRate", TorOpt::DataSize, "0"); + opt << TorOpt("RendPostPeriod", TorOpt::TimeInterval, "3600"); + opt << TorOpt("RephistTrackTime", TorOpt::TimeInterval, "36000"); + opt << TorOpt("RunAsDaemon", TorOpt::Boolean, "0"); + opt << TorOpt("SafeLogging", TorOpt::String, "1"); + opt << TorOpt("SafeSocks", TorOpt::Boolean, "0"); + opt << TorOpt("ServerDNSAllowBrokenConfig", TorOpt::Boolean, "1"); + opt << TorOpt("ServerDNSAllowNonRFC953Hostnames", TorOpt::Boolean, "0"); + opt << TorOpt("ServerDNSDetectHijacking", TorOpt::Boolean, "1"); + opt << TorOpt("ServerDNSRandomizeCase", TorOpt::Boolean, "1"); + opt << TorOpt("ServerDNSResolvConfFile", TorOpt::String, ""); + opt << TorOpt("ServerDNSSearchDomains", TorOpt::Boolean, "0"); + opt << TorOpt("ServerDNSTestAddresses", TorOpt::CommaList, "www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"); + opt << TorOpt("ShutdownWaitLength", TorOpt::TimeInterval, "30"); + opt << TorOpt("SocksListenAddress", TorOpt::LineList, ""); + opt << TorOpt("SocksPolicy", TorOpt::LineList, ""); + opt << TorOpt("SocksPort", TorOpt::LineList, "9051"); + opt << TorOpt("SocksTimeout", TorOpt::TimeInterval, "200"); + opt << TorOpt("StrictNodes", TorOpt::Boolean, "0"); + opt << TorOpt("TestSocks", TorOpt::Boolean, "0"); + opt << TorOpt("TokenBucketRefillInterval", TorOpt::TimeMsecInterval, "100"); + opt << TorOpt("TrackHostExits", TorOpt::CommaList, ""); + opt << TorOpt("TrackHostExitsExpire", TorOpt::TimeInterval, "1800"); + opt << TorOpt("TransListenAddress", TorOpt::LineList, ""); + opt << TorOpt("TransPort", TorOpt::LineList, "0"); + opt << TorOpt("TunnelDirConns", TorOpt::Boolean, "1"); + opt << TorOpt("UpdateBridgesFromAuthority", TorOpt::Boolean, "0"); + opt << TorOpt("UseBridges", TorOpt::Boolean, "0"); + opt << TorOpt("UseEntryGuards", TorOpt::Boolean, "1"); + opt << TorOpt("UseMicrodescriptors", TorOpt::BooleanAuto, "auto"); + opt << TorOpt("User", TorOpt::String, ""); + opt << TorOpt("V1AuthoritativeDirectory", TorOpt::Boolean, "0"); + opt << TorOpt("V2AuthoritativeDirectory", TorOpt::Boolean, "0"); + opt << TorOpt("V3AuthoritativeDirectory", TorOpt::Boolean, "0"); + opt << TorOpt("TestingV3AuthInitialVotingInterval", TorOpt::TimeInterval, "1800"); + opt << TorOpt("TestingV3AuthInitialVoteDelay", TorOpt::TimeInterval, "300"); + opt << TorOpt("TestingV3AuthInitialDistDelay", TorOpt::TimeInterval, "300"); + opt << TorOpt("V3AuthVotingInterval", TorOpt::TimeInterval, "3600"); + opt << TorOpt("V3AuthVoteDelay", TorOpt::TimeInterval, "300"); + opt << TorOpt("V3AuthDistDelay", TorOpt::TimeInterval, "300"); + opt << TorOpt("V3AuthNIntervalsValid", TorOpt::Integer, "3"); + opt << TorOpt("V3AuthUseLegacyKey", TorOpt::Boolean, "0"); + opt << TorOpt("V3BandwidthsFile", TorOpt::Filename, ""); + opt << TorOpt("VersioningAuthoritativeDirectory", TorOpt::Boolean, "0"); + opt << TorOpt("VirtualAddrNetwork", TorOpt::String, "127.192.0.0/10"); + opt << TorOpt("WarnPlaintextPorts", TorOpt::CommaList, "23,109,110,143"); + opt << TorOpt("_UseFilteringSSLBufferevents", TorOpt::Boolean, "0"); + opt << TorOpt("__ReloadTorrcOnSIGHUP", TorOpt::Boolean, "1"); + opt << TorOpt("__AllDirActionsPrivate", TorOpt::Boolean, "0"); + opt << TorOpt("__DisablePredictedCircuits", TorOpt::Boolean, "0"); + opt << TorOpt("__LeaveStreamsUnattached", TorOpt::Boolean, "0"); + opt << TorOpt("__HashedControlSessionPassword", TorOpt::LineList, ""); + opt << TorOpt("__OwningControllerProcess", TorOpt::String, ""); + opt << TorOpt("MinUptimeHidServDirectoryV2", TorOpt::TimeInterval, "1500"); + opt << TorOpt("VoteOnHidServDirectoriesV2", TorOpt::Boolean, "1"); + opt << TorOpt("_UsingTestNetworkDefaults", TorOpt::Boolean, "0"); + return opt; +} + +QString +createTestValue(TorOpt::OptType type) +{ + switch (type) { + case TorOpt::TimeInterval: return "32684"; + case TorOpt::TimeMsecInterval: return "5000"; + case TorOpt::String: return "test_string"; + case TorOpt::RouterList: return ""; + case TorOpt::LineList: return "123 456 789"; + case TorOpt::Float: return "3.14"; + case TorOpt::Dependant: return "dep"; + case TorOpt::Virtual: return "virt"; + case TorOpt::Filename: return "/usr/share/test/test.txt"; + case TorOpt::CommaList: return "12,43,521,123"; + case TorOpt::Boolean: return "1"; + case TorOpt::BooleanAuto: return "1"; + case TorOpt::Integer: return "7"; + case TorOpt::DataSize: return "128"; + case TorOpt::Port: return "9053"; + case TorOpt::NIL: return ""; + } +} + +QString +defaultValue(const QString& optName) +{ + static QList<TorOpt> opts = createTestOpts(); + foreach (const TorOpt& opt, opts) { + if (opt.name() == optName) + return opt.defaultValue(); + } + return QString(); +} diff --git a/src/tests/Torrctest.h b/src/tests/Torrctest.h new file mode 100644 index 0000000..14bce17 --- /dev/null +++ b/src/tests/Torrctest.h @@ -0,0 +1,44 @@ +/* +** This file is part of Vidalia, and is subject to the license terms in the +** LICENSE file, found in the top level directory of this distribution. If you +** did not receive the LICENSE file with this file, you may obtain it from the +** Vidalia source package distributed by the Vidalia Project at +** http://www.torproject.org/projects/vidalia.html. No part of Vidalia, +** including this file, may be copied, modified, propagated, or distributed +** except according to the terms described in the LICENSE file. +*/ + +/* +** \file TorrcTest.h +** \brief test of torrc file handling +*/ + +#ifndef _TORRC_TEST_H +#define _TORRC_TEST_H + +#include <QtTest/QTest> + +/** Full torrc test suite. */ +class TorrcTestSuite : public QObject +{ + Q_OBJECT + +public: + /** Constructor. */ + TorrcTestSuite(QObject * parent = NULL); + /** Destructor. */ + ~TorrcTestSuite(); + +private slots: + /** Test TorrcLine class */ + void testTorrcLine(); + /** Test parser class */ + void testTorrcParser(); + /** Test main Torrc class */ + void testTorrc(); + /** Test with running Tor */ + void testRunningTor(); + +}; + +#endif diff --git a/src/tests/testMain.cpp b/src/tests/testMain.cpp new file mode 100644 index 0000000..7632636 --- /dev/null +++ b/src/tests/testMain.cpp @@ -0,0 +1,43 @@ +/* +** This file is part of Vidalia, and is subject to the license terms in the +** LICENSE file, found in the top level directory of this distribution. If you +** did not receive the LICENSE file with this file, you may obtain it from the +** Vidalia source package distributed by the Vidalia Project at +** http://www.torproject.org/projects/vidalia.html. No part of Vidalia, +** including this file, may be copied, modified, propagated, or distributed +** except according to the terms described in the LICENSE file. +*/ + +/* +** \file testMain.cpp +** \brief Main Vidalia entry point for test target +*/ + +#include "Vidalia.h" +#include "stringutil.h" +#include "TorrcTest.h" + +#include <QtTest/QTest> + +/** Helper method to run test cases. */ +template<typename T> +void runTest(){ + T * t = new T(); + const int ret = QTest::qExec(t,QApplication::arguments()); + if( ret != 0 ){ + vError(QString("%1: test failed!").arg(t->metaObject()->className())); + } + delete t; +} + +/** Main application entry point. */ +int +main(int argc, char *argv[]) +{ + const QStringList args = char_array_to_stringlist(argv+1, argc-1); + Vidalia vidalia(args, argc, argv); + /* Launch each test class */ + runTest<TorrcTestSuite>(); + return 0; +} +
tor-commits@lists.torproject.org