collabora-online/test/UnitEachView.cpp

212 lines
7.1 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/.
*/
#include <config.h>
#include <memory>
#include <string>
#include <Poco/URI.h>
#include <test/lokassert.hpp>
#include <Unit.hpp>
#include <Util.hpp>
#include <helpers.hpp>
namespace
{
void testEachView(const std::string& doc, const std::string& type, const std::string& protocol,
const std::string& protocolView, const std::string& testname)
{
const std::string view = testname + "view %d -> ";
const std::string error = testname + "view %d, did not receive a %s message as expected";
TST_LOG("testEachView for " << testname);
std::shared_ptr<SocketPoll> socketPoll = std::make_shared<SocketPoll>("UnitEachView");
socketPoll->startThread();
try
{
// Load a document
std::string documentPath, documentURL;
helpers::getDocumentPathAndURL(doc, documentPath, documentURL, testname);
TST_LOG("Loading " << documentURL);
int itView = 0;
std::shared_ptr<http::WebSocketSession> socket =
helpers::loadDocAndGetSession(socketPoll, Poco::URI(helpers::getTestServerURI()),
documentURL, Poco::format(view, itView));
// Check document size
helpers::sendTextFrame(socket, "status", Poco::format(view, itView));
auto response
= helpers::assertResponseString(socket, "status:", Poco::format(view, itView));
int docPart = -1;
int docParts = 0;
int docHeight = 0;
int docWidth = 0;
int docViewId = -1;
helpers::parseDocSize(response.substr(7), type, docPart, docParts, docWidth, docHeight,
docViewId, testname);
// Send click message
std::string text;
Poco::format(text, "mouse type=%s x=%d y=%d count=1 buttons=1 modifier=0",
std::string("buttondown"), docWidth / 2, docHeight / 6);
helpers::sendTextFrame(socket, text, Poco::format(view, itView));
text.clear();
Poco::format(text, "mouse type=%s x=%d y=%d count=1 buttons=1 modifier=0",
std::string("buttonup"), docWidth / 2, docHeight / 6);
helpers::sendTextFrame(socket, text, Poco::format(view, itView));
// Double of the default.
constexpr std::chrono::milliseconds timeoutMs{ 20000 };
response = helpers::getResponseString(socket, protocol, Poco::format(view, itView), timeoutMs);
LOK_ASSERT_MESSAGE(Poco::format(error, itView, protocol), !response.empty());
// Connect and load 0..N Views, where N<=limit
std::vector<std::shared_ptr<http::WebSocketSession>> views;
static_assert(MAX_DOCUMENTS >= 2, "MAX_DOCUMENTS must be at least 2");
const int limit = std::min(4, MAX_DOCUMENTS - 1); // +1 connection above
for (itView = 0; itView < limit; ++itView)
{
TST_LOG("loadDocAndGetSession #" << (itView + 1) << ": " << documentURL);
views.emplace_back(
helpers::loadDocAndGetSession(socketPoll, Poco::URI(helpers::getTestServerURI()),
documentURL, Poco::format(view, itView)));
}
// main view should receive response each view
if (protocolView == "invalidateviewcursor:" || protocolView == "viewcursorvisible:"
|| protocolView == "cellviewcursor:" || protocolView == "graphicviewselection:")
{
return;
}
itView = 0;
for (const auto& socketView : views)
{
TST_LOG("getResponse #" << (itView + 1) << ": " << protocolView);
response = helpers::getResponseString(socket, protocolView, Poco::format(view, itView), timeoutMs);
LOK_ASSERT_MESSAGE(Poco::format(error, itView, protocolView), !response.empty());
++itView;
(void)socketView;
}
}
catch (const Poco::Exception& exc)
{
LOK_ASSERT_FAIL(exc.displayText());
}
catch (const std::exception& exc)
{
LOK_ASSERT_FAIL(exc.what());
}
TST_LOG("Done testEachView for " << testname);
}
}
/// Test suite that asserts a state for each view.
class UnitEachView : public UnitWSD
{
TestResult testInvalidateViewCursor();
TestResult testViewCursorVisible();
TestResult testCellViewCursor();
TestResult testGraphicViewSelectionWriter();
TestResult testGraphicViewSelectionCalc();
TestResult testGraphicViewSelectionImpress();
public:
UnitEachView();
void invokeWSDTest() override;
};
UnitBase::TestResult UnitEachView::testInvalidateViewCursor()
{
testEachView("viewcursor.odp", "presentation",
"invalidatecursor:", "invalidateviewcursor:", "invalidateViewCursor ");
return TestResult::Ok;
}
UnitBase::TestResult UnitEachView::testViewCursorVisible()
{
testEachView("viewcursor.odp", "presentation",
"cursorvisible:", "viewcursorvisible:", "viewCursorVisible ");
return TestResult::Ok;
}
UnitBase::TestResult UnitEachView::testCellViewCursor()
{
testEachView("empty.ods", "spreadsheet", "cellcursor:", "cellviewcursor:", "cellViewCursor ");
return TestResult::Ok;
}
UnitBase::TestResult UnitEachView::testGraphicViewSelectionWriter()
{
testEachView("graphicviewselection.odt", "text",
"graphicselection:", "graphicviewselection:", "graphicViewSelection-odt ");
return TestResult::Ok;
}
UnitBase::TestResult UnitEachView::testGraphicViewSelectionCalc()
{
testEachView("graphicviewselection.ods", "spreadsheet",
"graphicselection:", "graphicviewselection:", "graphicViewSelection-ods ");
return TestResult::Ok;
}
UnitBase::TestResult UnitEachView::testGraphicViewSelectionImpress()
{
testEachView("graphicviewselection.odp", "presentation",
"graphicselection:", "graphicviewselection:", "graphicViewSelection-odp ");
return TestResult::Ok;
}
UnitEachView::UnitEachView()
: UnitWSD("UnitEachView")
{
// 8 times larger then the default.
setTimeout(std::chrono::seconds(240));
}
void UnitEachView::invokeWSDTest()
{
UnitBase::TestResult result = testInvalidateViewCursor();
if (result != TestResult::Ok)
exitTest(result);
result = testViewCursorVisible();
if (result != TestResult::Ok)
exitTest(result);
result = testCellViewCursor();
if (result != TestResult::Ok)
exitTest(result);
result = testGraphicViewSelectionWriter();
if (result != TestResult::Ok)
exitTest(result);
result = testGraphicViewSelectionCalc();
if (result != TestResult::Ok)
exitTest(result);
result = testGraphicViewSelectionImpress();
if (result != TestResult::Ok)
exitTest(result);
exitTest(TestResult::Ok);
}
UnitBase* unit_create_wsd(void) { return new UnitEachView(); }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */