libreoffice-online/test/UnitHosting.cpp
Ashod Nakashian 82560d9657 wsd: test assertion macros
Because the new-style tests are intrustive,
the exception that CppUnit throws on assertion
failures is caught and processed with the
application logic, which is far from ideal,
because it's very difficult to find the
cause of failure.

What we'd like is a way to control what happens
when an test assertion fails, such that we can
properly log/print the failure, and even break
in the debugger.

The new macros allow us to control the behavior
at compile-time and have added flexibility.
For now, they log an assertion failure before
invoking the CPPUNIT macro, and support a
compile-time directive to assert, which is
useful for breaking in the debugger.

Change-Id: If464ba246e3ec747f31496a4215cb73ef735dfaf
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/87625
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
2020-03-14 15:45:00 +01:00

150 lines
5.2 KiB
C++

/* -*- 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 <memory>
#include <ostream>
#include <set>
#include <string>
#include <Poco/DOM/AutoPtr.h>
#include <Poco/DOM/DOMParser.h>
#include <Poco/DOM/Document.h>
#include <Poco/DOM/NodeList.h>
#include <Poco/Exception.h>
#include <Poco/RegularExpression.h>
#include <Poco/URI.h>
#include <test/lokassert.hpp>
#include <Png.hpp>
#include <Unit.hpp>
#include <helpers.hpp>
// Include config.h last, so the test server URI is still HTTP, even in SSL builds.
#include <config.h>
class LOOLWebSocket;
/// Test suite for /hosting, etc.
class UnitHosting : public UnitWSD
{
TestResult testDiscovery();
TestResult testCapabilities();
public:
void invokeTest() override;
};
UnitBase::TestResult UnitHosting::testDiscovery()
{
Poco::URI uri(helpers::getTestServerURI());
std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(uri));
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/hosting/discovery");
session->sendRequest(request);
Poco::Net::HTTPResponse response;
session->receiveResponse(response);
LOK_ASSERT_EQUAL(Poco::Net::HTTPResponse::HTTP_OK, response.getStatus());
LOK_ASSERT_EQUAL(std::string("text/xml"), response.getContentType());
Poco::Net::HTTPRequest request2(Poco::Net::HTTPRequest::HTTP_GET, "/hosting/discovery/");
session->sendRequest(request2);
Poco::Net::HTTPResponse response2;
session->receiveResponse(response2);
LOK_ASSERT_EQUAL(Poco::Net::HTTPResponse::HTTP_OK, response2.getStatus());
LOK_ASSERT_EQUAL(std::string("text/xml"), response2.getContentType());
return TestResult::Ok;
}
UnitBase::TestResult UnitHosting::testCapabilities()
{
Poco::URI uri(helpers::getTestServerURI());
std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(uri));
// Get discovery first and extract the urlsrc of the capabilities end point
std::string capabilitiesURI;
{
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/hosting/discovery");
session->sendRequest(request);
Poco::Net::HTTPResponse response;
std::istream& rs = session->receiveResponse(response);
LOK_ASSERT_EQUAL(Poco::Net::HTTPResponse::HTTP_OK, response.getStatus());
LOK_ASSERT_EQUAL(std::string("text/xml"), response.getContentType());
std::string discoveryXML;
Poco::StreamCopier::copyToString(rs, discoveryXML);
Poco::XML::DOMParser parser;
Poco::XML::AutoPtr<Poco::XML::Document> docXML = parser.parseString(discoveryXML);
Poco::XML::AutoPtr<Poco::XML::NodeList> listNodes = docXML->getElementsByTagName("action");
bool foundCapabilities = false;
for (unsigned long index = 0; index < listNodes->length(); ++index)
{
Poco::XML::Element* elem = static_cast<Poco::XML::Element*>(listNodes->item(index));
Poco::XML::Element* parent = elem->parentNode()
? static_cast<Poco::XML::Element*>(elem->parentNode())
: nullptr;
if (parent && parent->getAttribute("name") == "Capabilities")
{
foundCapabilities = true;
capabilitiesURI = elem->getAttribute("urlsrc");
break;
}
}
LOK_ASSERT(foundCapabilities);
LOK_ASSERT_EQUAL(uri.toString() + CAPABILITIES_END_POINT, capabilitiesURI);
}
// Then get the capabilities json
{
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, CAPABILITIES_END_POINT);
session->sendRequest(request);
Poco::Net::HTTPResponse response;
std::istream& rs = session->receiveResponse(response);
LOK_ASSERT_EQUAL(Poco::Net::HTTPResponse::HTTP_OK, response.getStatus());
LOK_ASSERT_EQUAL(std::string("application/json"), response.getContentType());
std::ostringstream oss;
Poco::StreamCopier::copyStream(rs, oss);
std::string responseString = oss.str();
Poco::JSON::Parser parser;
Poco::Dynamic::Var jsonFile = parser.parse(responseString);
Poco::JSON::Object::Ptr features = jsonFile.extract<Poco::JSON::Object::Ptr>();
LOK_ASSERT(features);
LOK_ASSERT(features->has("convert-to"));
Poco::JSON::Object::Ptr convert_to
= features->get("convert-to").extract<Poco::JSON::Object::Ptr>();
LOK_ASSERT(convert_to->has("available"));
LOK_ASSERT(convert_to->get("available"));
}
return TestResult::Ok;
}
void UnitHosting::invokeTest()
{
UnitBase::TestResult result = testDiscovery();
if (result != TestResult::Ok)
exitTest(result);
result = testCapabilities();
if (result != TestResult::Ok)
exitTest(result);
exitTest(TestResult::Ok);
}
UnitBase* unit_create_wsd(void) { return new UnitHosting(); }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */