~aleteoryx/muditaos

fa24dcc8293533a27df76838cb8077ab09ea14da — SP2FET 5 years ago 965cf1b
[EGD-5483] Updated BT harness tests

Added harness test for BT scan in order to be able
to test regression
M module-bluetooth/Bluetooth/CommandHandler.cpp => module-bluetooth/Bluetooth/CommandHandler.cpp +3 -0
@@ 4,6 4,7 @@
#include "CommandHandler.hpp"

#include <utility>
#include <service-bluetooth/ServiceBluetooth.hpp>

#include "Device.hpp"
#include "BtCommand.hpp"


@@ 60,6 61,7 @@ namespace bluetooth
        }

        LOG_INFO("Scan started!");
        static_cast<ServiceBluetooth *>(service)->scanStartedCallback();
        // open new scan window
        return Error::Success;
    }


@@ 67,6 69,7 @@ namespace bluetooth
    Error::Code CommandHandler::stopScan()
    {
        driver->stopScan();
        static_cast<ServiceBluetooth *>(service)->scanStoppedCallback();
        return Error::Success;
    }


M module-services/service-bluetooth/ServiceBluetooth.cpp => module-services/service-bluetooth/ServiceBluetooth.cpp +23 -2
@@ 68,10 68,15 @@ sys::ReturnCodes ServiceBluetooth::InitHandler()

        switch (newBtStatus.state) {
        case BluetoothStatus::State::On:
            if (msg->sender == "ServiceDesktop") {
                enabledFromHarness = true;
                LOG_INFO("BT enabled from Harness");
            }
            sendWorkerCommand(bluetooth::Command::PowerOn);
            break;
        case BluetoothStatus::State::Off:
            sendWorkerCommand(bluetooth::Command::PowerOff);
            enabledFromHarness = false;
            break;
        default:
            break;


@@ 83,9 88,9 @@ sys::ReturnCodes ServiceBluetooth::InitHandler()
    connect(sdesktop::developerMode::DeveloperModeRequest(), [&](sys::Message *msg) {
        using namespace sdesktop::developerMode;
        auto req = static_cast<DeveloperModeRequest *>(msg);
        if (typeid(*req->event) == typeid(BluetoothStatusRequestEvent)) {
        if (typeid(*req->event) == typeid(sdesktop::bluetooth::BluetoothStatusRequestEvent)) {
            auto state   = std::visit(bluetooth::IntVisitor(), settingsHolder->getValue(bluetooth::Settings::State));
            auto event   = std::make_unique<BluetoothStatusRequestEvent>(state);
            auto event   = std::make_unique<sdesktop::bluetooth::BluetoothStatusRequestEvent>(state);
            auto message = std::make_shared<DeveloperModeRequest>(std::move(event));
            bus.sendUnicast(std::move(message), service::name::service_desktop);
        }


@@ 188,3 193,19 @@ void ServiceBluetooth::sendWorkerCommand(bluetooth::Command command)
{
    xQueueSend(workerQueue, &command, portMAX_DELAY);
}
void ServiceBluetooth::scanStartedCallback()
{
    if (enabledFromHarness) {
        auto event   = std::make_unique<sdesktop::bluetooth::ScanStartedEvent>();
        auto message = std::make_shared<sdesktop::developerMode::DeveloperModeRequest>(std::move(event));
        bus.sendUnicast(std::move(message), service::name::service_desktop);
    }
}
void ServiceBluetooth::scanStoppedCallback()
{
    if (enabledFromHarness) {
        auto event   = std::make_unique<sdesktop::bluetooth::ScanStoppedEvent>();
        auto message = std::make_shared<sdesktop::developerMode::DeveloperModeRequest>(std::move(event));
        bus.sendUnicast(std::move(message), service::name::service_desktop);
    }
}

M module-services/service-bluetooth/service-bluetooth/ServiceBluetooth.hpp => module-services/service-bluetooth/service-bluetooth/ServiceBluetooth.hpp +3 -0
@@ 35,9 35,12 @@ class ServiceBluetooth : public sys::Service
    void sendWorkerCommand(bluetooth::Command command);
    QueueHandle_t workerQueue = nullptr;
    std::shared_ptr<bluetooth::SettingsHolder> settingsHolder;
    void scanStartedCallback();
    void scanStoppedCallback();

  private:
    std::unique_ptr<BluetoothWorker> worker;
    bool enabledFromHarness = false;
};

namespace sys

M module-services/service-desktop/CMakeLists.txt => module-services/service-desktop/CMakeLists.txt +2 -0
@@ 4,6 4,8 @@ message( "${PROJECT_NAME}  ${CMAKE_CURRENT_LIST_DIR}" )
set(SOURCES
    endpoints/backup/BackupEndpoint.cpp
    endpoints/backup/BackupRestore.cpp
    endpoints/bluetooth/BluetoothEndpoint.cpp
    endpoints/bluetooth/BluetoothHelper.cpp
    endpoints/calllog/CalllogEndpoint.cpp
    endpoints/calllog/CalllogHelper.cpp
    endpoints/contacts/ContactHelper.cpp

M module-services/service-desktop/DesktopMessages.cpp => module-services/service-desktop/DesktopMessages.cpp +48 -31
@@ 1,50 1,67 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "service-desktop/DesktopMessages.hpp"
#include "parser/MessageHandler.hpp"

namespace sdesktop::developerMode
namespace sdesktop
{
    using namespace parserFSM;
    void Event::send()
    {
        MessageHandler::putToSendQueue(context.createSimpleResponse());
    }

    ATResponseEvent::ATResponseEvent(std::vector<std::string> resp)
    namespace developerMode
    {
        context.setResponseStatus(http::Code::OK);
        context.setEndpoint(EndpointType::developerMode);
        context.setResponseBody(json11::Json::object{{json::developerMode::ATResponse, resp}});
    }

    AppFocusChangeEvent::AppFocusChangeEvent(std::string appName)
    {
        context.setResponseStatus(http::Code::OK);
        context.setEndpoint(EndpointType::developerMode);
        context.setResponseBody(json11::Json::object{{json::developerMode::focus, appName}});
    }
        ATResponseEvent::ATResponseEvent(std::vector<std::string> resp)
        {
            context.setResponseStatus(http::Code::OK);
            context.setEndpoint(EndpointType::developerMode);
            context.setResponseBody(json11::Json::object{{json::developerMode::ATResponse, resp}});
        }

    ScreenlockCheckEvent::ScreenlockCheckEvent(bool isLocked)
    {
        context.setResponseStatus(http::Code::OK);
        context.setEndpoint(EndpointType::developerMode);
        context.setResponseBody(json11::Json::object{{json::developerMode::isLocked, isLocked}});
    }
        AppFocusChangeEvent::AppFocusChangeEvent(std::string appName)
        {
            context.setResponseStatus(http::Code::OK);
            context.setEndpoint(EndpointType::developerMode);
            context.setResponseBody(json11::Json::object{{json::developerMode::focus, appName}});
        }

    DeveloperModeRequest::DeveloperModeRequest(std::unique_ptr<Event> event)
        : sys::DataMessage(MessageType::DeveloperModeRequest), event(std::move(event))
    {}
        ScreenlockCheckEvent::ScreenlockCheckEvent(bool isLocked)
        {
            context.setResponseStatus(http::Code::OK);
            context.setEndpoint(EndpointType::developerMode);
            context.setResponseBody(json11::Json::object{{json::developerMode::isLocked, isLocked}});
        }

    DeveloperModeRequest::DeveloperModeRequest() : sys::DataMessage(MessageType::DeveloperModeRequest)
    {}
        DeveloperModeRequest::DeveloperModeRequest(std::unique_ptr<Event> event)
            : sys::DataMessage(MessageType::DeveloperModeRequest), event(std::move(event))
        {}

    BluetoothStatusRequestEvent::BluetoothStatusRequestEvent(int state)
        DeveloperModeRequest::DeveloperModeRequest() : sys::DataMessage(MessageType::DeveloperModeRequest)
        {}
    } // namespace developerMode
    namespace bluetooth
    {
        context.setResponseStatus(http::Code::OK);
        context.setEndpoint(EndpointType::developerMode);
        context.setResponseBody(json11::Json::object{{json::developerMode::btState, state}});
    }

} // namespace sdesktop::developerMode
        BluetoothStatusRequestEvent::BluetoothStatusRequestEvent(int state)
        {
            context.setResponseStatus(http::Code::OK);
            context.setEndpoint(EndpointType::bluetooth);
            context.setResponseBody(json11::Json::object{{json::bluetooth::state, state}});
        }
        ScanStartedEvent::ScanStartedEvent()
        {
            context.setResponseStatus(http::Code::OK);
            context.setEndpoint(EndpointType::bluetooth);
            context.setResponseBody(json11::Json::object{{json::bluetooth::scan, json::bluetooth::btOn}});
        }
        ScanStoppedEvent::ScanStoppedEvent()
        {
            context.setResponseStatus(http::Code::OK);
            context.setEndpoint(EndpointType::bluetooth);
            context.setResponseBody(json11::Json::object{{json::bluetooth::scan, json::bluetooth::btOff}});
        }
    } // namespace bluetooth
} // namespace sdesktop

M module-services/service-desktop/endpoints/EndpointFactory.hpp => module-services/service-desktop/endpoints/EndpointFactory.hpp +4 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 18,6 18,7 @@
#include "messages/MessagesEndpoint.hpp"
#include "restore/RestoreEndpoint.hpp"
#include "update/UpdateEndpoint.hpp"
#include <endpoints/bluetooth/BluetoothEndpoint.hpp>

class EndpointFactory
{


@@ 49,6 50,8 @@ class EndpointFactory
            return std::make_unique<DeveloperModeEndpoint>(ownerServicePtr);
        case parserFSM::EndpointType::calendarEvents:
            return std::make_unique<CalendarEventsEndpoint>(ownerServicePtr);
        case parserFSM::EndpointType::bluetooth:
            return std::make_unique<BluetoothEndpoint>(ownerServicePtr);
        default:
            return nullptr;
        }

A module-services/service-desktop/endpoints/bluetooth/BluetoothEndpoint.cpp => module-services/service-desktop/endpoints/bluetooth/BluetoothEndpoint.cpp +23 -0
@@ 0,0 1,23 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "BluetoothHelper.hpp"
#include "BluetoothEndpoint.hpp"
#include <endpoints/Context.hpp>

using namespace parserFSM;

auto BluetoothEndpoint::handle(Context &context) -> void
{
    switch (context.getMethod()) {
    case http::Method::get:
        helper->processGetRequest(context);
        break;
    case http::Method::post:
        break;
    case http::Method::put:
        helper->processPutRequest(context);
        break;
    case http::Method::del:
        break;
    }
}

A module-services/service-desktop/endpoints/bluetooth/BluetoothEndpoint.hpp => module-services/service-desktop/endpoints/bluetooth/BluetoothEndpoint.hpp +35 -0
@@ 0,0 1,35 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <endpoints/Endpoint.hpp>
#include <parser/ParserUtils.hpp>
#include "BluetoothHelper.hpp"
#include <Service/Service.hpp>

#include <memory>
#include <string>

namespace parserFSM
{
    class Context;
} // namespace parserFSM
namespace sys
{
    class Service;
} // namespace sys

class BluetoothEndpoint : public parserFSM::Endpoint
{
  private:
    std::unique_ptr<parserFSM::BluetoothHelper> helper;

  public:
    BluetoothEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr)
    {
        debugName = "BluetoothEndpoint";
        helper    = std::make_unique<parserFSM::BluetoothHelper>(ownerServicePtr);
    }
    auto handle(parserFSM::Context &context) -> void override;
};

