diff --git a/client/core/controllers/coreController.h b/client/core/controllers/coreController.h index 1fb178f0f..a78b720d8 100644 --- a/client/core/controllers/coreController.h +++ b/client/core/controllers/coreController.h @@ -87,6 +87,7 @@ class TestComplexOperations; class TestSettingsSignals; class TestUiServersModelAndController; class TestSelfHostedServerSetup; +class TestMultipleExports; class CoreController : public QObject { @@ -104,6 +105,7 @@ class CoreController : public QObject friend class TestSettingsSignals; friend class TestUiServersModelAndController; friend class TestSelfHostedServerSetup; + friend class TestMultipleExports; public: explicit CoreController(const QSharedPointer &vpnConnection, SecureQSettings* settings, diff --git a/client/tests/CMakeLists.txt b/client/tests/CMakeLists.txt index e7496f978..bed52a677 100644 --- a/client/tests/CMakeLists.txt +++ b/client/tests/CMakeLists.txt @@ -142,6 +142,15 @@ target_link_libraries(test_self_hosted_server_setup PRIVATE test_common ) +add_executable(test_exports + testMultipleExports.cpp +) + +target_link_libraries(test_exports PRIVATE + Qt6::Test + test_common +) + enable_testing() add_test(NAME ImportExportTest COMMAND test_import_export) add_test(NAME MultipleImportsTest COMMAND test_multiple_imports) @@ -155,3 +164,4 @@ add_test(NAME ComplexOperationsTest COMMAND test_complex_operations) add_test(NAME SettingsSignalsTest COMMAND test_settings_signals) add_test(NAME UiServersModelAndControllerTest COMMAND test_ui_servers_model_and_controller) add_test(NAME SelfHostedServerSetupTest COMMAND test_self_hosted_server_setup) +add_test(NAME MultipleExportsTest COMMAND test_exports) diff --git a/client/tests/testMultipleExports.cpp b/client/tests/testMultipleExports.cpp new file mode 100644 index 000000000..2e254ee9f --- /dev/null +++ b/client/tests/testMultipleExports.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "core/controllers/coreController.h" +#include "core/models/serverConfig.h" +#include "ui/models/containerProps.h" +#include "secureQSettings.h" +#include "vpnConnection.h" + +using namespace amnezia; + +class TestMultipleExports : public QObject +{ + Q_OBJECT + +private: + CoreController *m_coreController; + SecureQSettings *m_settings; + + QString getSHAdminConfig() + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + return env.value("TEST_SELF_HOSTED_CONFIG_EMPTY"); + } + + void ExportWithContainer(DockerContainer container) + { + + ContainerProps props; + + int serverIndex = m_coreController->m_serversRepository->defaultServerIndex(); + auto port = m_coreController->m_installUiController->defaultPort(props.defaultProtocol(container)); + auto transportProto = m_coreController->m_installUiController->defaultTransportProto(props.defaultProtocol(container)); + + m_coreController->m_installUiController->install( + container, port, + static_cast(transportProto), + serverIndex); + + qDebug() << "CONTAINER INSTALLED\n"; + + qDebug() << m_coreController->m_serversUiController->getProcessedContainerIndex(); + + QString clientName = "MultipleExports Test Client"; + + auto exportResult = [&]() { + switch (container) { + case DockerContainer::Awg: + case DockerContainer::Awg2: + return m_coreController->m_exportController->generateAwgConfig(serverIndex, clientName); + case DockerContainer::WireGuard: + return m_coreController->m_exportController->generateWireGuardConfig(serverIndex, clientName); + case DockerContainer::OpenVpn: + return m_coreController->m_exportController->generateOpenVpnConfig(serverIndex, clientName); + case DockerContainer::Xray: + return m_coreController->m_exportController->generateXrayConfig(serverIndex, clientName); + } + }(); + + QVERIFY2(exportResult.errorCode == ErrorCode::NoError, "\nExport should succeed"); + QVERIFY2(!exportResult.config.isEmpty(), "Exported config should not be empty\n"); + + /* + QString fileName = ""; + QString configFileName = "amnezia_config"; + QString configExtension = ".vpn"; + +#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) + fileName = configFileName + configExtension; +#else + fileName = m_coreController->m_systemController->getFileName( + "Save AmneziaVPN config", "Config files (*" + configExtension + ")", + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/" + configFileName, true, + configExtension); +#endif + if (fileName != "") + m_coreController->m_exportUiController->exportConfig(fileName); + */ + + qDebug() << "\nEXPORTED CONFIG:\n" << exportResult.config << "\n"; + + QString exportedConfig = exportResult.config; + + auto reimportResult = m_coreController->m_importCoreController->extractConfigFromData(exportedConfig); + QVERIFY2(reimportResult.errorCode == ErrorCode::NoError, "Re-import should succeed"); + + QString reimportedJson = QJsonDocument(reimportResult.config).toJson(QJsonDocument::Compact); + + qDebug() << "\nEXPORTED JSON:\n" << exportedConfig << "\n"; + qDebug() << "REIMPORTED JSON:\n" << reimportedJson << "\n"; + + QCOMPARE(reimportedJson, exportedConfig); + + // TODO: remove only client for test + // m_coreController->m_exportController->revokeConfig(clientIndex, serverIndex, processedContainerIndex); + + m_coreController->m_installController->clearCachedProfile(serverIndex, container); + } + +private slots: + void initTestCase() + { + QString testOrg = "AmneziaVPN-Test-" + QUuid::createUuid().toString(); + m_settings = new SecureQSettings(testOrg, "amnezia-client", nullptr, false); + + auto vpnConnection = QSharedPointer::create(nullptr, nullptr); + + m_coreController = new CoreController(vpnConnection, m_settings, nullptr, this); + + QString vpnKey = getSHAdminConfig(); + QJsonObject importedConfig = m_coreController->m_importCoreController->extractConfigFromData(vpnKey).config; + + m_coreController->m_importCoreController->importConfig(importedConfig); + + qDebug() << "SELF-HOSTED ADMIN SERVER IMPORTED\n"; + } + + void cleanupTestCase() + { + int serverIndex = m_coreController->m_serversRepository->defaultServerIndex(); + m_coreController->m_installController->removeAllContainers(serverIndex); + m_coreController->m_serversController->removeServer(serverIndex); + + qDebug() << "SERVER CLEARED AND REMOVED\n"; + + m_settings->clearSettings(); + delete m_coreController; + delete m_settings; + } + + void init() + { + m_settings->clearSettings(); + if (m_coreController->m_serversModel) { + m_coreController->m_serversModel->updateModel(QVector(), -1, false); + } + } + + void testExportAwgConfig() + { + ExportWithContainer(DockerContainer::Awg2); + } + + void testExportWireGuardConfig() + { + ExportWithContainer(DockerContainer::WireGuard); + } + + void testExportOpenVpnConfig() + { + ExportWithContainer(DockerContainer::OpenVpn); + } + + void testExportXrayConfig() + { + ExportWithContainer(DockerContainer::Xray); + } + +}; + +QTEST_MAIN(TestMultipleExports) +#include "testMultipleExports.moc"