[Libreoffice-commits] online.git: 3 commits - loolwsd/LOOLSession.cpp loolwsd/LOOLSession.hpp loolwsd/test

Miklos Vajna vmiklos at collabora.co.uk
Thu Nov 19 02:13:02 PST 2015


 loolwsd/LOOLSession.cpp               |   92 +++++++++++++---------------------
 loolwsd/LOOLSession.hpp               |    3 +
 loolwsd/test/data/hide-whitespace.odt |binary
 loolwsd/test/httpwstest.cpp           |   78 ++++++++++++++++++++++++----
 4 files changed, 105 insertions(+), 68 deletions(-)

New commits:
commit 0723a96df74f9d6d6d55aa7315769d01be98fecd
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Nov 19 11:11:47 2015 +0100

    HTTPWSTest: share socket init code between tests

diff --git a/loolwsd/test/httpwstest.cpp b/loolwsd/test/httpwstest.cpp
index 35a4870..c967fff 100644
--- a/loolwsd/test/httpwstest.cpp
+++ b/loolwsd/test/httpwstest.cpp
@@ -21,6 +21,12 @@
 /// Tests the HTTP WebSocket API of loolwsd. The server has to be started manually before running this test.
 class HTTPWSTest : public CPPUNIT_NS::TestFixture
 {
+    Poco::URI _uri;
+    Poco::Net::HTTPClientSession _session;
+    Poco::Net::HTTPRequest _request;
+    Poco::Net::HTTPResponse _response;
+    Poco::Net::WebSocket _socket;
+
     CPPUNIT_TEST_SUITE(HTTPWSTest);
     CPPUNIT_TEST(testPaste);
     CPPUNIT_TEST(testRenderingOptions);
@@ -30,35 +36,38 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
     void testRenderingOptions();
 
     void sendTextFrame(Poco::Net::WebSocket& socket, const std::string& string);
+public:
+    HTTPWSTest()
+        : _uri("http://127.0.0.1:" + std::to_string(LOOLWSD::DEFAULT_CLIENT_PORT_NUMBER)),
+        _session(_uri.getHost(), _uri.getPort()),
+        _request(Poco::Net::HTTPRequest::HTTP_POST, "/ws"),
+        _socket(_session, _request, _response)
+    {
+    }
 };
 
 void HTTPWSTest::testPaste()
 {
     // Load a document and make it empty.
-    Poco::URI uri("http://127.0.0.1:" + std::to_string(LOOLWSD::DEFAULT_CLIENT_PORT_NUMBER));
-    Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
-    Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/ws");
-    Poco::Net::HTTPResponse response;
-    Poco::Net::WebSocket socket(session, request, response);
     std::string documentPath = TDOC "/hello.odt";
     std::string documentURL = "file://" + Poco::Path(documentPath).makeAbsolute().toString();
-    sendTextFrame(socket, "load url=" + documentURL);
-    sendTextFrame(socket, "uno .uno:SelectAll");
-    sendTextFrame(socket, "uno .uno:Delete");
+    sendTextFrame(_socket, "load url=" + documentURL);
+    sendTextFrame(_socket, "uno .uno:SelectAll");
+    sendTextFrame(_socket, "uno .uno:Delete");
 
     // Paste some text into it.
-    sendTextFrame(socket, "paste mimetype=text/plain;charset=utf-8 data=aaa bbb ccc");
+    sendTextFrame(_socket, "paste mimetype=text/plain;charset=utf-8 data=aaa bbb ccc");
 
     // Check if the document contains the pasted text.
-    sendTextFrame(socket, "uno .uno:SelectAll");
-    sendTextFrame(socket, "gettextselection mimetype=text/plain;charset=utf-8");
+    sendTextFrame(_socket, "uno .uno:SelectAll");
+    sendTextFrame(_socket, "gettextselection mimetype=text/plain;charset=utf-8");
     std::string selection;
     int flags;
     int n;
     do
     {
         char buffer[100000];
-        n = socket.receiveFrame(buffer, sizeof(buffer), flags);
+        n = _socket.receiveFrame(buffer, sizeof(buffer), flags);
         if (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE)
         {
             std::string line = LOOLProtocol::getFirstLine(buffer, n);
@@ -71,23 +80,18 @@ void HTTPWSTest::testPaste()
         }
     }
     while (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
-    socket.shutdown();
+    _socket.shutdown();
     CPPUNIT_ASSERT_EQUAL(std::string("aaa bbb ccc"), selection);
 }
 
 void HTTPWSTest::testRenderingOptions()
 {
     // Load a document and get its size.
-    Poco::URI uri("http://127.0.0.1:" + std::to_string(LOOLWSD::DEFAULT_CLIENT_PORT_NUMBER));
-    Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
-    Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/ws");
-    Poco::Net::HTTPResponse response;
-    Poco::Net::WebSocket socket(session, request, response);
     std::string documentPath = TDOC "/hide-whitespace.odt";
     std::string documentURL = "file://" + Poco::Path(documentPath).makeAbsolute().toString();
     std::string options = "{\"rendering\":{\".uno:HideWhitespace\":{\"type\":\"boolean\",\"value\":\"true\"}}}";
-    sendTextFrame(socket, "load url=" + documentURL + " options=" + options);
-    sendTextFrame(socket, "status");
+    sendTextFrame(_socket, "load url=" + documentURL + " options=" + options);
+    sendTextFrame(_socket, "status");
 
     std::string status;
     int flags;
@@ -95,7 +99,7 @@ void HTTPWSTest::testRenderingOptions()
     do
     {
         char buffer[100000];
-        n = socket.receiveFrame(buffer, sizeof(buffer), flags);
+        n = _socket.receiveFrame(buffer, sizeof(buffer), flags);
         if (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE)
         {
             std::string line = LOOLProtocol::getFirstLine(buffer, n);
@@ -108,7 +112,7 @@ void HTTPWSTest::testRenderingOptions()
         }
     }
     while (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
-    socket.shutdown();
+    _socket.shutdown();
     // Expected format is something like 'type=text parts=2 current=0 width=12808 height=1142'.
     Poco::StringTokenizer tokens(status, " ", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), tokens.count());
commit 7be61ec464ad16d22baf9bbeb5a4aa66a07e6fe8
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Nov 19 11:01:34 2015 +0100

    HTTPWSTest: add document rendering options testcase
    
    Fails without commit 57199a36cdc2ad802f8d7e944e6fc4ae830fab26 (loolwsd:
    route rendering options to initializeForRendering(), 2015-11-19).

diff --git a/loolwsd/test/data/hide-whitespace.odt b/loolwsd/test/data/hide-whitespace.odt
new file mode 100644
index 0000000..7fbd17b
Binary files /dev/null and b/loolwsd/test/data/hide-whitespace.odt differ
diff --git a/loolwsd/test/httpwstest.cpp b/loolwsd/test/httpwstest.cpp
index 2cb08fd..35a4870 100644
--- a/loolwsd/test/httpwstest.cpp
+++ b/loolwsd/test/httpwstest.cpp
@@ -11,6 +11,7 @@
 #include <Poco/Net/HTTPRequest.h>
 #include <Poco/Net/HTTPResponse.h>
 #include <Poco/Net/WebSocket.h>
+#include <Poco/StringTokenizer.h>
 #include <Poco/URI.h>
 #include <cppunit/extensions/HelperMacros.h>
 
@@ -22,9 +23,11 @@ class HTTPWSTest : public CPPUNIT_NS::TestFixture
 {
     CPPUNIT_TEST_SUITE(HTTPWSTest);
     CPPUNIT_TEST(testPaste);
+    CPPUNIT_TEST(testRenderingOptions);
     CPPUNIT_TEST_SUITE_END();
 
     void testPaste();
+    void testRenderingOptions();
 
     void sendTextFrame(Poco::Net::WebSocket& socket, const std::string& string);
 };
@@ -72,6 +75,51 @@ void HTTPWSTest::testPaste()
     CPPUNIT_ASSERT_EQUAL(std::string("aaa bbb ccc"), selection);
 }
 
+void HTTPWSTest::testRenderingOptions()
+{
+    // Load a document and get its size.
+    Poco::URI uri("http://127.0.0.1:" + std::to_string(LOOLWSD::DEFAULT_CLIENT_PORT_NUMBER));
+    Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
+    Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/ws");
+    Poco::Net::HTTPResponse response;
+    Poco::Net::WebSocket socket(session, request, response);
+    std::string documentPath = TDOC "/hide-whitespace.odt";
+    std::string documentURL = "file://" + Poco::Path(documentPath).makeAbsolute().toString();
+    std::string options = "{\"rendering\":{\".uno:HideWhitespace\":{\"type\":\"boolean\",\"value\":\"true\"}}}";
+    sendTextFrame(socket, "load url=" + documentURL + " options=" + options);
+    sendTextFrame(socket, "status");
+
+    std::string status;
+    int flags;
+    int n;
+    do
+    {
+        char buffer[100000];
+        n = socket.receiveFrame(buffer, sizeof(buffer), flags);
+        if (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE)
+        {
+            std::string line = LOOLProtocol::getFirstLine(buffer, n);
+            std::string prefix = "status: ";
+            if (line.find(prefix) == 0)
+            {
+                status = line.substr(prefix.length());
+                break;
+            }
+        }
+    }
+    while (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
+    socket.shutdown();
+    // Expected format is something like 'type=text parts=2 current=0 width=12808 height=1142'.
+    Poco::StringTokenizer tokens(status, " ", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), tokens.count());
+    std::string token = tokens[4];
+    std::string prefix = "height=";
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), token.find(prefix));
+    int height = std::stoi(token.substr(prefix.size()));
+    // HideWhitespace was ignored, this was 32532.
+    CPPUNIT_ASSERT(height < 10000);
+}
+
 void HTTPWSTest::sendTextFrame(Poco::Net::WebSocket& socket, const std::string& string)
 {
     socket.sendFrame(string.data(), string.size());
commit b066c91c8f8542b9348911cb714c6a82c081eefc
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Nov 19 10:30:00 2015 +0100

    loolwsd: factor out LOOLSession::parseDocOptions() from *ProcessSession

diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index efe4cf4..ff0b316 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -132,6 +132,40 @@ void LOOLSession::sendBinaryFrame(const char *buffer, int length)
         _ws->sendFrame(buffer, length, WebSocket::FRAME_BINARY);
 }
 
