test/httpwstest.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+)
New commits: commit 2f81b37c076d16810ca4588db6f86a84e43d6527 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Wed Dec 21 21:22:03 2016 -0500 wsd: load torture test Load multiple views on multiple documents concurrently and verify that the number of views for each case is consistent and as expected. Change-Id: Ie550dd42880da7bdd0aef6d642e9b000be5c3f84 Reviewed-on: https://gerrit.libreoffice.org/32556 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/test/httpwstest.cpp b/test/httpwstest.cpp index 56493b3..9730f9f 100644 --- a/test/httpwstest.cpp +++ b/test/httpwstest.cpp @@ -64,6 +64,7 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture CPPUNIT_TEST(testCloseAfterClose); CPPUNIT_TEST(testConnectNoLoad); // This fails most of the times but occasionally succeeds CPPUNIT_TEST(testLoad); + CPPUNIT_TEST(testLoadTorture); CPPUNIT_TEST(testBadLoad); CPPUNIT_TEST(testReload); CPPUNIT_TEST(testGetTextSelection); @@ -107,6 +108,7 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture void testCloseAfterClose(); void testConnectNoLoad(); void testLoad(); + void testLoadTorture(); void testBadLoad(); void testReload(); void testGetTextSelection(); @@ -145,6 +147,11 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture void loadDoc(const std::string& documentURL, const std::string& testname); + void loadTorture(const std::string& docName, + const size_t thread_count, + const size_t loads_per_thread, + const size_t max_jitter_ms); + void getPartHashCodes(const std::string response, std::vector<std::string>& parts); @@ -378,6 +385,87 @@ void HTTPWSTest::testLoad() loadDoc(documentURL, "load "); } +void HTTPWSTest::loadTorture(const std::string& docName, + const size_t thread_count, + const size_t loads_per_thread, + const size_t max_jitter_ms) +{ + const auto testname = "loadTorture "; + + // Load same document from many threads together. + std::string documentPath, documentURL; + getDocumentPathAndURL(docName, documentPath, documentURL); + + const auto number_of_loads = thread_count * loads_per_thread; + const int exp_sum_view_ids = number_of_loads * (number_of_loads - 1) / 2; // 0-based view-ids. + + std::atomic<int> sum_view_ids; + sum_view_ids = 0; + + std::vector<std::thread> threads; + for (size_t i = 0; i < thread_count; ++i) + { + threads.emplace_back([&] + { + try + { + for (size_t j = 0; j < loads_per_thread; ++j) + { + // Load a document and wait for the status. + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL); + auto socket = connectLOKit(_uri, request, _response, testname); + sendTextFrame(socket, "load url=" + documentURL, testname); + + const auto status = assertResponseString(socket, "status:", testname); + int viewid = -1; + LOOLProtocol::getTokenIntegerFromMessage(status, "viewid", viewid); + sum_view_ids += viewid; + + if (max_jitter_ms > 0) + { + const auto ms = std::chrono::milliseconds(Util::rng::getNext() % max_jitter_ms); + std::this_thread::sleep_for(ms); + } + } + } + catch (const Poco::Exception& exc) + { + CPPUNIT_FAIL(exc.displayText()); + } + }); + } + + for (auto& thread : threads) + { + thread.join(); + } + + CPPUNIT_ASSERT_EQUAL(exp_sum_view_ids, sum_view_ids.load()); +} + +void HTTPWSTest::testLoadTorture() +{ + const auto thread_count = 3; + const auto loads_per_thread = 3; + const auto max_jitter_ms = 75; + + std::vector<std::string> docNames = { "setclientpart.ods", "hello.odt", "empty.ods" }; + + std::vector<std::thread> threads; + for (const auto& docName : docNames) + { + threads.emplace_back([&] + { + loadTorture(docName, thread_count, loads_per_thread, max_jitter_ms); + }); + } + + for (auto& thread : threads) + { + thread.join(); + } +} + void HTTPWSTest::testBadLoad() { try _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits