From 6c0843d088dee0f8165248a526284bba01d1cfa4 Mon Sep 17 00:00:00 2001 From: sithlord48 Date: Sat, 5 Apr 2025 23:56:27 -0400 Subject: [PATCH] refactor: port ClipboardTests to QtTests --- .../unittests/deskflow/ClipboardTests.cpp | 393 ------------------ src/unittests/deskflow/CMakeLists.txt | 8 + src/unittests/deskflow/ClipboardTests.cpp | 232 +++++++++++ src/unittests/deskflow/ClipboardTests.h | 33 ++ 4 files changed, 273 insertions(+), 393 deletions(-) delete mode 100644 src/test/unittests/deskflow/ClipboardTests.cpp create mode 100644 src/unittests/deskflow/ClipboardTests.cpp create mode 100644 src/unittests/deskflow/ClipboardTests.h diff --git a/src/test/unittests/deskflow/ClipboardTests.cpp b/src/test/unittests/deskflow/ClipboardTests.cpp deleted file mode 100644 index 009917944..000000000 --- a/src/test/unittests/deskflow/ClipboardTests.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd. - * SPDX-FileCopyrightText: (C) 2011 Nick Bolton - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#include "deskflow/Clipboard.h" - -#include - -TEST(ClipboardTests, empty_openCalled_returnsTrue) -{ - Clipboard clipboard; - clipboard.open(0); - - bool actual = clipboard.empty(); - - EXPECT_EQ(true, actual); -} - -TEST(ClipboardTests, empty_singleFormat_hasReturnsFalse) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(Clipboard::kText, "synergy rocks!"); - - clipboard.empty(); - - bool actual = clipboard.has(Clipboard::kText); - EXPECT_FALSE(actual); -} - -TEST(ClipboardTests, add_newValue_valueWasStored) -{ - Clipboard clipboard; - clipboard.open(0); - - clipboard.add(IClipboard::kText, "synergy rocks!"); - - std::string actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); -} - -TEST(ClipboardTests, add_replaceValue_valueWasReplaced) -{ - Clipboard clipboard; - clipboard.open(0); - - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. - - std::string actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("maxivista sucks", actual); -} - -TEST(ClipboardTests, open_timeIsZero_returnsTrue) -{ - Clipboard clipboard; - - bool actual = clipboard.open(0); - - EXPECT_EQ(true, actual); -} - -TEST(ClipboardTests, open_timeIsOne_returnsTrue) -{ - Clipboard clipboard; - - bool actual = clipboard.open(1); - - EXPECT_EQ(true, actual); -} - -TEST(ClipboardTests, close_isOpen_noErrors) -{ - Clipboard clipboard; - clipboard.open(0); - - clipboard.close(); - - // can't assert anything -} - -TEST(ClipboardTests, getTime_openWithNoEmpty_returnsZero) -{ - Clipboard clipboard; - clipboard.open(1); - - Clipboard::Time actual = clipboard.getTime(); - - EXPECT_EQ(0, actual); -} - -TEST(ClipboardTests, getTime_openAndEmpty_returnsOne) -{ - Clipboard clipboard; - clipboard.open(1); - clipboard.empty(); - - Clipboard::Time actual = clipboard.getTime(); - - EXPECT_EQ(1, actual); -} - -TEST(ClipboardTests, has_withFormatAdded_returnsTrue) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - - bool actual = clipboard.has(IClipboard::kText); - - EXPECT_EQ(true, actual); -} - -TEST(ClipboardTests, has_withNoFormats_returnsFalse) -{ - Clipboard clipboard; - clipboard.open(0); - - bool actual = clipboard.has(IClipboard::kText); - - EXPECT_FALSE(actual); -} - -TEST(ClipboardTests, get_withNoFormats_returnsEmpty) -{ - Clipboard clipboard; - clipboard.open(0); - - std::string actual = clipboard.get(IClipboard::kText); - - EXPECT_EQ("", actual); -} - -TEST(ClipboardTests, get_withFormatAdded_returnsExpected) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - - std::string actual = clipboard.get(IClipboard::kText); - - EXPECT_EQ("synergy rocks!", actual); -} - -TEST(ClipboardTests, marshall_addNotCalled_firstCharIsZero) -{ - Clipboard clipboard; - - std::string actual = clipboard.marshall(); - - // seems to return "\0\0\0\0" but EXPECT_EQ can't assert this, - // so instead, just assert that first char is '\0'. - EXPECT_EQ(0, (int)actual[0]); -} - -TEST(ClipboardTests, marshall_withTextAdded_typeCharIsText) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.close(); - - std::string actual = clipboard.marshall(); - - // string contains other data, but 8th char should be kText. - EXPECT_EQ(IClipboard::kText, (int)actual[7]); -} - -TEST(ClipboardTests, marshall_withTextAdded_lastSizeCharIs14) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); // 14 chars - clipboard.close(); - - std::string actual = clipboard.marshall(); - - EXPECT_EQ(14, (int)actual[11]); -} - -// TODO: there's some integer -> char encoding going on here. i find it -// hard to believe that the clipboard is the only thing doing this. maybe -// we should refactor this stuff out of the clipboard. -TEST(ClipboardTests, marshall_withTextSize285_sizeCharsValid) -{ - // 285 chars - std::string data; - data.append("Synergy is Free and Open Source Software that lets you "); - data.append("easily share your mouse and keyboard between multiple "); - data.append("computers, where each computer has it's own display. No "); - data.append("special hardware is required, all you need is a local area "); - data.append("network. Synergy is supported on Windows, Mac OS X and Linux."); - - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, data); - clipboard.close(); - - std::string actual = clipboard.marshall(); - - // 4 asserts here, but that's ok because we're really just asserting 1 - // thing. the 32-bit size value is split into 4 chars. if the size is 285 - // (29 more than the 8-bit max size), the last char "rolls over" to 29 - // (this is caused by a bit-wise & on 0xff and 8-bit truncation). each - // char before the last stores a bit-shifted version of the number, each - // 1 more power than the last, which is done by bit-shifting [0] by 24, - // [1] by 16, [2] by 8 ([3] is not bit-shifted). - EXPECT_EQ(0, actual[8]); // 285 >> 24 = 285 / (256^3) = 0 - EXPECT_EQ(0, actual[9]); // 285 >> 16 = 285 / (256^2) = 0 - EXPECT_EQ(1, actual[10]); // 285 >> 8 = 285 / (256^1) = 1(.11328125) - EXPECT_EQ(29, actual[11]); // 285 - 256 = 29 -} - -TEST(ClipboardTests, marshall_withHtmlAdded_typeCharIsHtml) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kHTML, "html sucks"); - clipboard.close(); - - std::string actual = clipboard.marshall(); - - // string contains other data, but 8th char should be kHTML. - EXPECT_EQ(IClipboard::kHTML, (int)actual[7]); -} - -TEST(ClipboardTests, marshall_withHtmlAndText_has2Formats) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks"); - clipboard.add(IClipboard::kHTML, "html sucks"); - clipboard.close(); - - std::string actual = clipboard.marshall(); - - // the number of formats is stored inside the first 4 chars. - // the writeUInt32 function right-aligns numbers in 4 chars, - // so if you right align 2, it will be "\0\0\0\2" in a string. - // we assert that the char at the 4th index is 2 (the number of - // formats that we've added). - EXPECT_EQ(2, (int)actual[3]); -} - -TEST(ClipboardTests, marshall_withTextAdded_endsWithAdded) -{ - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.close(); - - std::string actual = clipboard.marshall(); - - // string contains other data, but should end in the string we added. - EXPECT_EQ("synergy rocks!", actual.substr(12)); -} - -TEST(ClipboardTests, unmarshall_emptyData_hasTextIsFalse) -{ - Clipboard clipboard; - - std::string data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)0; // 0 formats added - - clipboard.unmarshall(data, 0); - - clipboard.open(0); - bool actual = clipboard.has(IClipboard::kText); - EXPECT_FALSE(actual); -} - -TEST(ClipboardTests, unmarshall_withTextSize285_getTextIsValid) -{ - Clipboard clipboard; - - // 285 chars - std::string text; - text.append("Synergy is Free and Open Source Software that lets you "); - text.append("easily share your mouse and keyboard between multiple "); - text.append("computers, where each computer has it's own display. No "); - text.append("special hardware is required, all you need is a local area "); - text.append("network. Synergy is supported on Windows, Mac OS X and Linux."); - - std::string data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)1; // 1 format added - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kText; - data += (char)0; // 285 >> 24 = 285 / (256^3) = 0 - data += (char)0; // 285 >> 16 = 285 / (256^2) = 0 - data += (char)1; // 285 >> 8 = 285 / (256^1) = 1(.11328125) - data += (char)29; // 285 - 256 = 29 - data += text; - - clipboard.unmarshall(data, 0); - - clipboard.open(0); - std::string actual = clipboard.get(IClipboard::kText); - EXPECT_EQ(text, actual); -} - -TEST(ClipboardTests, unmarshall_withTextAndHtml_getTextIsValid) -{ - Clipboard clipboard; - std::string data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)2; // 2 formats added - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kText; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)14; - data += "synergy rocks!"; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kHTML; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)10; - data += "html sucks"; - - clipboard.unmarshall(data, 0); - - clipboard.open(0); - std::string actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); -} - -TEST(ClipboardTests, unmarshall_withTextAndHtml_getHtmlIsValid) -{ - Clipboard clipboard; - std::string data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)2; // 2 formats added - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kText; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)14; - data += "synergy rocks!"; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kHTML; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)10; - data += "html sucks"; - - clipboard.unmarshall(data, 0); - - clipboard.open(0); - std::string actual = clipboard.get(IClipboard::kHTML); - EXPECT_EQ("html sucks", actual); -} - -TEST(ClipboardTests, copy_withSingleText_clipboardsAreEqual) -{ - Clipboard clipboard1; - clipboard1.open(0); - clipboard1.add(Clipboard::kText, "synergy rocks!"); - clipboard1.close(); - - Clipboard clipboard2; - Clipboard::copy(&clipboard2, &clipboard1); - - clipboard2.open(0); - std::string actual = clipboard2.get(Clipboard::kText); - EXPECT_EQ("synergy rocks!", actual); -} diff --git a/src/unittests/deskflow/CMakeLists.txt b/src/unittests/deskflow/CMakeLists.txt index e2092f94a..ef19d5c2e 100644 --- a/src/unittests/deskflow/CMakeLists.txt +++ b/src/unittests/deskflow/CMakeLists.txt @@ -13,6 +13,14 @@ create_test( WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src/lib/deskflow" ) +create_test( + NAME ClipboardTests + DEPENDS app + LIBS arch base io ${extra_libs} + SOURCE ClipboardTests.cpp + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src/lib/deskflow" +) + create_test( NAME ClipboardChunksTests DEPENDS app diff --git a/src/unittests/deskflow/ClipboardTests.cpp b/src/unittests/deskflow/ClipboardTests.cpp new file mode 100644 index 000000000..e6859bc10 --- /dev/null +++ b/src/unittests/deskflow/ClipboardTests.cpp @@ -0,0 +1,232 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello + * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd. + * SPDX-FileCopyrightText: (C) 2011 Nick Bolton + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#include "ClipboardTests.h" + +#include "../../lib/deskflow/Clipboard.h" + +void ClipboardTests::initTestCase() +{ + m_arch.init(); + m_log.setFilter(kDEBUG2); +} + +void ClipboardTests::basicFunction() +{ + Clipboard clipboard; + + std::string actual = clipboard.marshall(); + // seems to return "\0\0\0\0" but EXPECT_EQ can't assert this, + // so instead, just assert that first char is '\0'. + QCOMPARE((int)actual[0], 0); + + QVERIFY(clipboard.open(0)); + QVERIFY(clipboard.empty()); + QCOMPARE(clipboard.getTime(), 0); + + clipboard.close(); + + QVERIFY(clipboard.open(1)); + QCOMPARE(clipboard.getTime(), 0); +} + +void ClipboardTests::basicText() +{ + Clipboard clipboard; + QVERIFY(clipboard.open(0)); + QVERIFY(!clipboard.has(Clipboard::kText)); + QCOMPARE(clipboard.get(IClipboard::kText), ""); + + clipboard.add(Clipboard::kText, kTestString1); + QVERIFY(clipboard.has(Clipboard::kText)); + QCOMPARE(clipboard.get(IClipboard::kText), kTestString1); + + std::string actual = clipboard.marshall(); + // string contains other data, but 8th char should be kText. + QCOMPARE(IClipboard::kText, actual[7]); + QCOMPARE((int)actual[11], kTestString1.length()); + + // // marshall closes the clipboard + QVERIFY(clipboard.open(0)); + QVERIFY(clipboard.empty()); + + clipboard.add(Clipboard::kText, kTestString2); + QCOMPARE(clipboard.get(IClipboard::kText), kTestString2); + clipboard.close(); +} + +void ClipboardTests::textSize285() +{ + std::string text; + text.append("Synergy is Free and Open Source Software that lets you "); + text.append("easily share your mouse and keyboard between multiple "); + text.append("computers, where each computer has it's own display. No "); + text.append("special hardware is required, all you need is a local area "); + text.append("network. Synergy is supported on Windows, Mac OS X and Linux."); + + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, text); + clipboard.close(); + + std::string actual = clipboard.marshall(); + + // 4 asserts here, but that's ok because we're really just asserting 1 + // thing. the 32-bit size value is split into 4 chars. if the size is 285 + // (29 more than the 8-bit max size), the last char "rolls over" to 29 + // (this is caused by a bit-wise & on 0xff and 8-bit truncation). each + // char before the last stores a bit-shifted version of the number, each + // 1 more power than the last, which is done by bit-shifting [0] by 24, + // [1] by 16, [2] by 8 ([3] is not bit-shifted). + qInfo() << actual; + QCOMPARE(actual[8], 0); // 285 >> 24 = 285 / (256^3) = 0 + QCOMPARE(actual[9], 0); // 285 >> 16 = 285 / (256^2) = 0 + QCOMPARE(actual[10], 1); // 285 >> 8 = 285 / (256^1) = 1(.11328125) + QCOMPARE(actual[11], 29); // 285 - 256 = 29 +} + +void ClipboardTests::htmlText() +{ + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kHTML, kTestString1); + clipboard.close(); + + std::string actual = clipboard.marshall(); + + // string contains other data, but 8th char should be kHTML. + QCOMPARE(IClipboard::kHTML, (int)actual[7]); +} + +void ClipboardTests::dualText() +{ + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, kTestString1); + clipboard.add(IClipboard::kHTML, kTestString2); + clipboard.close(); + + std::string actual = clipboard.marshall(); + + // the number of formats is stored inside the first 4 chars. + // the writeUInt32 function right-aligns numbers in 4 chars, + // so if you right align 2, it will be "\0\0\0\2" in a string. + // we assert that the char at the 4th index is 2 (the number of + // formats that we've added). + QCOMPARE((int)actual[3], 2); +} + +void ClipboardTests::marshalText() +{ + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, kTestString1); + clipboard.close(); + + std::string actual = clipboard.marshall(); + // string contains other data, but should end in the string we added. + QCOMPARE(actual.substr(12), kTestString1); +} + +void ClipboardTests::unMarshalText() +{ + Clipboard clipboard; + std::string data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)0; // 0 formats added + clipboard.unmarshall(data, 0); + clipboard.open(0); + + QVERIFY(!clipboard.has(IClipboard::kText)); + clipboard.close(); +} + +void ClipboardTests::unMarshalText285() +{ + Clipboard clipboard; + + std::string text; + text.append("Synergy is Free and Open Source Software that lets you "); + text.append("easily share your mouse and keyboard between multiple "); + text.append("computers, where each computer has it's own display. No "); + text.append("special hardware is required, all you need is a local area "); + text.append("network. Synergy is supported on Windows, Mac OS X and Linux."); + + std::string data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)1; // 1 format added + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kText; + data += (char)0; // 285 >> 24 = 285 / (256^3) = 0 + data += (char)0; // 285 >> 16 = 285 / (256^2) = 0 + data += (char)1; // 285 >> 8 = 285 / (256^1) = 1(.11328125) + data += (char)29; // 285 - 256 = 29 + data += text; + + clipboard.unmarshall(data, 0); + clipboard.open(0); + QCOMPARE(clipboard.get(IClipboard::kText), text); + clipboard.close(); +} + +void ClipboardTests::unMarshalTextAndHtml() +{ + Clipboard clipboard; + std::string data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)2; // 2 formats added + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kText; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)14; + data += kTestString1; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kHTML; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)10; + data += kTestString2; + + clipboard.unmarshall(data, 0); + clipboard.open(0); + QCOMPARE(clipboard.get(IClipboard::kText), kTestString1); + QCOMPARE(clipboard.get(IClipboard::kHTML), kTestString2); + clipboard.close(); +} + +void ClipboardTests::equalClipboards() +{ + Clipboard clipboard1; + clipboard1.open(0); + clipboard1.add(Clipboard::kText, kTestString1); + clipboard1.close(); + + Clipboard clipboard2; + Clipboard::copy(&clipboard2, &clipboard1); + + clipboard2.open(0); + QCOMPARE(clipboard2.get(Clipboard::kText), kTestString1); + clipboard2.close(); +} + +QTEST_MAIN(ClipboardTests) diff --git a/src/unittests/deskflow/ClipboardTests.h b/src/unittests/deskflow/ClipboardTests.h new file mode 100644 index 000000000..af3d83ef6 --- /dev/null +++ b/src/unittests/deskflow/ClipboardTests.h @@ -0,0 +1,33 @@ +/* + * 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 ClipboardTests : public QObject +{ + Q_OBJECT +private slots: + // Test are run in order top to bottom + void initTestCase(); + void basicFunction(); + void basicText(); + void textSize285(); + void htmlText(); + void dualText(); + void marshalText(); + void unMarshalText(); + void unMarshalText285(); + void unMarshalTextAndHtml(); + void equalClipboards(); + +private: + const std::string kTestString1 = "deskflow rocks"; + const std::string kTestString2 = "String 020"; + Arch m_arch; + Log m_log; +};