loolwsd/UserMessages.hpp | 2 loolwsd/test/Makefile.am | 2 loolwsd/test/helpers.hpp | 28 +++++++ loolwsd/test/httpwserror.cpp | 152 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 182 insertions(+), 2 deletions(-)
New commits: commit 5e19aa635e510b88397f8ea45f30c5bc07ce6f0c Author: Henry Castro <hcas...@collabora.com> Date: Wed Sep 28 16:04:51 2016 -0400 loolwsd: test: connections and documents diff --git a/loolwsd/UserMessages.hpp b/loolwsd/UserMessages.hpp index 2ef4c8b..8d1dee7 100644 --- a/loolwsd/UserMessages.hpp +++ b/loolwsd/UserMessages.hpp @@ -15,7 +15,7 @@ //NOTE: For whatever reason Poco seems to trim the first character. constexpr auto SERVICE_UNAVALABLE_INTERNAL_ERROR = " Service is unavailable. Please try again later and report to your administrator if the issue persists."; -constexpr auto SERVICE_UNAVALABLE_LIMIT_REACHED = " This server has reached the number of connections or documents it supports at a given time."; +constexpr auto SERVICE_UNAVALABLE_LIMIT_REACHED = "This development build is limited to %d documents, and %d connections - to avoid the impression that it is suitable for deployment in large enterprises. To find out more about deploying and scaling %s checkout - <a href=\"%s\">%s</a>."; #endif diff --git a/loolwsd/test/Makefile.am b/loolwsd/test/Makefile.am index 6bd6d73..d8e152e 100644 --- a/loolwsd/test/Makefile.am +++ b/loolwsd/test/Makefile.am @@ -29,7 +29,7 @@ wsd_sources = \ test_CPPFLAGS = -DTDOC=\"$(abs_top_srcdir)/test/data\" -I$(top_srcdir) test_SOURCES = TileCacheTests.cpp WhiteBoxTests.cpp integration-http-server.cpp \ - httpwstest.cpp httpcrashtest.cpp test.cpp $(wsd_sources) + httpwstest.cpp httpcrashtest.cpp httpwserror.cpp test.cpp $(wsd_sources) test_LDADD = $(CPPUNIT_LIBS) # unit test modules: diff --git a/loolwsd/test/helpers.hpp b/loolwsd/test/helpers.hpp index 90cb973..f73db3c 100644 --- a/loolwsd/test/helpers.hpp +++ b/loolwsd/test/helpers.hpp @@ -15,6 +15,7 @@ #include <thread> #include <regex> +#include <Poco/BinaryReader.h> #include <Poco/DirectoryIterator.h> #include <Poco/Dynamic/Var.h> #include <Poco/FileStream.h> @@ -188,6 +189,33 @@ std::string getTestServerURI() } inline +int getErrorCode(Poco::Net::WebSocket& ws, std::string& message) +{ + int flags = 0; + int bytes = 0; + Poco::UInt16 statusCode = -1; + Poco::Buffer<char> buffer(READ_BUFFER_SIZE); + + message.clear(); + Poco::Timespan timeout(250000); + ws.setReceiveTimeout(timeout); + do + { + bytes = ws.receiveFrame(buffer.begin(), READ_BUFFER_SIZE, flags); + } + while ((flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE); + + if (bytes > 0) + { + Poco::MemoryBinaryReader reader(buffer, Poco::BinaryReader::NETWORK_BYTE_ORDER); + reader >> statusCode; + message.append(buffer.begin() + 2, bytes - 2); + } + + return statusCode; +} + +inline void getResponseMessage(Poco::Net::WebSocket& ws, const std::string& prefix, std::string& response, const bool isLine, const std::string& name = "") { try diff --git a/loolwsd/test/httpwserror.cpp b/loolwsd/test/httpwserror.cpp new file mode 100644 index 0000000..6a130bc --- /dev/null +++ b/loolwsd/test/httpwserror.cpp @@ -0,0 +1,152 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "config.h" + +#include <vector> +#include <string> + +#include <Poco/Net/HTTPClientSession.h> +#include <Poco/Net/HTTPRequest.h> +#include <Poco/Net/HTTPResponse.h> +#include <Poco/Net/HTTPSClientSession.h> +#include <Poco/Net/NetException.h> +#include <Poco/Net/WebSocket.h> +#include <Poco/URI.h> + +#include <cppunit/extensions/HelperMacros.h> + +#include "Common.hpp" +#include "LOOLProtocol.hpp" +#include "helpers.hpp" + +using namespace helpers; + +class HTTPWSError : public CPPUNIT_NS::TestFixture +{ + const Poco::URI _uri; + Poco::Net::HTTPResponse _response; + + CPPUNIT_TEST_SUITE(HTTPWSError); + + CPPUNIT_TEST(testMaxDocuments); + CPPUNIT_TEST(testMaxConnections); + + CPPUNIT_TEST_SUITE_END(); + + void testMaxDocuments(); + void testMaxConnections(); + +public: + HTTPWSError() + : _uri(helpers::getTestServerURI()) + { +#if ENABLE_SSL + Poco::Net::initializeSSL(); + // Just accept the certificate anyway for testing purposes + Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> invalidCertHandler = new Poco::Net::AcceptCertificateHandler(false); + Poco::Net::Context::Params sslParams; + Poco::Net::Context::Ptr sslContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, sslParams); + Poco::Net::SSLManager::instance().initializeClient(0, invalidCertHandler, sslContext); +#endif + } + +#if ENABLE_SSL + ~HTTPWSError() + { + Poco::Net::uninitializeSSL(); + } +#endif + + void setUp() + { + } + + void tearDown() + { + } +}; + +void HTTPWSError::testMaxDocuments() +{ +#if MAX_DOCUMENTS > 0 + try + { + // Load a document. + std::string docPath; + std::string docURL; + std::string message; + Poco::UInt16 statusCode; + std::vector<std::shared_ptr<Poco::Net::WebSocket>> docs; + + for(int it = 1; it <= MAX_DOCUMENTS; it++) + { + getDocumentPathAndURL("empty.odt", docPath, docURL); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, docURL); + docs.emplace_back(connectLOKit(_uri, request, _response)); + } + + // try to open MAX_DOCUMENTS + 1 + getDocumentPathAndURL("empty.odt", docPath, docURL); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, docURL); + std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(_uri)); + Poco::Net::WebSocket socket(*session, request, _response); + statusCode = getErrorCode(socket, message); + CPPUNIT_ASSERT_EQUAL(static_cast<Poco::UInt16>(Poco::Net::WebSocket::WS_ENDPOINT_GOING_AWAY), statusCode); + CPPUNIT_ASSERT_MESSAGE("Wrong error message ", message.find("This development build") != std::string::npos); + } + catch (const Poco::Exception& exc) + { + CPPUNIT_FAIL(exc.displayText()); + } +#endif +} + +void HTTPWSError::testMaxConnections() +{ +#if MAX_CONNECTIONS > 0 + try + { + // Load a document. + std::string docPath; + std::string docURL; + std::string message; + Poco::UInt16 statusCode; + std::vector<std::shared_ptr<Poco::Net::WebSocket>> views; + + getDocumentPathAndURL("empty.odt", docPath, docURL); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, docURL); + auto socket = loadDocAndGetSocket(_uri, docURL, "testMaxConnections "); + + for(int it = 1; it < MAX_CONNECTIONS; it++) + { + std::cerr << it << std::endl; + std::unique_ptr<Poco::Net::HTTPClientSession> session(createSession(_uri)); + auto ws = std::make_shared<Poco::Net::WebSocket>(*session, request, _response); + views.emplace_back(ws); + } + + // try to connect MAX_CONNECTIONS + 1 + std::unique_ptr<Poco::Net::HTTPClientSession> session(createSession(_uri)); + auto socketN = std::make_shared<Poco::Net::WebSocket>(*session, request, _response); + statusCode = getErrorCode(*socketN, message); + CPPUNIT_ASSERT_EQUAL(static_cast<Poco::UInt16>(Poco::Net::WebSocket::WS_ENDPOINT_GOING_AWAY), statusCode); + CPPUNIT_ASSERT_MESSAGE("Wrong error message ", message.find("This development build") != std::string::npos); + + } + catch (const Poco::Exception& exc) + { + CPPUNIT_FAIL(exc.displayText()); + } +#endif +} + +CPPUNIT_TEST_SUITE_REGISTRATION(HTTPWSError); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits