[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-4-0' - test/helpers.hpp test/UnitHTTP.cpp
Michael Meeks (via logerrit)
logerrit at kemper.freedesktop.org
Thu Jun 13 08:16:27 UTC 2019
test/UnitHTTP.cpp | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
test/helpers.hpp | 23 ++++++++-
2 files changed, 151 insertions(+), 7 deletions(-)
New commits:
commit e423bd10f5eeee9b3b052b2b6028c63409be15e4
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Wed May 22 10:54:36 2019 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Thu Jun 13 10:16:09 2019 +0200
tests for chunked transfer encoding parser.
Change-Id: Ic55669ab7cc55bb44e8f7a00f30231b44f10535a
Reviewed-on: https://gerrit.libreoffice.org/72749
Reviewed-by: Andras Timar <andras.timar at collabora.com>
Tested-by: Andras Timar <andras.timar at collabora.com>
diff --git a/test/UnitHTTP.cpp b/test/UnitHTTP.cpp
index d0530fe10..e86593f22 100644
--- a/test/UnitHTTP.cpp
+++ b/test/UnitHTTP.cpp
@@ -13,6 +13,7 @@
#include <helpers.hpp>
#include <Poco/Util/Application.h>
+#include <Poco/Net/StreamSocket.h>
#include <Poco/Net/StringPartSource.h>
#include <Poco/Net/HTMLForm.h>
#include <Poco/Net/HTTPRequest.h>
@@ -37,9 +38,9 @@ public:
config.setBool("ssl.enable", true);
}
- // FIXME: can hook with (UnitWSD::get().handleHttpRequest(request, message, socket)) ...
- void invokeTest() override
+ void testContinue()
{
+ std::cerr << "testContinue\n";
for (int i = 0; i < 3; ++i)
{
std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(Poco::URI(helpers::getTestServerURI())));
@@ -81,9 +82,135 @@ public:
return;
}
}
- // Give those convertors time to save and cleanup.
- std::this_thread::sleep_for(std::chrono::milliseconds(1000));
+ }
+
+ void writeString(const std::shared_ptr<Poco::Net::StreamSocket> &socket, std::string str)
+ {
+ socket->sendBytes(str.c_str(), str.size());
+ }
+
+ bool expectString(const std::shared_ptr<Poco::Net::StreamSocket> &socket, std::string str)
+ {
+ char buffer[str.size() + 64] = { 0, };
+ int got = socket->receiveBytes(buffer, str.size());
+ if (got != (int)str.size() ||
+ strncmp(buffer, str.c_str(), got))
+ {
+ std::cerr << "testChunks got " << got << " mismatching strings '" << buffer << " vs. expected '" << str << "'\n";
+ exitTest(TestResult::Failed);
+ return false;
+ }
+ else
+ return true;
+ }
+
+ void testChunks()
+ {
+ std::cerr << "testChunks\n";
+
+ std::shared_ptr<Poco::Net::StreamSocket> socket = helpers::createRawSocket();
+
+ writeString(
+ socket,
+ "POST /lool/convert-to/txt HTTP/1.1\r\n"
+ "Host: localhost:9980\r\n"
+ "User-Agent: looltests/1.2.3\r\n"
+ "Accept: */*\r\n"
+ "Expect: 100-continue\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "Content-Type: multipart/form-data; "
+ "boundary=------------------------5a0cd5c881663db4\r\n\r\n");
+ if (!expectString(
+ socket,
+ "HTTP/1.1 100 Continue\r\n\r\n"))
+ return;
+
+#define START_CHUNK_HEX(len) len "\r\n"
+#define END_CHUNK "\r\n"
+ writeString(
+ socket,
+ START_CHUNK_HEX("8A")
+ "--------------------------5a0cd5c881663db4\r\n"
+ "Content-Disposition: form-data; name=\"data\"; filename=\"test.txt\"\r\n"
+ "Content-Type: text/plain\r\n"
+ "\r\n"
+ END_CHUNK
+
+ START_CHUNK_HEX("12")
+ "This is some text."
+ END_CHUNK
+
+ START_CHUNK_HEX("1")
+ "\n"
+ END_CHUNK
+
+ " 4 room:for expansion!! cf. leading spaces and nasies <>!\"\'?=)\r\n"
+ "And "
+ END_CHUNK
+
+ START_CHUNK_HEX("1")
+ "s"
+ END_CHUNK
+
+ START_CHUNK_HEX("a")
+ "ome more.\n"
+ END_CHUNK
+ );
+ writeString(
+ socket,
+ START_CHUNK_HEX("30")
+ "\r\n"
+ "--------------------------5a0cd5c881663db4--\r\n"
+ END_CHUNK);
+
+ writeString(socket, START_CHUNK_HEX("0"));
+
+ char buffer[4096] = { 0, };
+ int got = socket->receiveBytes(buffer, 4096);
+ std::string start =
+ "HTTP/1.0 200 OK\r\n"
+ "Content-Disposition: attachment; filename=\"test.txt\"\r\n";
+
+ if (strncmp(buffer, start.c_str(), start.size()))
+ {
+ std::cerr << "missing pre-amble " << got << " '" << buffer << " vs. expected '" << start << "'\n";
+ exitTest(TestResult::Failed);
+ return;
+ }
+ // TODO: check content-length etc.
+
+ const char *ptr = strstr(buffer, "\r\n\r\n");
+ if (!ptr)
+ {
+ std::cerr << "missing separator " << got << " '" << buffer << "\n";
+ exitTest(TestResult::Failed);
+ return;
+ }
+
+ // Oddly we need another read to get the content.
+ got = socket->receiveBytes(buffer, 4096);
+ if (got >=0 )
+ buffer[got] = '\0';
+ else
+ {
+ std::cerr << "No content returned " << got << "\n";
+ exitTest(TestResult::Failed);
+ return;
+ }
+
+ if (strcmp(buffer, "\357\273\277This is some text.\nAnd some more.\n"))
+ {
+ std::cerr << "unexpected file content " << got << " '" << buffer << "\n";
+ exitTest(TestResult::Failed);
+ return;
+ }
+ }
+
+ void invokeTest() override
+ {
+ testChunks();
+ testContinue();
std::cerr << "All tests passed.\n";
exitTest(TestResult::Ok);
}
diff --git a/test/helpers.hpp b/test/helpers.hpp
index 13b351762..50aadada7 100644
--- a/test/helpers.hpp
+++ b/test/helpers.hpp
@@ -21,6 +21,8 @@
#include <Poco/Net/HTTPResponse.h>
#include <Poco/Net/HTTPSClientSession.h>
#include <Poco/Net/NetException.h>
+#include <Poco/Net/StreamSocket.h>
+#include <Poco/Net/SecureStreamSocket.h>
#include <Poco/Net/Socket.h>
#include <Poco/Path.h>
#include <Poco/StringTokenizer.h>
@@ -166,18 +168,33 @@ Poco::Net::HTTPClientSession* createSession(const Poco::URI& uri)
#endif
}
-inline
-std::string const & getTestServerURI()
+inline int getClientPort()
{
static const char* clientPort = std::getenv("LOOL_TEST_CLIENT_PORT");
+ return clientPort? atoi(clientPort) : DEFAULT_CLIENT_PORT_NUMBER;
+}
+
+inline std::shared_ptr<Poco::Net::StreamSocket> createRawSocket()
+{
+ return
+#if ENABLE_SSL
+ std::make_shared<Poco::Net::SecureStreamSocket>
+#else
+ std::make_shared<Poco::Net::StreamSocket>
+#endif
+ (Poco::Net::SocketAddress("127.0.0.1", getClientPort()));
+}
+inline
+std::string const & getTestServerURI()
+{
static std::string serverURI(
#if ENABLE_SSL
"https://127.0.0.1:"
#else
"http://127.0.0.1:"
#endif
- + (clientPort? std::string(clientPort) : std::to_string(DEFAULT_CLIENT_PORT_NUMBER)));
+ + std::to_string(getClientPort()));
return serverURI;
}
More information about the Libreoffice-commits
mailing list