~aleteoryx/muditaos

3fc69d07965a566fa72c976d328763bc1b3a16b5 — Bartek Cichocki 5 years ago 352fb6c
[EGD-3553] added functional tests for service-desktop

UT & PR fixes
M module-db/tests/QueryInterface.cpp => module-db/tests/QueryInterface.cpp +30 -0
@@ 9,6 9,8 @@
#include "queries/sms/QuerySMSSearch.hpp"

#include <memory>
#include <module-db/queries/sms/QuerySMSGetCount.hpp>
#include <module-utils/json/json11.hpp>

namespace db
{


@@ 56,4 58,32 @@ TEST_CASE("Query interface")
        auto result = threadInterface->runQuery(query);
        REQUIRE(dynamic_cast<db::query::SMSSearchResult *>(result.get()));
    }

    SECTION("Endpoint callback test")
    {
        std::shared_ptr<db::Query> query = std::make_shared<db::query::SMSGetCount>();
        auto testMessage                 = R"({"endpoint":6, "method":1, "uuid":12345, "body":{"test":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());

        Context context(msgJson);
        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, Context &context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSGetCountResult *>(result)) {
                    auto id   = SMSResult->getResults();
                    auto body = json11::Json::object{{"count", static_cast<int>(id)}};
                    return true;
                }
                else {
                    return false;
                }
            },
            context);

        query->setQueryListener(std::move(listener));
        auto result        = smsInterface->runQuery(query);
        auto queryListener = result->getRequestQuery()->getQueryListener();
        REQUIRE(queryListener->handleQueryResponse(result.get()) == true);
    }
}

M module-services/service-desktop/endpoints/Context.hpp => module-services/service-desktop/endpoints/Context.hpp +14 -1
@@ 20,6 20,8 @@ namespace parserFSM
        json11::Json body = json11::Json();
    };

    constexpr int invalidUuid = 0;

    class Context
    {
      private:


@@ 37,6 39,9 @@ namespace parserFSM
            if (static_cast<int>(endpoint) > lastEndpoint) {
                endpoint = EndpointType::invalid;
            }
            if (method > http::Method::del) {
                method = http::Method::get;
            }
        }
        auto buildResponseStr(std::size_t responseSize, std::string responsePayloadString) -> std::string
        {


@@ 57,6 62,14 @@ namespace parserFSM
            body     = js[json::body];
            endpoint = static_cast<EndpointType>(js[json::endpoint].int_value());
            uuid     = js[json::uuid].int_value();
            if (uuid == invalidUuid) {
                try {
                    uuid = stoi(js[json::uuid].string_value());
                }
                catch (...) {
                    uuid = invalidUuid;
                }
            }
            method   = static_cast<http::Method>(js[json::method].int_value());
            validate();
        }


@@ 64,7 77,7 @@ namespace parserFSM
        {
            body     = json11::Json();
            endpoint = EndpointType::invalid;
            uuid     = 0;
            uuid     = invalidUuid;
            method   = http::Method::get;
        }


M module-services/service-desktop/tests/unittest.cpp => module-services/service-desktop/tests/unittest.cpp +64 -1
@@ 11,7 11,8 @@
#include "messages/MessageHelper.hpp"
#include "queries/sms/QuerySMSSearchByType.hpp"
#include "service-desktop/ServiceDesktop.hpp"

#include "EndpointFactory.hpp"
#include "contacts/ContactsEndpoint.hpp"
#include "json/json11.hpp"
#include <memory>
#include <vfs.hpp>


@@ 230,3 231,65 @@ TEST_CASE("DB Helpers test - json encoding (messages)")
    REQUIRE(messageTemplateJson[json::messages::id] == 1);
}

TEST_CASE("Context class test")
{
    SECTION("Correct message")
    {
        auto testMessage = R"({"endpoint":6, "method":1, "uuid":12345, "body":{"test":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());

        Context context(msgJson);
        REQUIRE(context.getBody()["test"] == "test");
        REQUIRE(context.getMethod() == http::Method::get);
        REQUIRE(context.getUuid() == 12345);
        REQUIRE(context.getEndpoint() == EndpointType::contacts);
        REQUIRE(context.createSimpleResponse() ==
                R"(#000000061{"body": null, "endpoint": 6, "status": 200, "uuid": "12345"})");

        context.setResponseBody(context.getBody());
        REQUIRE(context.createSimpleResponse() ==
                R"(#000000073{"body": {"test": "test"}, "endpoint": 6, "status": 200, "uuid": "12345"})");
    }
    SECTION("Invalid message")
    {
        auto testMessage = R"({"endpoint":25, "method":8, "uuid":"0", "body":{"te":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());

        Context context(msgJson);
        REQUIRE(context.getBody()["test"] == json11::Json());
        REQUIRE(context.getMethod() == http::Method::get);
        REQUIRE(context.getUuid() == invalidUuid);
        REQUIRE(context.getEndpoint() == EndpointType::invalid);
    }
}

TEST_CASE("Endpoint Factory test")
{
    SECTION("Proper endpoint")
    {
        auto testMessage = R"({"endpoint":6, "method":1, "uuid":12345, "body":{"test":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());

        Context context(msgJson);
        auto handler = EndpointFactory::create(context, nullptr);
        REQUIRE(dynamic_cast<ContactsEndpoint *>(handler.get()));
    }

    SECTION("Wrong endpoint")
    {
        auto testMessage = R"({"endpoint":25, "method":8, "uuid":"12345", "body":{"te":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());

        Context context(msgJson);
        auto handler = EndpointFactory::create(context, nullptr);
        REQUIRE(handler == nullptr);
    }
}

A test/service-desktop-test/defs.py => test/service-desktop-test/defs.py +22 -0
@@ 0,0 1,22 @@
endpoint = {
    "deviceInfo": 1,
    "update": 2,
    "backup": 3,
    "restore": 4,
    "factory": 5,
    "contacts": 6,
    "messages": 7
}

method = {
    "get": 1,
    "post": 2,
    "put": 3,
    "del": 4
}

status = {
    "OK": 200,
    "BadRequest": 400,
    "InternalServerError": 500
}

A test/service-desktop-test/main.py => test/service-desktop-test/main.py +35 -0
@@ 0,0 1,35 @@
from tests.messages import *
from tests.templates import *
from tests.contacts import *
from tests.update import *
from tests.deviceinfo import *
from tests.factoryReset import *
from tests.backup import *
from termcolor import colored


def main(port_name='/dev/ttyACM1'):
    phone.port = port_name
    phone.timeout = 10
    phone.open()
    phone.flushInput()
    final_result = True
    failed_tests = []
    for test_instance in (DeviceInfoTest(), UpdateTest(), BackupTest(), MessageTest(),
                          MessageTemplateTest(), ContactTest(), FactoryResetTest()):
        test_name = type(test_instance).__name__
        result = test_instance.run()
        if result == False:
            failed_tests.append(test_name)
        final_result = final_result and result
        print(
            f'[{test_name}] {colored("PASS", "green") if result else colored("FAIL", "red")}')

    print("\nFinal result:", colored("PASS", "green") if final_result else colored("FAIL", "red"))
    print("Failed tests:")
    for test in failed_tests:
        print(colored(test, "red"))


if __name__ == '__main__':
    main()

A test/service-desktop-test/test.py => test/service-desktop-test/test.py +43 -0
@@ 0,0 1,43 @@
import serial
import json
import random

phone = serial.Serial()


class Test:
    def __init__(self, payload, expected_result):
        self.result = ""
        self.message = build_message(payload)
        self.expected_result = expected_result

    def execute(self):
        phone.write(self.message.encode())
        header = phone.read(10).decode()
        payload_length = int(header[1:])
        result = phone.read(payload_length).decode()
        # print("result full:" + result)
        self.result = json.loads(result)
        return self.result == self.expected_result, self.result["body"]


def build_message(json_data):
    json_dump = json.dumps(json_data)
    return "#%09d%s" % (len(json_dump), json_dump)


def prepare_message(endpoint, method, status, msg_body, result_body={}):
    uuid = random.randint(1, 32768)
    msg = {
        "endpoint": endpoint,
        "method": method,
        "uuid": uuid,
        "body": msg_body
    }
    msg_result = {
        "endpoint": endpoint,
        "status": status,
        "uuid": str(uuid),
        "body": result_body
    }
    return msg, msg_result