+void LOOLSession::parseDocOptions(const StringTokenizer& tokens, int& part, std::string& timestamp)
+{
+    // First token is the "load" command itself.
+    size_t offset = 1;
+    if (tokens.count() > 2 && tokens[1].find("part=") == 0)
+    {
+        getTokenInteger(tokens[1], "part", part);
+        ++offset;
+    }
+
+    for (size_t i = offset; i < tokens.count(); ++i)
+    {
+        if (tokens[i].find("url=") == 0)
+        {
+            _docURL = tokens[i].substr(strlen("url="));
+            ++offset;
+        }
+        else if (tokens[i].find("timestamp=") == 0)
+        {
+            timestamp = tokens[i].substr(strlen("timestamp="));
+            ++offset;
+        }
+    }
+
+    if (tokens.count() > offset)
+    {
+        if (getTokenString(tokens[offset], "options", _docOptions))
+        {
+            if (tokens.count() > offset + 1)
+                _docOptions += Poco::cat(std::string(" "), tokens.begin() + offset + 1, tokens.end());
+        }
+    }
+}
+
 std::map<Process::PID, UInt64> MasterProcessSession::_childProcesses;
 
 std::set<std::shared_ptr<MasterProcessSession>> MasterProcessSession::_availableChildSessions;
@@ -433,37 +467,8 @@ bool MasterProcessSession::loadDocument(const char* /*buffer*/, int /*length*/,
         return false;
     }
 
