From 0fad72313568af2b82161eb832edfa2b97569c19 Mon Sep 17 00:00:00 2001 From: SP2FET Date: Wed, 27 Jan 2021 22:18:16 +0100 Subject: [PATCH] [EGD-5457] Add harness test for bluetooth on/off There is no functional tests related to the Bluetooth. As the refactor is on the way,we need to have a tool to check if it works By the way fixed worker deinit --- .../Bluetooth/BluetoothWorker.cpp | 6 ++-- .../Bluetooth/BluetoothWorker.hpp | 2 +- .../Bluetooth/interface/BluetoothDriver.cpp | 2 ++ .../service-bluetooth/CMakeLists.txt | 1 + .../service-bluetooth/ServiceBluetooth.cpp | 23 ++++++++++--- .../service-bluetooth/BluetoothMessage.hpp | 2 +- .../service-desktop/DesktopMessages.cpp | 7 ++++ .../developerMode/DeveloperModeHelper.cpp | 22 +++++++++++++ .../developerMode/DeveloperModeHelper.hpp | 3 ++ .../service-desktop/DesktopMessages.hpp | 7 ++++ test/pytest/conftest.py | 2 +- test/pytest/service-desktop/test_bluetooth.py | 33 +++++++++++++++++++ 12 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 test/pytest/service-desktop/test_bluetooth.py diff --git a/module-bluetooth/Bluetooth/BluetoothWorker.cpp b/module-bluetooth/Bluetooth/BluetoothWorker.cpp index 14ac6834995b6038245ebb91126c80fda44314a5..bcae4ba3062b4242c8a36455bfc2770e68dad6a6 100644 --- a/module-bluetooth/Bluetooth/BluetoothWorker.cpp +++ b/module-bluetooth/Bluetooth/BluetoothWorker.cpp @@ -89,8 +89,6 @@ auto BluetoothWorker::run() -> bool bluetooth::GAP::set_visibility( std::visit(bluetooth::BoolVisitor(), settings->getValue(bluetooth::Settings::Visibility))); - settings->setValue(bluetooth::Settings::State, static_cast(BluetoothStatus::State::On)); - settings->onLinkKeyAdded = [this](std::string addr) { for (auto &device : bluetooth::GAP::devices) { if (bd_addr_to_str(device.address) == addr) { @@ -290,3 +288,7 @@ void BluetoothWorker::setDeviceAddress(bd_addr_t addr) bluetooth::GAP::do_pairing(addr); currentProfile->setDeviceAddress(addr); } +auto BluetoothWorker::deinit() -> bool +{ + return Worker::deinit(); +} diff --git a/module-bluetooth/Bluetooth/BluetoothWorker.hpp b/module-bluetooth/Bluetooth/BluetoothWorker.hpp index 3b9fff0a4a85c124ee763bbdcae34f9cfc95074d..3ff2af048aa65c781fe6162953a454e16d3a81e7 100644 --- a/module-bluetooth/Bluetooth/BluetoothWorker.hpp +++ b/module-bluetooth/Bluetooth/BluetoothWorker.hpp @@ -117,7 +117,7 @@ class BluetoothWorker : private sys::Worker unsigned long active_features; void stopScan(); void setDeviceAddress(bd_addr_t addr); - + auto deinit() -> bool override; std::shared_ptr currentProfile; std::shared_ptr settings; std::vector pairedDevices; diff --git a/module-bluetooth/Bluetooth/interface/BluetoothDriver.cpp b/module-bluetooth/Bluetooth/interface/BluetoothDriver.cpp index 602da5dcd26becd90119b9c2fe31904618c1a767..7d9c0f800372f823e7f8ce796c148a6040f7de87 100644 --- a/module-bluetooth/Bluetooth/interface/BluetoothDriver.cpp +++ b/module-bluetooth/Bluetooth/interface/BluetoothDriver.cpp @@ -91,6 +91,8 @@ namespace bluetooth } gap_local_bd_addr(addr); LOG_INFO("BTstack up and running at %s", bd_addr_to_str(addr)); + bluetooth::KeyStorage::settings->setValue(bluetooth::Settings::State, + static_cast(BluetoothStatus::State::On)); break; case HCI_EVENT_COMMAND_COMPLETE: if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_local_name)) { diff --git a/module-services/service-bluetooth/CMakeLists.txt b/module-services/service-bluetooth/CMakeLists.txt index 70ad0d0b88dfa577656c260d26ce3f440732525e..983d471f342dd4e12cf1d4ec327f52e2c183f386 100644 --- a/module-services/service-bluetooth/CMakeLists.txt +++ b/module-services/service-bluetooth/CMakeLists.txt @@ -19,5 +19,6 @@ target_include_directories(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME} PUBLIC module-bluetooth + service-desktop module-sys ) diff --git a/module-services/service-bluetooth/ServiceBluetooth.cpp b/module-services/service-bluetooth/ServiceBluetooth.cpp index 1be42b15800afaf00ba27f17adffb8847f9d2c8f..f246d52f3d66fe1ec59df964a5b35c18d5ad1b50 100644 --- a/module-services/service-bluetooth/ServiceBluetooth.cpp +++ b/module-services/service-bluetooth/ServiceBluetooth.cpp @@ -21,6 +21,8 @@ #include #include +#include +#include ServiceBluetooth::ServiceBluetooth() : sys::Service(service::name::bluetooth) { @@ -80,11 +82,24 @@ sys::ReturnCodes ServiceBluetooth::InitHandler() return std::make_shared(btStatus); }); + connect(sdesktop::developerMode::DeveloperModeRequest(), [&](sys::Message *msg) { + using namespace sdesktop::developerMode; + auto req = static_cast(msg); + if (typeid(*req->event) == typeid(BluetoothStatusRequestEvent)) { + auto state = std::visit(bluetooth::IntVisitor(), settingsHolder->getValue(bluetooth::Settings::State)); + auto event = std::make_unique(state); + auto message = std::make_shared(std::move(event)); + sys::Bus::SendUnicast(std::move(message), service::name::service_desktop, this); + } + + return sys::MessageNone{}; + }); + settingsHolder->onStateChange = [this]() { - auto initialState = - std::visit(bluetooth::IntVisitor(), this->settingsHolder->getValue(bluetooth::Settings::State)); + auto initialState = std::visit(bluetooth::IntVisitor(), settingsHolder->getValue(bluetooth::Settings::State)); if (static_cast(initialState) == BluetoothStatus::State::On) { - this->worker->run(); + settingsHolder->setValue(bluetooth::Settings::State, static_cast(BluetoothStatus::State::Off)); + worker->run(); } }; @@ -93,7 +108,7 @@ sys::ReturnCodes ServiceBluetooth::InitHandler() sys::ReturnCodes ServiceBluetooth::DeinitHandler() { - + worker->deinit(); return sys::ReturnCodes::Success; } diff --git a/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp b/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp index a4ce11ffa1801a51ff014b279d3a3f78d4c9c885..9ffbe1927552c116c18082df602752aa0ebc6d79 100644 --- a/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp +++ b/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp @@ -23,8 +23,8 @@ struct BluetoothStatus { enum class State { - On, Off, + On, Error, None } state; diff --git a/module-services/service-desktop/DesktopMessages.cpp b/module-services/service-desktop/DesktopMessages.cpp index e8832206c0d95fd685fdc908f87de9a70fc23013..0a948c6b18bc473d7b9109a065bf77fc7cfbe575 100644 --- a/module-services/service-desktop/DesktopMessages.cpp +++ b/module-services/service-desktop/DesktopMessages.cpp @@ -40,4 +40,11 @@ namespace sdesktop::developerMode DeveloperModeRequest::DeveloperModeRequest() : sys::DataMessage(MessageType::DeveloperModeRequest) {} + BluetoothStatusRequestEvent::BluetoothStatusRequestEvent(int state) + { + context.setResponseStatus(http::Code::OK); + context.setEndpoint(EndpointType::developerMode); + context.setResponseBody(json11::Json::object{{json::developerMode::btState, state}}); + } + } // namespace sdesktop::developerMode diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp index b68e45a315657b8fc18e46688b701cae1484471c..54388ecd79305123a396691655fb4d3823e1470c 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,27 @@ auto DeveloperModeHelper::processPutRequest(Context &context) -> sys::ReturnCode auto msg = std::make_shared(std::move(event)); sys::Bus::SendUnicast(std::move(msg), "ApplicationDesktop", ownerServicePtr); } + else if (body[json::developerMode::btState].bool_value()) { + + auto event = std::make_unique(); + auto msg = std::make_shared(std::move(event)); + sys::Bus::SendUnicast(std::move(msg), "ServiceBluetooth", ownerServicePtr); + } + 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::Stop; + LOG_INFO("turning off BT from harness!"); + } + std::shared_ptr msg = std::make_shared(request); + sys::Bus::SendUnicast(std::move(msg), "ServiceBluetooth", ownerServicePtr); + + MessageHandler::putToSendQueue(context.createSimpleResponse()); + } else { context.setResponseStatus(http::Code::BadRequest); MessageHandler::putToSendQueue(context.createSimpleResponse()); diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp index 2842eb073fb30867053265e29c4b2774a4335a71..402cdc195c7a533bc340dbbffa6fafa94c2e5890 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp @@ -39,5 +39,8 @@ 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"; } } // namespace parserFSM diff --git a/module-services/service-desktop/service-desktop/DesktopMessages.hpp b/module-services/service-desktop/service-desktop/DesktopMessages.hpp index 3ef7a9bb2210d7b72a60832d1c97389115a7c55d..55f34cbc80e83e676b59abbe811229a3d9401ff1 100644 --- a/module-services/service-desktop/service-desktop/DesktopMessages.hpp +++ b/module-services/service-desktop/service-desktop/DesktopMessages.hpp @@ -98,6 +98,13 @@ namespace sdesktop explicit ScreenlockCheckEvent(bool isLocked); }; + class BluetoothStatusRequestEvent : public Event + { + public: + BluetoothStatusRequestEvent() = default; + explicit BluetoothStatusRequestEvent(int state); + }; + class DeveloperModeRequest : public sys::DataMessage { public: diff --git a/test/pytest/conftest.py b/test/pytest/conftest.py index 1f540ae636091426117fcffc1df1a7331466bb2d..e74247511cafdb617aa42e5fa2839f2dd8e78434 100644 --- a/test/pytest/conftest.py +++ b/test/pytest/conftest.py @@ -54,7 +54,7 @@ def harness(request): Try to init one Pure phone with serial port path or automatically ''' port_name = request.config.option.port - TIMEOUT = min(1, request.config.option.timeout) + TIMEOUT = max(1, request.config.option.timeout) timeout_started = time.time() RETRY_EVERY_SECONDS = 1.0 diff --git a/test/pytest/service-desktop/test_bluetooth.py b/test/pytest/service-desktop/test_bluetooth.py new file mode 100644 index 0000000000000000000000000000000000000000..6f1079ce4c21168c6ccf4b5525229fb7e26bcb83 --- /dev/null +++ b/test/pytest/service-desktop/test_bluetooth.py @@ -0,0 +1,33 @@ +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +import pytest +from harness.interface.defs import status +from harness import log +import time + + +@pytest.mark.rt1051 +@pytest.mark.service_desktop_test +def test_bluetooth(harness): + + body = {"btState": True} + ret = harness.endpoint_request("developerMode", "put", body) + print(ret) + assert ret["status"] == status["OK"] + if ret["body"]["btState"] == 0: + + log.info("BT turned off, turning on...") + body = {"btCommand": "on"} + ret = harness.endpoint_request("developerMode", "put", body) + + time.sleep(5) + body = {"btState": True} + ret = harness.endpoint_request("developerMode", "put", body) + + assert ret["status"] == status["OK"] + + assert ret["body"]["btState"] == 1 + + +