[Libreoffice-commits] online.git: test/httpwstest.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Sun Jan 1 04:23:41 UTC 2017
test/httpwstest.cpp | 107 +++++++++++++++++++++++++++++++++-------------------
1 file changed, 69 insertions(+), 38 deletions(-)
New commits:
commit 8a20e3b26509d33d7d18c3bf5696c56b94d883cf
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sun Dec 25 16:21:53 2016 -0500
wsd: load torture test made more stable
Change-Id: Icc1890480d7d5539dd3b855dfb775909d78a2e82
Reviewed-on: https://gerrit.libreoffice.org/32565
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/test/httpwstest.cpp b/test/httpwstest.cpp
index 4cfed98..066a5b7 100644
--- a/test/httpwstest.cpp
+++ b/test/httpwstest.cpp
@@ -34,7 +34,6 @@
#include <Poco/RegularExpression.h>
#include <Poco/StreamCopier.h>
#include <Poco/StringTokenizer.h>
-#include <Poco/Thread.h>
#include <Poco/URI.h>
#include <cppunit/extensions/HelperMacros.h>
@@ -156,7 +155,6 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
int loadTorture(const std::string& testname,
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,
@@ -393,10 +391,9 @@ void HTTPWSTest::testLoad()
}
int HTTPWSTest::loadTorture(const std::string& testname,
- const std::string& docName,
- const size_t thread_count,
- const size_t loads_per_thread,
- const size_t max_jitter_ms)
+ const std::string& docName,
+ const size_t thread_count,
+ const size_t max_jitter_ms)
{
// Load same document from many threads together.
std::string documentPath, documentURL;
@@ -404,43 +401,81 @@ int HTTPWSTest::loadTorture(const std::string& testname,
std::atomic<int> sum_view_ids;
sum_view_ids = 0;
+ std::atomic<int> num_of_views(0);
+ std::atomic<int> num_to_load(thread_count);
std::vector<std::thread> threads;
for (size_t i = 0; i < thread_count; ++i)
{
threads.emplace_back([&]
{
+ std::ostringstream oss;
+ oss << std::hex << std::this_thread::get_id();
+ const std::string id = oss.str();
+
+ std::cerr << testname << ": #" << id << ", views: " << num_of_views << ", to load: " << num_to_load << std::endl;
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);
+ Poco::Net::HTTPResponse response;
+ 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;
+ ++num_of_views;
+ --num_to_load;
+
+ std::cerr << testname << ": #" << id << ", loaded views: " << num_of_views << ", to load: " << num_to_load << std::endl;
+
+ while (true)
{
- // 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);
+ if (num_to_load == 0)
+ {
+ // Unload at once, nothing more left to do.
+ std::cerr << testname << ": #" << id << ", no more to load, unloading." << std::endl;
+ break;
+ }
- const auto status = assertResponseString(socket, "status:", testname);
- int viewid = -1;
- LOOLProtocol::getTokenIntegerFromMessage(status, "viewid", viewid);
- sum_view_ids += viewid;
+ const auto ms = (max_jitter_ms > 0
+ ? std::chrono::milliseconds(Util::rng::getNext() % max_jitter_ms)
+ : std::chrono::milliseconds(0));
+ std::this_thread::sleep_for(ms);
- if (max_jitter_ms > 0)
+ // Unload only when we aren't the last/only.
+ if (--num_of_views > 0)
{
- const auto ms = std::chrono::milliseconds(Util::rng::getNext() % max_jitter_ms);
- std::this_thread::sleep_for(ms);
+ std::cerr << testname << ": #" << id << ", views: " << num_of_views << " not the last/only, unloading." << std::endl;
+ break;
+ }
+ else
+ {
+ // Correct back, since we aren't unloading just yet.
+ ++num_of_views;
}
}
}
- catch (const Poco::Exception& exc)
+ catch (const std::exception& exc)
{
- CPPUNIT_FAIL(exc.displayText());
+ std::cerr << testname << ": #" << id << ", Exception: " << exc.what() << std::endl;
+ --num_to_load;
}
});
}
for (auto& thread : threads)
{
- thread.join();
+ try
+ {
+ thread.join();
+ }
+ catch (const std::exception& exc)
+ {
+ std::cerr << testname << ": Exception: " << exc.what() << std::endl;
+ }
}
return sum_view_ids;
@@ -448,53 +483,49 @@ int HTTPWSTest::loadTorture(const std::string& testname,
void HTTPWSTest::testLoadTortureODT()
{
- const auto thread_count = 3;
- const auto loads_per_thread = 2;
+ const auto thread_count = 6;
const auto max_jitter_ms = 100;
const auto testname = "loadTortureODT ";
- const auto sum_view_ids = loadTorture(testname, "empty.odt", thread_count, loads_per_thread, max_jitter_ms);
+ const auto sum_view_ids = loadTorture(testname, "empty.odt", thread_count, max_jitter_ms);
// This only works when the first view-ID is 0 and increments monotonously.
- const auto number_of_loads = thread_count * loads_per_thread;
+ const auto number_of_loads = thread_count;
const int exp_sum_view_ids = number_of_loads * (number_of_loads - 1) / 2; // 0-based view-ids.
CPPUNIT_ASSERT_EQUAL(exp_sum_view_ids, sum_view_ids);
}
void HTTPWSTest::testLoadTortureODS()
{
- const auto thread_count = 2;
- const auto loads_per_thread = 2;
- const auto max_jitter_ms = 75;
+ const auto thread_count = 6;
+ const auto max_jitter_ms = 100;
const auto testname = "loadTortureODS ";
- const auto sum_view_ids = loadTorture(testname, "empty.ods", thread_count, loads_per_thread, max_jitter_ms);
+ const auto sum_view_ids = loadTorture(testname, "empty.ods", thread_count, max_jitter_ms);
// This only works when the first view-ID is 0 and increments monotonously.
- const auto number_of_loads = thread_count * loads_per_thread;
+ const auto number_of_loads = thread_count;
const int exp_sum_view_ids = number_of_loads * (number_of_loads - 1) / 2; // 0-based view-ids.
CPPUNIT_ASSERT_EQUAL(exp_sum_view_ids, sum_view_ids);
}
void HTTPWSTest::testLoadTortureODP()
{
- const auto thread_count = 2;
- const auto loads_per_thread = 2;
- const auto max_jitter_ms = 75;
+ const auto thread_count = 6;
+ const auto max_jitter_ms = 100;
const auto testname = "loadTortureODP ";
- const auto sum_view_ids = loadTorture(testname, "empty.odp", thread_count, loads_per_thread, max_jitter_ms);
+ const auto sum_view_ids = loadTorture(testname, "empty.odp", thread_count, max_jitter_ms);
// For ODP the view-id is always odd, and we expect not to skip any ids.
- const auto number_of_loads = thread_count * loads_per_thread;
+ const auto number_of_loads = thread_count;
const int exp_sum_view_ids = number_of_loads * number_of_loads; // Odd view-ids only.
CPPUNIT_ASSERT_EQUAL(exp_sum_view_ids, sum_view_ids);
}
void HTTPWSTest::testLoadTorture()
{
- const auto thread_count = 1;
- const auto loads_per_thread = 1;
+ const auto thread_count = 3;
const auto max_jitter_ms = 75;
std::vector<std::string> docNames = { "setclientpart.ods", "hello.odt", "viewcursor.odp" };
@@ -505,7 +536,7 @@ void HTTPWSTest::testLoadTorture()
threads.emplace_back([&]
{
const auto testname = "loadTorture_" + docName + ' ';
- loadTorture(testname, docName, thread_count, loads_per_thread, max_jitter_ms);
+ loadTorture(testname, docName, thread_count, max_jitter_ms);
});
}
More information about the Libreoffice-commits
mailing list