A module-services/service-desktop/endpoints/bluetooth/BluetoothHelper.cpp => module-services/service-desktop/endpoints/bluetooth/BluetoothHelper.cpp +53 -0
@@ 0,0 1,53 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BluetoothHelper.hpp"
#include <service-desktop/DesktopMessages.hpp>
#include <service-bluetooth/BluetoothMessage.hpp>
#include <parser/MessageHandler.hpp>
#include <service-bluetooth/messages/SetStatus.hpp>

auto parserFSM::BluetoothHelper::processPutRequest(parserFSM::Context &context) -> sys::ReturnCodes
{
    auto body = context.getBody();
    if (auto command = body[json::bluetooth::command].string_value(); !command.empty()) {
        BluetoothMessage::Request btRequest{};

        if (command == json::bluetooth::scanOn) {
            btRequest = BluetoothMessage::Request::Scan;
        }
        else if (command == json::bluetooth::scanOff) {
            btRequest = BluetoothMessage::Request::StopScan;
        }
        ownerServicePtr->bus.sendUnicast(std::make_shared<BluetoothMessage>(btRequest), "ServiceBluetooth");
    }
    else if (auto state = body[json::bluetooth::state].string_value(); !state.empty()) {
        BluetoothStatus status{};
        if (state == json::bluetooth::btOn) {
            status.state = BluetoothStatus::State::On;
            LOG_INFO("turning on BT from harness!");
        }
        else if (state == json::bluetooth::btOff) {
            status.state = BluetoothStatus::State::Off;
            LOG_INFO("turning off BT from harness!");
        }
        ::message::bluetooth::SetStatus setStatus(status);

        ownerServicePtr->bus.sendUnicast(std::make_shared<::message::bluetooth::SetStatus>(std::move(setStatus)),
                                         "ServiceBluetooth");
        MessageHandler::putToSendQueue(context.createSimpleResponse());
    }

    return sys::ReturnCodes::Unresolved;
}
auto parserFSM::BluetoothHelper::processGetRequest(parserFSM::Context &context) -> sys::ReturnCodes
{
    auto body = context.getBody();
    if (body[json::bluetooth::state].bool_value()) {

        auto event = std::make_unique<sdesktop::bluetooth::BluetoothStatusRequestEvent>();
        auto msg   = std::make_shared<sdesktop::developerMode::DeveloperModeRequest>(std::move(event));
        ownerServicePtr->bus.sendUnicast(std::move(msg), "ServiceBluetooth");
    }
    return sys::ReturnCodes::Unresolved;
}

A module-services/service-desktop/endpoints/bluetooth/BluetoothHelper.hpp => module-services/service-desktop/endpoints/bluetooth/BluetoothHelper.hpp +39 -0
@@ 0,0 1,39 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#pragma once

#include <endpoints/Context.hpp>

#include <Common/Query.hpp>
#include <Service/Common.hpp>
#include <Service/Service.hpp>

namespace sys
{
    class Service;
} // namespace sys

namespace parserFSM
{

    class BluetoothHelper
    {
        sys::Service *ownerServicePtr = nullptr;

      public:
        BluetoothHelper(sys::Service *_ownerServicePtr) : ownerServicePtr(_ownerServicePtr){};
        auto processPutRequest(Context &context) -> sys::ReturnCodes;
        auto processGetRequest(Context &context) -> sys::ReturnCodes;
    };

    namespace json::bluetooth
    {
        inline constexpr auto state   = "state";
        inline constexpr auto btOn    = "on";
        inline constexpr auto btOff   = "off";
        inline constexpr auto scanOn  = "scanOn";
        inline constexpr auto scanOff = "scanOff";
        inline constexpr auto scan    = "scan";
        inline constexpr auto command = "command";
    } // namespace json::bluetooth
} // namespace parserFSM

M module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp => module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp +0 -21
@@ 51,27 51,6 @@ auto DeveloperModeHelper::processPutRequest(Context &context) -> sys::ReturnCode
        auto msg   = std::make_shared<sdesktop::developerMode::DeveloperModeRequest>(std::move(event));
        ownerServicePtr->bus.sendUnicast(std::move(msg), "ApplicationDesktop");
    }
    else if (body[json::developerMode::btState].bool_value()) {

        auto event = std::make_unique<sdesktop::developerMode::BluetoothStatusRequestEvent>();
        auto msg   = std::make_shared<sdesktop::developerMode::DeveloperModeRequest>(std::move(event));
        ownerServicePtr->bus.sendUnicast(std::move(msg), "ServiceBluetooth");
    }
    else if (auto state = body[json::developerMode::btCommand].string_value(); !state.empty()) {
        BluetoothMessage::Request request;
        if (state == json::developerMode::btOn) {
            request = BluetoothMessage::Request::Start;
            LOG_INFO("turning on BT from harness!");
        }
        else {
            request = BluetoothMessage::Request::StopPlayback;
            LOG_INFO("turning off BT from harness!");
        }
        std::shared_ptr<BluetoothMessage> msg = std::make_shared<BluetoothMessage>(request);
        ownerServicePtr->bus.sendUnicast(std::move(msg), "ServiceBluetooth");

        MessageHandler::putToSendQueue(context.createSimpleResponse());
    }
    else if (body[json::developerMode::changeSim].is_number()) {
        int simSelected = body[json::developerMode::changeSim].int_value();
        requestSimChange(simSelected);

M module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp => module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp +0 -3
@@ 45,9 45,6 @@ namespace parserFSM
        inline constexpr auto AT            = "AT";
        inline constexpr auto focus         = "focus";
        inline constexpr auto isLocked      = "isLocked";
        inline constexpr auto btState       = "btState";
        inline constexpr auto btOn          = "on";
        inline constexpr auto btCommand     = "btCommand";
        inline constexpr auto changeSim     = "changeSim";
        inline constexpr auto smsCommand    = "smsCommand";
        inline constexpr auto getInfo       = "getInfo";

M module-services/service-desktop/parser/ParserUtils.hpp => module-services/service-desktop/parser/ParserUtils.hpp +3 -2
@@ 26,10 26,11 @@ namespace parserFSM
        messages,
        calllog,
        calendarEvents,
        developerMode
        developerMode,
        bluetooth
    };

    inline constexpr auto lastEndpoint = static_cast<int>(EndpointType::developerMode);
    inline constexpr auto lastEndpoint = static_cast<int>(EndpointType::bluetooth);
    // Message defs and utils
    namespace message
    {

M module-services/service-desktop/service-desktop/DesktopMessages.hpp => module-services/service-desktop/service-desktop/DesktopMessages.hpp +32 -15
@@ 1,10 1,11 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <endpoints/update/UpdateMuditaOS.hpp>
#include <endpoints/developerMode/DeveloperModeEndpoint.hpp>
#include <endpoints/bluetooth/BluetoothEndpoint.hpp>

#include <Service/Message.hpp>
#include <MessageType.hpp>


@@ 65,18 66,20 @@ namespace sdesktop
        ~FactoryMessage() override = default;
    };

    class Event
    {
      protected:
        parserFSM::Context context;

      public:
        void send();
        virtual ~Event() = default;
    };

    namespace developerMode
    {

        class Event
        {
          protected:
            parserFSM::Context context;

          public:
            void send();
            virtual ~Event() = default;
        };

        class ATResponseEvent : public Event
        {


@@ 98,12 101,6 @@ namespace sdesktop
            explicit ScreenlockCheckEvent(bool isLocked);
        };

        class BluetoothStatusRequestEvent : public Event
        {
          public:
            BluetoothStatusRequestEvent() = default;
            explicit BluetoothStatusRequestEvent(int state);
        };

        class DeveloperModeRequest : public sys::DataMessage
        {


@@ 115,4 112,24 @@ namespace sdesktop
        };
    } // namespace developerMode

    namespace bluetooth
    {
        class BluetoothStatusRequestEvent : public Event
        {
          public:
            BluetoothStatusRequestEvent() = default;
            explicit BluetoothStatusRequestEvent(int state);
        };
        class ScanStartedEvent : public Event
        {
          public:
            ScanStartedEvent();
        };
        class ScanStoppedEvent : public Event
        {
          public:
            ScanStoppedEvent();
        };

    } // namespace bluetooth
} // namespace sdesktop

