collabora-online/test/UnitCopyPasteWriter.cpp

140 lines
4.9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* Copyright the Collabora Online contributors.
*
* SPDX-License-Identifier: MPL-2.0
*
* 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/.
*/
// Test various copy/paste pieces ...
#include <config.h>
#include <HttpRequest.hpp>
#include <Unit.hpp>
#include <WebSocketSession.hpp>
#include <common/JsonUtil.hpp>
#include <helpers.hpp>
#include <lokassert.hpp>
#include <wsd/COOLWSD.hpp>
#include <wsd/ClientSession.hpp>
using namespace Poco::Net;
std::shared_ptr<ClientSession> getChildSession(size_t session)
{
std::shared_ptr<DocumentBroker> broker;
std::shared_ptr<ClientSession> clientSession;
std::vector<std::shared_ptr<DocumentBroker>> brokers = COOLWSD::getBrokersTestOnly();
assert(brokers.size() > 0);
broker = brokers[0];
auto sessions = broker->getSessionsTestOnlyUnsafe();
assert(sessions.size() > 0 && session < sessions.size());
return sessions[session];
}
std::string getSessionClipboardURI(size_t session)
{
std::shared_ptr<ClientSession> clientSession = getChildSession(session);
std::string tag = clientSession->getClipboardURI(false); // nominally thread unsafe
return tag;
}
// Inside the WSD process
class UnitCopyPasteWriter : public UnitWSD
{
STATE_ENUM(Phase, RunTest, WaitDocClose, PostCloseTest, Done) _phase;
public:
UnitCopyPasteWriter()
: UnitWSD("UnitCopyPasteWriter")
, _phase(Phase::RunTest)
{
}
void onDocBrokerDestroy(const std::string& /*docKey*/) override
{
LOK_ASSERT_STATE(_phase, Phase::WaitDocClose);
TRANSITION_STATE(_phase, Phase::PostCloseTest);
}
void runTest()
{
// Given a Writer document with bullets:
std::string documentPath, documentURL;
helpers::getDocumentPathAndURL("bullets.odt", documentPath, documentURL, testname);
std::shared_ptr<http::WebSocketSession> socket = helpers::loadDocAndGetSession(
socketPoll(), Poco::URI(helpers::getTestServerURI()), documentURL, testname);
helpers::sendTextFrame(socket, "uno .uno:SelectAll", testname);
// When copying the cnotent of the document:
helpers::sendAndDrain(socket, testname, "uno .uno:Copy", "statechanged:");
// Then make sure asking for multiple, specific formats results in a JSON answer, it's what
// JS expects:
{
std::string clipURI = getSessionClipboardURI(0);
clipURI += "&MimeType=text/html,text/plain;charset=utf-8";
std::shared_ptr<http::Session> httpSession = http::Session::create(clipURI);
std::shared_ptr<const http::Response> httpResponse =
httpSession->syncRequest(http::Request(Poco::URI(clipURI).getPathAndQuery()));
LOK_ASSERT_EQUAL(http::StatusCode::OK, httpResponse->statusLine().statusCode());
std::string body = httpResponse->getBody();
Poco::JSON::Object::Ptr object;
// This failed, we didn't return JSON.
LOK_ASSERT(JsonUtil::parseJSON(body, object));
LOK_ASSERT(object->has("text/html"));
std::string expectedPlainText(" • first\n • second\n • third");
std::string actualPlainText = object->get("text/plain;charset=utf-8").toString();
LOK_ASSERT_EQUAL(actualPlainText, expectedPlainText);
}
// Now also test HTML only:
{
std::string clipURI = getSessionClipboardURI(0);
clipURI += "&MimeType=text/html";
std::shared_ptr<http::Session> httpSession = http::Session::create(clipURI);
std::shared_ptr<const http::Response> httpResponse =
httpSession->syncRequest(http::Request(Poco::URI(clipURI).getPathAndQuery()));
LOK_ASSERT_EQUAL(http::StatusCode::OK, httpResponse->statusLine().statusCode());
std::string body = httpResponse->getBody();
Poco::JSON::Object::Ptr object;
LOK_ASSERT(JsonUtil::parseJSON(body, object));
LOK_ASSERT(object->has("text/html"));
}
TRANSITION_STATE(_phase, Phase::WaitDocClose);
socket->asyncShutdown();
LOK_ASSERT(socket->waitForDisconnection(std::chrono::seconds(5)));
}
void invokeWSDTest() override
{
switch (_phase)
{
case Phase::RunTest:
{
runTest();
break;
}
case Phase::WaitDocClose:
break;
case Phase::PostCloseTest:
TRANSITION_STATE(_phase, Phase::Done);
passTest();
break;
case Phase::Done:
break;
}
}
};
UnitBase* unit_create_wsd(void) { return new UnitCopyPasteWriter(); }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */