libreoffice-online/loolwsd/LOOLProtocol.cpp
Tor Lillqvist 422dfd1767 Start on load testing
Add a new program, loadtest, that runs a requested number of client sessions
in parallel to a loolwsd server. A client session loads one of a list of test
documents, and does some operations on it.

Move the getTokenInteger() and getTokenString() functions out from LOOLSession
into a new namespace LOOLProtocol, as they are neeeded also in the loadtest
program.

Add, also in LOOLProtocol, functions to parse some of the messages from the
server. (In general that is done in client JavaScript code, of course; only
for testing purposes needed in C++ code.)
2015-03-26 17:04:08 +02:00

97 lines
2.9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 <cassert>
#define LOK_USE_UNSTABLE_API
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
#include <Poco/StringTokenizer.h>
#include "LOOLProtocol.hpp"
using Poco::StringTokenizer;
namespace LOOLProtocol
{
bool getTokenInteger(const std::string& token, const std::string& name, int& value)
{
size_t nextIdx;
try
{
if (token.size() < name.size() + 2 ||
token.substr(0, name.size()) != name ||
token[name.size()] != '=' ||
(value = std::stoi(token.substr(name.size() + 1), &nextIdx), false) ||
nextIdx != token.size() - name.size() - 1)
{
throw std::invalid_argument("bah");
}
}
catch (std::invalid_argument&)
{
return false;
}
return true;
}
bool getTokenString(const std::string& token, const std::string& name, std::string& value)
{
try
{
if (token.size() < name.size() + 2 ||
token.substr(0, name.size()) != name ||
token[name.size()] != '=')
{
throw std::invalid_argument("bah");
}
}
catch (std::invalid_argument&)
{
return false;
}
value = token.substr(name.size() + 1);
return true;
}
bool parseStatus(const std::string& message, LibreOfficeKitDocumentType& type, int& nParts, int& currentPart, int& width, int& height)
{
StringTokenizer tokens(message, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
assert(tokens.count() == 6);
assert(tokens[0] == "status:");
std::string typeString;
if (!getTokenString(tokens[1], "type", typeString))
return false;
if (typeString == "text")
type = LOK_DOCTYPE_TEXT;
else if (typeString == "spreadsheet")
type = LOK_DOCTYPE_SPREADSHEET;
else if (typeString == "presentation")
type = LOK_DOCTYPE_PRESENTATION;
else if (typeString == "drawing")
type = LOK_DOCTYPE_PRESENTATION;
else if (typeString == "other")
type = LOK_DOCTYPE_OTHER;
else
return false;
if (!getTokenInteger(tokens[2], "parts", nParts) ||
!getTokenInteger(tokens[3], "current", currentPart) ||
!getTokenInteger(tokens[4], "width", width) ||
!getTokenInteger(tokens[5], "height", height))
return false;
return true;
}
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */