[Libreoffice-commits] online.git: loolwsd/test

Henry Castro hcastro at collabora.com
Wed Apr 27 17:50:23 UTC 2016


 loolwsd/test/data/setclientpart.odp |binary
 loolwsd/test/httpwstest.cpp         |  199 ++++++++++++++++++++++++++++++++++++
 2 files changed, 199 insertions(+)

New commits:
commit 33eff1fe313d50d68f95b7b872b52fd30443903b
Author: Henry Castro <hcastro at collabora.com>
Date:   Wed Apr 27 13:51:23 2016 -0400

    loolwsd: test: add testClientPartImpress

diff --git a/loolwsd/test/data/setclientpart.odp b/loolwsd/test/data/setclientpart.odp
new file mode 100644
index 0000000..6f42778
Binary files /dev/null and b/loolwsd/test/data/setclientpart.odp differ
diff --git a/loolwsd/test/httpwstest.cpp b/loolwsd/test/httpwstest.cpp
index e2a46eb..ce8c9b6 100644
--- a/loolwsd/test/httpwstest.cpp
+++ b/loolwsd/test/httpwstest.cpp
@@ -71,6 +71,7 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
     CPPUNIT_TEST(testPasswordProtectedDocumentWithCorrectPassword);
     CPPUNIT_TEST(testPasswordProtectedDocumentWithCorrectPasswordAgain);
     CPPUNIT_TEST(testInsertDelete);
+    CPPUNIT_TEST(testClientPartImpress);
 #if ENABLE_DEBUG
     CPPUNIT_TEST(testSimultaneousTilesRenderedJustOnce);
 #endif
@@ -98,6 +99,7 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
     void testPasswordProtectedDocumentWithCorrectPassword();
     void testPasswordProtectedDocumentWithCorrectPasswordAgain();
     void testInsertDelete();
+    void testClientPartImpress();
     void testSimultaneousTilesRenderedJustOnce();
     void testNoExtraLoolKitsLeft();
 
@@ -115,6 +117,14 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
                             std::string& response,
                             const bool isLine);
 
+    void requestTiles(Poco::Net::WebSocket& socket,
+                      const int part,
+                      const int docWidth,
+                      const int docHeight);
+
+    void getTileMessage(Poco::Net::WebSocket& ws,
+                        std::string& tile);
+
     void getPartHashCodes(const std::string response,
                           std::vector<std::string>& parts);
 
@@ -1022,6 +1032,103 @@ void HTTPWSTest::testInsertDelete()
     }
 }
 
+void HTTPWSTest::testClientPartImpress()
+{
+    try
+    {
+        const std::string current = "current=";
+        const std::string height = "height=";
+        const std::string parts = "parts=";
+        const std::string type = "type=";
+        const std::string width = "width=";
+
+        int currentPart = -1;
+        int totalParts = 0;
+        int docHeight = 0;
+        int docWidth = 0;
+
+        std::string response;
+        std::string text;
+
+        std::vector<std::string> partHashs;
+
+        // Load a document
+        const std::string documentPath = Util::getTempFilePath(TDOC, "setclientpart.odp");
+        const std::string documentURL = "file://" + Poco::Path(documentPath).makeAbsolute().toString();
+
+        Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL);
+        Poco::Net::WebSocket socket = *connectLOKit(request, _response);
+
+        sendTextFrame(socket, "load url=" + documentURL);
+        CPPUNIT_ASSERT_MESSAGE("cannot load the document " + documentURL, isDocumentLoaded(socket));
+
+        // check total slides 10
+        getResponseMessage(socket, "status:", response, false);
+        CPPUNIT_ASSERT_MESSAGE("did not receive a status: message as expected", !response.empty());
+        {
+            std::cout << "status: " << response << std::endl;
+            Poco::StringTokenizer tokens(response, " ", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+            CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), tokens.count());
+
+            // Expected format is something like 'type= parts= current= width= height='.
+            text = tokens[0].substr(type.size());
+            totalParts = std::stoi(tokens[1].substr(parts.size()));
+            currentPart = std::stoi(tokens[2].substr(current.size()));
+            docWidth = std::stoi(tokens[3].substr(width.size()));
+            docHeight = std::stoi(tokens[4].substr(height.size()));
+            CPPUNIT_ASSERT_EQUAL(std::string("presentation"), text);
+            CPPUNIT_ASSERT_EQUAL(10, totalParts);
+            CPPUNIT_ASSERT(currentPart > -1);
+            CPPUNIT_ASSERT(docWidth > 0);
+            CPPUNIT_ASSERT(docHeight > 0);
+        }
+
+        // first full invalidation
+        getResponseMessage(socket, "invalidatetiles:", response, true);
+        CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response.empty());
+        {
+            Poco::StringTokenizer tokens(response, ":", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+            CPPUNIT_ASSERT_EQUAL(std::string("EMPTY"), tokens[0]);
+        }
+
+        // request tiles
+        requestTiles(socket, currentPart, docWidth, docHeight);
+
+        // random setclientpart
+        std::srand(std::time(0));
+        std::vector<int> vParts = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+        std::random_shuffle (vParts.begin(), vParts.end());
+        for (auto it : vParts)
+        {
+            if (currentPart != it)
+            {
+                // change part
+                text = Poco::format("setclientpart part=%d", it);
+                std::cout << text << std::endl;
+                sendTextFrame(socket, text);
+
+                // get full invalidation
+                getResponseMessage(socket, "invalidatetiles:", response, true);
+                CPPUNIT_ASSERT_MESSAGE("did not receive a invalidatetiles: message as expected", !response.empty());
+                {
+                    Poco::StringTokenizer tokens(response, ":", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+                    CPPUNIT_ASSERT_EQUAL(std::string("EMPTY"), tokens[0]);
+                }
+                requestTiles(socket, it, docWidth, docHeight);
+            }
+            currentPart = it;
+        }
+
+        socket.shutdown();
+        Util::removeFile(documentPath);
+    }
+    catch (const Poco::Exception& exc)
+    {
+        CPPUNIT_FAIL(exc.displayText());
+    }
+}
+
+
 void HTTPWSTest::testSimultaneousTilesRenderedJustOnce()
 {
     const std::string documentPath = Util::getTempFilePath(TDOC, "hello.odt");
@@ -1174,6 +1281,98 @@ void HTTPWSTest::getResponseMessage(Poco::Net::WebSocket& ws, const std::string&
     }
 }
 
