diff --git a/src/test/integtests/deskflow/ConfigTests.cpp b/src/test/integtests/deskflow/ConfigTests.cpp deleted file mode 100644 index 2222926bc..000000000 --- a/src/test/integtests/deskflow/ConfigTests.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2024 Symless Ltd. - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#include "deskflow/Config.h" - -#include -#include - -using namespace deskflow; - -const auto kTestFilename = "tmp/test/test.toml"; - -TEST(ConfigTests, load_fileExists_loadsConfig) -{ - std::ofstream testFile(kTestFilename); - testFile << "[test.args]\n" - R"(test-arg = "test opt")"; - testFile.close(); - Config config(kTestFilename, "test"); - - const auto result = config.load("test"); - - ASSERT_TRUE(result); - ASSERT_EQ(config.argc(), 3); - ASSERT_STREQ(config.argv()[0], "test"); - ASSERT_STREQ(config.argv()[1], "--test-arg"); - ASSERT_STREQ(config.argv()[2], "test opt"); -} - -TEST(ConfigTests, load_filenameEmpty_throwsException) -{ - EXPECT_THROW( - { - Config config("", "test"); - - config.load("test"); - }, - Config::NoConfigFilenameError - ); -} - -TEST(ConfigTests, load_fileDoesNotExist_returnsFalse) -{ - Config config("nonexistent.toml", "test"); - - const auto result = config.load("test"); - - ASSERT_FALSE(result); -} - -TEST(ConfigTests, load_invalidConfig_throwsException) -{ - EXPECT_THROW( - { - std::ofstream testFile(kTestFilename); - testFile << "foobar"; - testFile.close(); - - Config config(kTestFilename, "test"); - - config.load("test"); - }, - Config::ParseError - ); -} - -TEST(ConfigTests, load_sectionMissing_returnsFalse) -{ - std::ofstream testFile(kTestFilename); - testFile.close(); - Config config(kTestFilename, "missing"); - - const auto result = config.load("test"); - - ASSERT_FALSE(result); -} - -TEST(ConfigTests, load_notTable_returnsFalse) -{ - std::ofstream testFile(kTestFilename); - testFile << "[test]"; - testFile.close(); - Config config(kTestFilename, "test"); - - const auto result = config.load("test"); - - ASSERT_FALSE(result); -} - -TEST(ConfigTests, load_lastArg_returnsLast) -{ - std::ofstream testFile(kTestFilename); - testFile << "[test.args]\n" - R"(_last = "test last")" - "\n" - R"(test-second = true)"; - testFile.close(); - Config config(kTestFilename, "test"); - - const auto result = config.load("test-first"); - - ASSERT_TRUE(result); - ASSERT_EQ(config.argc(), 3); - ASSERT_STREQ(config.argv()[0], "test-first"); - ASSERT_STREQ(config.argv()[1], "--test-second"); - ASSERT_STREQ(config.argv()[2], "test last"); -} - -TEST(ConfigTests, load_noArgs_returnsFalse) -{ - std::ofstream testFile(kTestFilename); - testFile << "[test.args]"; - testFile.close(); - Config config(kTestFilename, "test"); - - const auto result = config.load(""); - - ASSERT_FALSE(result); -} diff --git a/src/unittests/CMakeLists.txt b/src/unittests/CMakeLists.txt index 264688c9e..ea4d77e41 100644 --- a/src/unittests/CMakeLists.txt +++ b/src/unittests/CMakeLists.txt @@ -42,6 +42,7 @@ enable_testing() find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS Test) add_subdirectory(common) +add_subdirectory(deskflow) add_subdirectory(gui) #make sure to use CI only plugin on Unix diff --git a/src/unittests/deskflow/CMakeLists.txt b/src/unittests/deskflow/CMakeLists.txt new file mode 100644 index 000000000..b2333b22e --- /dev/null +++ b/src/unittests/deskflow/CMakeLists.txt @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2025 Deskflow Developers +# SPDX-License-Identifier: MIT + +if(WIN32) + set(extra_libs version) +endif() + +create_test( + NAME ConfigTests + DEPENDS app + LIBS arch base ${extra_libs} + SOURCE ConfigTests.cpp + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src/lib/deskflow" +) diff --git a/src/unittests/deskflow/ConfigTests.cpp b/src/unittests/deskflow/ConfigTests.cpp new file mode 100644 index 000000000..d32e94864 --- /dev/null +++ b/src/unittests/deskflow/ConfigTests.cpp @@ -0,0 +1,144 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello + * SPDX-FileCopyrightText: (C) 2024 Symless Ltd. + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#include "ConfigTests.h" + +#include "../../lib/deskflow/Config.h" + +using namespace deskflow; +const auto kTestFilename = "tmp/test/test.toml"; + +void ConfigTests::initTestCase() +{ + QDir dir; + QVERIFY(dir.mkpath("tmp/test")); + + m_arch.init(); + m_log.setFilter(kDEBUG2); +} + +void ConfigTests::loadFile() +{ + QFile testFile(kTestFilename); + QVERIFY(testFile.open(QIODevice::WriteOnly | QIODevice::Text)); + + QTextStream out(&testFile); + out << "[test.args]\n" + R"(test-arg = "test opt")"; + + testFile.close(); + QVERIFY(!testFile.isOpen()); + + Config config(kTestFilename, "test"); + + const auto result = config.load("test"); + QVERIFY(result); + QCOMPARE(config.argc(), 3); + QCOMPARE(config.argv()[0], "test"); + QCOMPARE(config.argv()[1], "--test-arg"); + QCOMPARE(config.argv()[2], "test opt"); +} + +void ConfigTests::load_EmptyFile() +{ + Config config("", "test"); + QVERIFY_THROWS_EXCEPTION(Config::NoConfigFilenameError, config.load("test")); +} + +void ConfigTests::load_NonExsitingFile() +{ + Config config("nonexistent.toml", "test"); + + const auto result = config.load("test"); + QVERIFY(!result); +} + +void ConfigTests::load_InvalidConfig() +{ + QFile testFile(kTestFilename); + QVERIFY(testFile.open(QIODevice::WriteOnly)); + + QVERIFY(testFile.write("foobar")); + + testFile.close(); + QVERIFY(!testFile.isOpen()); + + Config config(kTestFilename, "test"); + QVERIFY_THROWS_EXCEPTION(Config::ParseError, config.load("test")); +} + +void ConfigTests::load_missingSections() +{ + QFile testFile(kTestFilename); + QVERIFY(testFile.open(QIODevice::WriteOnly)); + + testFile.close(); + QVERIFY(!testFile.isOpen()); + + Config config(kTestFilename, "missing"); + const auto result = config.load("test"); + QVERIFY(!result); +} + +void ConfigTests::load_badTable() +{ + QFile testFile(kTestFilename); + QVERIFY(testFile.open(QIODevice::WriteOnly)); + + QVERIFY(testFile.write("[test]")); + + testFile.close(); + QVERIFY(!testFile.isOpen()); + + Config config(kTestFilename, "test"); + + const auto result = config.load("test"); + QVERIFY(!result); +} + +void ConfigTests::load_lastArg() +{ + QFile testFile(kTestFilename); + QVERIFY(testFile.open(QIODevice::WriteOnly)); + + QVERIFY(testFile.write( + "[test.args]\n" + R"(_last = "test last")" + "\n" + R"(test-second = true)" + )); + + testFile.close(); + QVERIFY(!testFile.isOpen()); + + deskflow::Config config(kTestFilename, "test"); + + const auto result = config.load("test-first"); + QVERIFY(result); + QCOMPARE(config.argc(), 3); + QCOMPARE(config.argv()[0], "test-first"); + QCOMPARE(config.argv()[1], "--test-second"); + QCOMPARE(config.argv()[2], "test last"); +} + +void ConfigTests::load_noArgs() +{ + QFile testFile(kTestFilename); + QVERIFY(testFile.open(QIODevice::WriteOnly)); + + QVERIFY(testFile.write("[test.args]")); + + testFile.close(); + QVERIFY(!testFile.isOpen()); + + deskflow::Config config(kTestFilename, "test"); + + const auto result = config.load(""); + QVERIFY(!result); +} + +QTEST_MAIN(ConfigTests) diff --git a/src/unittests/deskflow/ConfigTests.h b/src/unittests/deskflow/ConfigTests.h new file mode 100644 index 000000000..a3a64b88e --- /dev/null +++ b/src/unittests/deskflow/ConfigTests.h @@ -0,0 +1,29 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#include "base/Log.h" + +#include + +class ConfigTests : public QObject +{ + Q_OBJECT +private slots: + // Test are run in order top to bottom + void initTestCase(); + void loadFile(); + void load_EmptyFile(); + void load_NonExsitingFile(); + void load_InvalidConfig(); + void load_missingSections(); + void load_badTable(); + void load_lastArg(); + void load_noArgs(); + +private: + Arch m_arch; + Log m_log; +};