-    // First token is the "load" command itself.
-    size_t offset = 1;
-    if (tokens.count() > 2 && tokens[1].find("part=") == 0)
-    {
-        getTokenInteger(tokens[1], "part", _loadPart);
-        ++offset;
-    }
-
     std::string timestamp;
-    for (size_t i = offset; i < tokens.count(); ++i)
-    {
-        if (tokens[i].find("url=") == 0)
-        {
-            _docURL = tokens[i].substr(strlen("url="));
-            ++offset;
-        }
-        else if (tokens[i].find("timestamp=") == 0)
-        {
-            timestamp = tokens[i].substr(strlen("timestamp="));
-            ++offset;
-        }
-    }
-
-    if (tokens.count() > offset)
-    {
-        if (getTokenString(tokens[offset], "options", _docOptions))
-        {
-            if (tokens.count() > offset + 1)
-                _docOptions += Poco::cat(std::string(" "), tokens.begin() + offset + 1, tokens.end());
-        }
-    }
+    parseDocOptions(tokens, _loadPart, timestamp);
 
     try
     {
@@ -967,31 +972,8 @@ bool ChildProcessSession::loadDocument(const char *buffer, int length, StringTok
         return false;
     }
 
-    // First token is the "load" command itself.
-    size_t offset = 1;
-    if (tokens.count() > 2 && tokens[1].find("part=") == 0)
-    {
-        getTokenInteger(tokens[1], "part", part);
-        ++offset;
-    }
-
-    for (size_t i = offset; i < tokens.count(); ++i)
-    {
-        if (tokens[i].find("url=") == 0)
-        {
-            _docURL = tokens[i].substr(strlen("url="));
-            ++offset;
-        }
-    }
-
-    if (tokens.count() > offset)
-    {
-        if (getTokenString(tokens[offset], "options", _docOptions))
-        {
-            if (tokens.count() > offset + 1)
-                _docOptions += Poco::cat(std::string(" "), tokens.begin() + offset + 1, tokens.end());
-        }
-    }
+    std::string timestamp;
+    parseDocOptions(tokens, part, timestamp);
 
     URI aUri;
     try
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index 4dbb1cf..b807cab 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -64,6 +64,9 @@ protected:
 
     void sendBinaryFrame(const char *buffer, int length);
 
+    /// Parses the options of the "load" command, shared between MasterProcessSession::loadDocument() and ChildProcessSession::loadDocument().
+    void parseDocOptions(const Poco::StringTokenizer& tokens, int& part, std::string& timestamp);
+
     virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
 
     virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;


More information about the Libreoffice-commits mailing list