+void HTTPWSTest::requestTiles(Poco::Net::WebSocket& socket, const int part, const int docWidth, const int docHeight)
+{
+    // twips
+    const int tileSize = 3840;
+    // pixel
+    const int pixTileSize = 256;
+
+    int rows;
+    int cols;
+    int tileX;
+    int tileY;
+    int tileWidth;
+    int tileHeight;
+
+    std::string text;
+    std::string tile;
+
+    rows = docHeight / tileSize;
+    cols = docWidth / tileSize;
+    for (int itRow = 0; itRow < rows; ++itRow)
+    {
+        for (int itCol = 0; itCol < cols; ++itCol)
+        {
+            tileWidth = tileSize;
+            tileHeight = tileSize;
+            tileX = tileSize * itCol;
+            tileY = tileSize * itRow;
+            text = Poco::format("tile part=%d width=%d height=%d tileposx=%d tileposy=%d tilewidth=%d tileheight=%d",
+                    part, pixTileSize, pixTileSize, tileX, tileY, tileWidth, tileHeight);
+
+            sendTextFrame(socket, text);
+            getTileMessage(socket, tile);
+            // expected tile: part= width= height= tileposx= tileposy= tilewidth= tileheight=
+            Poco::StringTokenizer tokens(tile, " ", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+            CPPUNIT_ASSERT_EQUAL(std::string("tile:"), tokens[0]);
+            CPPUNIT_ASSERT_EQUAL(part, std::stoi(tokens[1].substr(std::string("part=").size())));
+            CPPUNIT_ASSERT_EQUAL(pixTileSize, std::stoi(tokens[2].substr(std::string("width=").size())));
+            CPPUNIT_ASSERT_EQUAL(pixTileSize, std::stoi(tokens[3].substr(std::string("height=").size())));
+            CPPUNIT_ASSERT_EQUAL(tileX, std::stoi(tokens[4].substr(std::string("tileposx=").size())));
+            CPPUNIT_ASSERT_EQUAL(tileY, std::stoi(tokens[5].substr(std::string("tileposy=").size())));
+            CPPUNIT_ASSERT_EQUAL(tileWidth, std::stoi(tokens[6].substr(std::string("tileWidth=").size())));
+            CPPUNIT_ASSERT_EQUAL(tileHeight, std::stoi(tokens[7].substr(std::string("tileHeight=").size())));
+        }
+    }
+}
+
+void HTTPWSTest::getTileMessage(Poco::Net::WebSocket& ws, std::string& tile)
+{
+    int flags;
+    int bytes;
+    int size = 0;
+    int retries = 10;
+    const Poco::Timespan waitTime(1000000);
+
+    ws.setReceiveTimeout(0);
+    std::cout << "==> getTileMessage\n";
+    tile.clear();
+    do
+    {
+        std::vector<char> payload(READ_BUFFER_SIZE * 100);
+        if (retries > 0 && ws.poll(waitTime, Poco::Net::Socket::SELECT_READ))
+        {
+            bytes = ws.receiveFrame(payload.data(), payload.capacity(), flags);
+            payload.resize(bytes > 0 ? bytes : 0);
+            std::cout << "Got " << bytes << " bytes, flags: " << std::bitset<8>(flags) << '\n';
+            if (bytes > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE)
+            {
+                tile = LOOLProtocol::getFirstLine(payload.data(), bytes);
+                std::cout << "message: " << tile << '\n';
+                Poco::StringTokenizer tokens(tile, " ", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+                if (tokens.count() == 2 &&
+                    tokens[0] == "nextmessage:" &&
+                    LOOLProtocol::getTokenInteger(tokens[1], "size", size) &&
+                    size > 0)
+                {
+                    payload.resize(size);
+                    bytes = ws.receiveFrame(payload.data(), size, flags);
+                    tile = LOOLProtocol::getFirstLine(payload.data(), bytes);
+                    break;
+                }
+            }
+            retries = 10;
+        }
+        else
+        {
+            std::cout << "Timeout\n";
+            --retries;
+        }
+    }
+    while (retries > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
+}
+
 int countLoolKitProcesses()
 {
     // Give polls in the lool processes time to time out etc


More information about the Libreoffice-commits mailing list