A test/service-desktop-test/tests/backup.py => test/service-desktop-test/tests/backup.py +43 -0
@@ 0,0 1,43 @@
from defs import *
from test import *


class BackupTest:
    def run(self):

        msg, result_msg = prepare_message(endpoint["backup"], method["get"], status["OK"],
                                          {"backupReady": True}, {"backupReady": False})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        msg, result_msg = prepare_message(endpoint["backup"], method["get"], status["OK"],
                                          {}, {"backupRequest": False})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        msg, result_msg = prepare_message(endpoint["backup"], method["get"], status["OK"],
                                          {"backupRequest": True}, {"backupRequest": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        msg, result_msg = prepare_message(endpoint["backup"], method["get"], status["OK"],
                                          {"backupReady": True}, {"backupReady": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        msg, result_msg = prepare_message(endpoint["backup"], method["post"], status["OK"],
                                          {"backupUpload": True}, {"backupUpload": False})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        return True

A test/service-desktop-test/tests/contacts.py => test/service-desktop-test/tests/contacts.py +109 -0
@@ 0,0 1,109 @@
from defs import *
from test import *


class ContactTest:
    def run(self):
        # get contacts count
        msg, result_msg = prepare_message(endpoint["contacts"], method["get"], status["OK"],
                                          {"count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        count = result['count']
        if count == 0:
            print("count = 0!")
            return False

        # get all contacts
        msg, result_msg = prepare_message(endpoint["contacts"], method["get"], status["OK"],
                                          {"count": count})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        records_length = len(result)
        contact_to_update = result[0]
        if records_length != count:
            print("received record count mismatch!")
            return False

        # add contact
        msg, result_msg = prepare_message(endpoint["contacts"], method["put"], status["OK"],
                                          {"address": "6 Czeczota St.\n02600 Warsaw",
                                           "altName": "Testowy",
                                           "blocked": True,
                                           "favourite": True,
                                           "numbers": ["547623521"],
                                           "priName": "Test"}, None)
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        # again check contacts count
        msg, result_msg = prepare_message(endpoint["contacts"], method["get"], status["OK"],
                                          {"count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if result["count"] != count + 1:
            print("record count unchanged after add!")
            return False

        # update contact
        msg, result_msg = prepare_message(endpoint["contacts"], method["post"], status["OK"],
                                          {"address": "6 Czeczota St.\n02600 Warsaw",
                                           "altName": "Testowy2",
                                           "blocked": True,
                                           "favourite": True,
                                           "numbers": ["547623521"],
                                           "priName": "Test2",
                                           "id": contact_to_update["id"]}, None)
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        # check updated contact
        msg, result_msg = prepare_message(endpoint["contacts"], method["get"], status["OK"],
                                          {"id": contact_to_update["id"]})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        contact = {"address": "6 Czeczota St.\n02600 Warsaw",
                   "altName": "Testowy2",
                   "blocked": True,
                   "favourite": True,
                   "numbers": ["547623521"],
                   "priName": "Test2",
                   "id": contact_to_update["id"]}
        print(result)
        print(contact)
        if result != contact:
            print("updated record mismatch!")
            return False

        # get contact to remove
        msg, result_msg = prepare_message(endpoint["contacts"], method["get"], status["OK"],
                                          {"count": count + 1})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        for contact in result:
            if contact["priName"] == "Test" and contact["altName"] == "Testowy":
                id = contact["id"]
                break

        # remove contact
        msg, result_msg = prepare_message(endpoint["contacts"], method["del"], status["OK"],
                                          {"id": id}, None)
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        # again check contacts count
        msg, result_msg = prepare_message(endpoint["contacts"], method["get"], status["OK"],
                                          {"count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if result["count"] != count:
            print("record count unchanged after remove!")
            return False

        return True

A test/service-desktop-test/tests/deviceinfo.py => test/service-desktop-test/tests/deviceinfo.py +17 -0
@@ 0,0 1,17 @@
from defs import *
from test import *


class DeviceInfoTest:
    def run(self):

        msg, result_msg = prepare_message(endpoint["deviceInfo"], method["get"], status["OK"], {})
        test = Test(msg, result_msg)
        ret, result = test.execute()

        if int(result["fsFreePercent"]) == 0 or int(result["fsFreePercent"]) > 100:
            return False
        if int(result["batteryState"]) != 1:
            return False

        return True

A test/service-desktop-test/tests/factoryReset.py => test/service-desktop-test/tests/factoryReset.py +11 -0
@@ 0,0 1,11 @@
from defs import *
from test import *


class FactoryResetTest:
    def run(self):
        msg, result_msg = prepare_message(endpoint["factory"], method["post"], status["OK"], {"factoryRequest": True},
                                          {'factoryRequest': True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        return ret

A test/service-desktop-test/tests/messages.py => test/service-desktop-test/tests/messages.py +63 -0
@@ 0,0 1,63 @@
from defs import *
from test import *


class MessageTest:
    def run(self):
        # get messages count
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"], {"count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        count = result['count']
        if count == 0:
            print("count = 0!")
            return False

        # get all messages
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"], {"count": count})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        records_length = len(result)
        if records_length != count:
            print("received record count mismatch!")
            return False

        # remove message
        sms_to_remove = result[0]
        msg, result_msg = prepare_message(endpoint["messages"], method["del"], status["OK"],
                                          {"id": sms_to_remove["id"]}, None)
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return ret

        # check if the message was removed
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"], {"count": count})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        for message in result:
            if message["id"] == sms_to_remove["id"]:
                print("contact still exists!")
                return False

        # get messages binded to contactID
        contact_id = 2
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"], {"contactID": contact_id})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        for message in result:
            if message["contactID"] != contact_id:
                print("wrong contactID!")
                return False

        thread_id = 1
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"],
                                          {"threadID": thread_id, "count": 10})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        for message in result:
            if message["threadID"] != thread_id:
                print("wrong threadID!")
                return False

        return True

A test/service-desktop-test/tests/templates.py => test/service-desktop-test/tests/templates.py +71 -0
@@ 0,0 1,71 @@
from defs import *
from test import *


class MessageTemplateTest:
    def run(self):
        # get templates count
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"],
                                          {"template": True, "count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        count = result['count']
        if count == 0:
            print("count = 0!")
            return False

        # get all templates
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"],
                                          {"template": True, "count": count})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        records_length = len(result)
        if records_length != count:
            print("received record count mismatch!")
            return False

        # add template
        msg, result_msg = prepare_message(endpoint["messages"], method["put"], status["OK"],
                                          {"template": True, "text": "test template"}, None)
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        # again check templates count
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"],
                                          {"template": True, "count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if result["count"] != count + 1:
            print("record count unchanged after add!")
            return False

        # get template to remove
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"],
                                          {"template": True, "count": count + 1})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        for template in result:
            if template["text"] == "test template":
                id = template["id"]
                break

        # remove template
        msg, result_msg = prepare_message(endpoint["messages"], method["del"], status["OK"],
                                          {"template": True, "id": id}, None)
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if ret == False:
            return False

        # again check templates count
        msg, result_msg = prepare_message(endpoint["messages"], method["get"], status["OK"],
                                          {"template": True, "count": True})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if result["count"] != count:
            print("record count unchanged after remove!")
            return False

        return True

A test/service-desktop-test/tests/update.py => test/service-desktop-test/tests/update.py +27 -0
@@ 0,0 1,27 @@
from defs import *
from test import *


class UpdateTest:
    def run(self):
        # perform update endpoint test
        msg, result_msg = prepare_message(endpoint["update"], method["get"], status["OK"], {})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        filename = ""
        if len(result) > 0:
            filename = result

        if len(filename) > 1:
            filename = filename[0]
        msg, result_msg = prepare_message(endpoint["update"], method["post"], status["OK"], {"filename": filename})
        test = Test(msg, result_msg)
        ret, result = test.execute()
        if filename != "":
            if result["updateReady"] == True:
                return True
        else:
            if result["updateReady"] != False:
                return False

        return True