[Libreoffice-commits] online.git: test/helpers.hpp test/httpwstest.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Tue May 2 04:12:46 UTC 2017


 test/helpers.hpp    |   27 +++++++++++++++++++++++++++
 test/httpwstest.cpp |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)

New commits:
commit 647e5f8936b683b6ca511b967fcb35f2cd1cf463
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Apr 30 21:54:38 2017 -0400

    wsd: unittest to reproduce rendering issue in Calc
    
    The following scenario causes rendering failure
    where blank tiles are returned.
    
    1. Load doc where the cursor is saved to a top cell.
    2. Page down (typically several 100th row).
    3. Load a new view to the same doc (do nothing else).
    4. In the first view up-arrow to move cursor and invalidate.
    5. New tile is rendered incorrectly.
    
    Change-Id: I06c7627d1b74d9e3be3e83d9d9a09cb5479ba660
    Reviewed-on: https://gerrit.libreoffice.org/37129
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/test/helpers.hpp b/test/helpers.hpp
index 70bf6e4c..1b00b2e3 100644
--- a/test/helpers.hpp
+++ b/test/helpers.hpp
@@ -540,6 +540,33 @@ inline void sendText(std::shared_ptr<LOOLWebSocket>& socket, const std::string&
     }
 }
 
+inline std::vector<char> getTileAndSave(std::shared_ptr<LOOLWebSocket>& socket,
+                                        const std::string& req,
+                                        const std::string& filename,
+                                        const std::string& testname)
+{
+    std::cerr << testname << "Requesting: " << req << std::endl;
+    sendTextFrame(socket, req, testname);
+
+    const auto tile = getResponseMessage(socket, "tile:", testname);
+    std::cerr << testname << " Tile PNG size: " << tile.size() << std::endl;
+
+    const std::string firstLine = LOOLProtocol::getFirstLine(tile);
+    std::vector<char> res(tile.begin() + firstLine.size() + 1, tile.end());
+    std::stringstream streamRes;
+    std::copy(res.begin(), res.end(), std::ostream_iterator<char>(streamRes));
+
+    if (!filename.empty())
+    {
+        std::fstream outStream(filename, std::ios::out);
+        outStream.write(res.data(), res.size());
+        outStream.close();
+        std::cerr << testname << "Saved [" << firstLine << "] to [" << filename << "]" << std::endl;
+    }
+
+    return res;
+}
+
 }
 
 #endif
diff --git a/test/httpwstest.cpp b/test/httpwstest.cpp
index 917a41dd..e348a429 100644
--- a/test/httpwstest.cpp
+++ b/test/httpwstest.cpp
@@ -92,6 +92,7 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
 //    CPPUNIT_TEST(testEditAnnotationWriter);
     // FIXME CPPUNIT_TEST(testInsertAnnotationCalc);
     CPPUNIT_TEST(testCalcEditRendering);
+    CPPUNIT_TEST(testCalcRenderAfterNewView);
     CPPUNIT_TEST(testFontList);
     CPPUNIT_TEST(testStateUnoCommandWriter);
     CPPUNIT_TEST(testStateUnoCommandCalc);
@@ -146,6 +147,7 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
     void testEditAnnotationWriter();
     void testInsertAnnotationCalc();
     void testCalcEditRendering();
+    void testCalcRenderAfterNewView();
     void testFontList();
     void testStateUnoCommandWriter();
     void testStateUnoCommandCalc();
@@ -1767,6 +1769,50 @@ void HTTPWSTest::testCalcEditRendering()
     }
 }
 
+/// When a second view is loaded to a Calc doc,
+/// the first stops rendering correctly.
+/// This only happens at high rows.
+void HTTPWSTest::testCalcRenderAfterNewView()
+{
+    const auto testname = "calcRenderAfterNewView ";
+
+    // Load a doc with the cursor saved at a top row.
+    std::string documentPath, documentURL;
+    getDocumentPathAndURL("empty.ods", documentPath, documentURL, testname);
+
+    auto socket = loadDocAndGetSocket(_uri, documentURL, testname);
+
+    // Page Down until we get to the bottom of the doc.
+    for (int i = 0; i < 40; ++i)
+    {
+        sendTextFrame(socket, "key type=input char=0 key=1031", testname);
+    }
+
+    // Wait for status due to doc resize.
+    assertResponseString(socket, "status:", testname);
+
+    const auto req = "tilecombine part=0 width=256 height=256 tileposx=0 tileposy=253440 tilewidth=3840 tileheight=3840";
+
+    // Get tile.
+    const std::vector<char> tile1 = getTileAndSave(socket, req, "/tmp/calc_render_orig.png", testname);
+
+
+    // Connect second client, which will load at the top.
+    std::cerr << testname << "Connecting second client." << std::endl;
+    auto socket2 = loadDocAndGetSocket(_uri, documentURL, testname);
+
+
+    // Up one row on the first view to trigger the bug.
+    std::cerr << testname << "Up." << std::endl;
+    sendTextFrame(socket, "key type=input char=0 key=1025", testname);
+    assertResponseString(socket, "invalidatetiles:", testname); // Up invalidates.
+
+    // Get same tile again.
+    const std::vector<char> tile2 = getTileAndSave(socket, req, "/tmp/calc_render_sec.png", testname);
+
+    CPPUNIT_ASSERT(tile1 == tile2);
+}
+
 std::string HTTPWSTest::getFontList(const std::string& message)
 {
     Poco::JSON::Parser parser;


More information about the Libreoffice-commits mailing list