7183a3d3de
Change-Id: Ice934380029bf27054e830fffc07a5d037d1430f Signed-off-by: Michael Meeks <michael.meeks@collabora.com>
211 lines
7.1 KiB
C++
211 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: */
|