M test/harness/interface/defs.py => test/harness/interface/defs.py +3 -2
@@ 1,4 1,4 @@
# Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
from enum import Enum



@@ 13,7 13,8 @@ endpoint = {
    "messages": 8,
    "calllog": 9,
    "events": 10,
    "developerMode": 11
    "developerMode": 11,
    "bluetooth":12
}

method = {

M test/pytest/service-desktop/test_bluetooth.py => test/pytest/service-desktop/test_bluetooth.py +15 -8
@@ 11,23 11,30 @@ import time
@pytest.mark.service_desktop_test
def test_bluetooth(harness):

    body = {"btState": True}
    ret = harness.endpoint_request("developerMode", "put", body)
    body = {"state": True}
    ret = harness.endpoint_request("bluetooth", "get", body)
    print(ret)
    assert ret["status"] == status["OK"]
    if ret["body"]["btState"] == 0:
    if ret["body"]["state"] == 0:

        log.info("BT turned off, turning on...")
        body = {"btCommand": "on"}
        ret = harness.endpoint_request("developerMode", "put", body)
        body = {"state": "on"}
        ret = harness.endpoint_request("bluetooth", "put", body)

        time.sleep(5)
        body = {"btState": True}
        ret = harness.endpoint_request("developerMode", "put", body)
        body = {"state": True}
        ret = harness.endpoint_request("bluetooth", "get", body)

        assert ret["status"] == status["OK"]

    assert ret["body"]["btState"] == 1
    assert ret["body"]["state"] == 1

    body = {"command": "scanOn"}
    ret = harness.endpoint_request("bluetooth", "put", body)
    assert ret["body"]["scan"] == "on"

    time.sleep(1)
    body = {"command": "scanOff"}
    ret = harness.endpoint_request("bluetooth", "put", body)
    assert ret["body"]["scan"] == "off"