loolwsd/test/TileCacheTests.cpp | 172 ++++++++++++++++++++++++++++++++++++++++ loolwsd/test/data/empty.odg |binary loolwsd/test/data/empty.odp |binary loolwsd/test/data/empty.ods |binary loolwsd/test/data/empty.odt |binary loolwsd/test/helpers.hpp | 60 +++++++++++++ 6 files changed, 232 insertions(+)
New commits: commit 9ef285cc3363b20bb87aa88bbffdd6a4f46c50fa Author: Mike Kaganski <mike.kagan...@collabora.com> Date: Thu May 12 19:23:37 2016 +1000 loolwsd unit test: invalidate tiles while typing This test simulates characters and combined characters being typed to loolwsd, and verifies that each causes tile(s) invaliations Change-Id: I670659de3a9eb71e94c366c96e69e6efd4338c38 Reviewed-on: https://gerrit.libreoffice.org/24928 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/test/TileCacheTests.cpp b/loolwsd/test/TileCacheTests.cpp index 7dac6b3..c7a70d7 100644 --- a/loolwsd/test/TileCacheTests.cpp +++ b/loolwsd/test/TileCacheTests.cpp @@ -40,6 +40,8 @@ class TileCacheTests : public CPPUNIT_NS::TestFixture CPPUNIT_TEST(testSimultaneousTilesRenderedJustOnce); #endif CPPUNIT_TEST(testLoad12ods); + CPPUNIT_TEST(testTileInvalidateWriter); + CPPUNIT_TEST(testTileInvalidateCalc); CPPUNIT_TEST_SUITE_END(); @@ -51,6 +53,9 @@ class TileCacheTests : public CPPUNIT_NS::TestFixture void testClientPartCalc(); void testSimultaneousTilesRenderedJustOnce(); void testLoad12ods(); + void testTileInvalidateWriter(); + void testWriterAnyKey(); + void testTileInvalidateCalc(); void checkTiles(Poco::Net::WebSocket& socket, const std::string& type); @@ -544,6 +549,173 @@ void TileCacheTests::checkBlackTiles(Poco::Net::WebSocket& socket, const int /*p #endif } +void TileCacheTests::testTileInvalidateWriter() +{ + std::string documentPath, documentURL; + getDocumentPathAndURL("empty.odt", documentPath, documentURL); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL); + + auto socket = *loadDocAndGetSocket(_uri, documentURL); + + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !getResponseMessage(socket, "invalidatetiles:").empty()); + + std::string text = "Test. Now go 3 \"Enters\":\n\n\nNow after the enters, goes this text"; + for (char ch : text) + { + sendChar(socket, ch); // Send ordinary characters and wait for response -> one tile invalidation for each + auto response = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response.empty()); + } + + text = "\n\n\n"; + for (char ch : text) + { + sendChar(socket, ch, skCtrl); // Send 3 Ctrl+Enter -> 3 new pages; I see 3 tiles invalidated for each + assertResponseLine(socket, "invalidatetiles:"); + assertResponseLine(socket, "invalidatetiles:"); + assertResponseLine(socket, "invalidatetiles:"); + } + + text = "abcde"; + for (char ch : text) + { + sendChar(socket, ch); + auto response = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response.empty()); + } + + CPPUNIT_ASSERT_MESSAGE("received unexpected invalidatetiles: message", getResponseMessage(socket, "invalidatetiles:").empty()); + + // TODO: implement a random-sequence "monkey test" +} + +// This isn't yet used +void TileCacheTests::testWriterAnyKey() +{ + std::string documentPath, documentURL; + getDocumentPathAndURL("empty.odt", documentPath, documentURL); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL); + + auto socket = *loadDocAndGetSocket(_uri, documentURL); + + // Now test "usual" keycodes (TODO: whole 32-bit range) + for (int i=0; i<0x1000; ++i) + { + std::stringstream ss("Keycode "); + ss << i; + auto s = ss.str(); + std::stringstream fn("saveas url="); + fn << documentURL << i << ".odt format= options="; + auto f = fn.str(); + + const int istart = 474; + sendText(socket, "\n"+s+"\n"); + sendKeyEvent(socket, "input", 0, i); + sendKeyEvent(socket, "up", 0, i); + sendText(socket, "\nEnd "+s+"\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Shift:\n"); + sendKeyEvent(socket, "input", 0, i|skShift); + sendKeyEvent(socket, "up", 0, i|skShift); + sendText(socket, "\nEnd "+s+" With Shift\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Ctrl:\n"); + sendKeyEvent(socket, "input", 0, i|skCtrl); + sendKeyEvent(socket, "up", 0, i|skCtrl); + sendText(socket, "\nEnd "+s+" With Ctrl\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Alt:\n"); + sendKeyEvent(socket, "input", 0, i|skAlt); + sendKeyEvent(socket, "up", 0, i|skAlt); + sendText(socket, "\nEnd "+s+" With Alt\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Shift+Ctrl:\n"); + sendKeyEvent(socket, "input", 0, i|skShift|skCtrl); + sendKeyEvent(socket, "up", 0, i|skShift|skCtrl); + sendText(socket, "\nEnd "+s+" With Shift+Ctrl\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Shift+Alt:\n"); + sendKeyEvent(socket, "input", 0, i|skShift|skAlt); + sendKeyEvent(socket, "up", 0, i|skShift|skAlt); + sendText(socket, "\nEnd "+s+" With Shift+Alt\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Ctrl+Alt:\n"); + sendKeyEvent(socket, "input", 0, i|skCtrl|skAlt); + sendKeyEvent(socket, "up", 0, i|skCtrl|skAlt); + sendText(socket, "\nEnd "+s+" With Ctrl+Alt\n"); + if (i>=istart) + sendTextFrame(socket, f); + + sendText(socket, "\n"+s+" With Shift+Ctrl+Alt:\n"); + sendKeyEvent(socket, "input", 0, i|skShift|skCtrl|skAlt); + sendKeyEvent(socket, "up", 0, i|skShift|skCtrl|skAlt); + sendText(socket, "\nEnd "+s+" With Shift+Ctrl+Alt\n"); + + if (i>=istart) + sendTextFrame(socket, f); + + // This is to allow server to process the input, and check that everything is still OK + sendTextFrame(socket, "status"); + getResponseMessage(socket, "status:"); + } + // sendTextFrame(socket, "saveas url=file:///tmp/emptyempty.odt format= options="); +} + +void TileCacheTests::testTileInvalidateCalc() +{ + std::string documentPath, documentURL; + getDocumentPathAndURL("empty.ods", documentPath, documentURL); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL); + + auto socket = *loadDocAndGetSocket(_uri, documentURL); + + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !getResponseMessage(socket, "invalidatetiles:").empty()); + + std::string text = "Test. Now go 3 \"Enters\":\n\n\nNow after the enters, goes this text"; + for (char ch : text) + { + sendChar(socket, ch); // Send ordinary characters -> one tile invalidation for each + auto response = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response.empty()); + } + + text = "\n\n\n"; + for (char ch : text) + { + sendChar(socket, ch, skCtrl); // Send 3 Ctrl+Enter -> 3 new pages; I see 3 tiles invalidated for each + auto response1 = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response1.empty()); + auto response2 = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response2.empty()); + auto response3 = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response3.empty()); + } + + text = "abcde"; + for (char ch : text) + { + sendChar(socket, ch); + auto response = getResponseMessage(socket, "invalidatetiles:"); + CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response.empty()); + } + + CPPUNIT_ASSERT_MESSAGE("received unexpected invalidatetiles: message", getResponseMessage(socket, "invalidatetiles:").empty()); + + socket.shutdown(); +} + void TileCacheTests::checkTiles(Poco::Net::WebSocket& socket, const std::string& docType) { const std::string current = "current="; diff --git a/loolwsd/test/data/empty.odg b/loolwsd/test/data/empty.odg new file mode 100755 index 0000000..b7dfa67 Binary files /dev/null and b/loolwsd/test/data/empty.odg differ diff --git a/loolwsd/test/data/empty.odp b/loolwsd/test/data/empty.odp new file mode 100755 index 0000000..5f4840e Binary files /dev/null and b/loolwsd/test/data/empty.odp differ diff --git a/loolwsd/test/data/empty.ods b/loolwsd/test/data/empty.ods new file mode 100755 index 0000000..86414ec Binary files /dev/null and b/loolwsd/test/data/empty.ods differ diff --git a/loolwsd/test/data/empty.odt b/loolwsd/test/data/empty.odt new file mode 100755 index 0000000..6b07475 Binary files /dev/null and b/loolwsd/test/data/empty.odt differ diff --git a/loolwsd/test/helpers.hpp b/loolwsd/test/helpers.hpp index eec98ac..54fac74 100644 --- a/loolwsd/test/helpers.hpp +++ b/loolwsd/test/helpers.hpp @@ -468,6 +468,66 @@ std::vector<char> getTileMessage(Poco::Net::WebSocket& ws, const std::string& na return std::vector<char>(); } +enum SpecialKey { skNone=0, skShift=0x1000, skCtrl=0x2000, skAlt=0x4000 }; + +inline int getCharChar(char ch, SpecialKey specialKeys) +{ + // Some primitive code just suitable to basic needs of specific test. + // TODO: improve as appropriate. + if (specialKeys & (skCtrl | skAlt)) + return 0; + + switch (ch) + { + case '\x0a': // Enter + return 13; + default: + return ch; + } +} + +inline int getCharKey(char ch, SpecialKey specialKeys) +{ + // Some primitive code just suitable to basic needs of specific test. + // TODO: improve as appropriate. + int result; + switch (ch) + { + case '\x0a': // Enter + result = 1280; + break; + default: + result = ch; + } + return result | specialKeys; +} + +inline void sendKeyEvent(Poco::Net::WebSocket& socket, const char* type, int chr, int key) +{ + std::ostringstream ssIn; + ssIn << "key type=" << type << " char=" << chr << " key=" << key; + sendTextFrame(socket, ssIn.str()); +} + +inline void sendKeyPress(Poco::Net::WebSocket& socket, int chr, int key) +{ + sendKeyEvent(socket, "input", chr, key); + sendKeyEvent(socket, "up", chr, key); +} + +inline void sendChar(Poco::Net::WebSocket& socket, char ch, SpecialKey specialKeys=skNone) +{ + sendKeyPress(socket, getCharChar(ch, specialKeys), getCharKey(ch, specialKeys)); +} + +inline void sendText(Poco::Net::WebSocket& socket, const std::string& text) +{ + for (char ch : text) + { + sendChar(socket, ch); + } +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits