From cb93d58d85fc9bc0e136ff7fb6fc58e092837159 Mon Sep 17 00:00:00 2001 From: Adam Dobrowolski Date: Thu, 15 Jul 2021 15:14:15 +0200 Subject: [PATCH] [CP-371] Updater miscelanous developer mode and logs changes Changed: - Runtime disabled logs which didn't add value from ServiceDesktop - Runtime disabled logs which didn't add value from SystemManager - Added possibility to change runtime logging levels - Integrated ServiceDesktop developer code a bit - it might be used as virtual base with little to no modifications for other endpoints which would result with less redundant code --- module-os/board/linux/portmacro.h | 10 ++-- .../service-desktop/CMakeLists.txt | 2 + .../service-desktop/endpoints/BaseHelper.hpp | 34 ++++++----- .../service-desktop/endpoints/Context.cpp | 29 ++++++++++ .../service-desktop/endpoints/Context.hpp | 16 +----- .../developerMode/DeveloperModeEndpoint.cpp | 21 +++++-- .../developerMode/DeveloperModeEndpoint.hpp | 13 +---- .../developerMode/DeveloperModeHelper.hpp | 2 +- .../developerMode/Mode/LogHelper.cpp | 57 +++++++++++++++++++ .../developerMode/Mode/LogHelper.hpp | 28 +++++++++ .../developerMode/Mode/UI_Helper.hpp | 2 +- .../developerMode/Mode/UpdateHelper.hpp | 2 +- .../endpoints/security/SecurityEndpoint.hpp | 3 +- .../security/SecurityEndpointHelper.hpp | 2 +- .../service-desktop/parser/ParserFSM.cpp | 10 ++-- module-sys/SystemManager/SystemManager.cpp | 2 +- module-utils/board/cross/log_rt1051.cpp | 12 ---- module-utils/board/linux/log_linux.cpp | 5 -- module-utils/log/Logger.cpp | 27 +++++++++ module-utils/log/Logger.hpp | 18 +++--- test/get_os_log.py | 8 +-- test/pytest/conftest.py | 11 +--- test/pytest/test_updater.py | 2 + test/requirements.txt | 2 + tools/requirements.txt | 3 + 25 files changed, 227 insertions(+), 94 deletions(-) create mode 100644 module-services/service-desktop/endpoints/Context.cpp create mode 100644 module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.cpp create mode 100644 module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.hpp create mode 100644 tools/requirements.txt diff --git a/module-os/board/linux/portmacro.h b/module-os/board/linux/portmacro.h index 3234aeeed551a4cb069a6fc5219b710de519d8e5..bfa222472b6f71cb82458d7350032f1e3cb68257 100644 --- a/module-os/board/linux/portmacro.h +++ b/module-os/board/linux/portmacro.h @@ -58,7 +58,7 @@ extern "C" { #endif #include -#include +#include /*----------------------------------------------------------- * Port specific definitions. @@ -149,7 +149,7 @@ extern void vPortExitCritical( void ); #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 #error We are not supporting configUSE_PORT_OPTIMISED_TASK_SELECTION in the Linux Simulator. -#endif +#endif /* Task function macros as described on the FreeRTOS.org WEB site. */ @@ -170,9 +170,9 @@ extern void vPortAddTaskHandle( void *pxTaskHandle ); #define SIG_SUSPEND SIGUSR1 #define SIG_RESUME SIGUSR2 -/* Enable the following hash defines to make use of the real-time tick where time progresses at real-time.*/ +/* Enable the following hash defines to make use of the real-time tick where time progresses at real-time.*/ #define SIG_TICK SIGALRM -#define TIMER_TYPE ITIMER_REAL +#define TIMER_TYPE ITIMER_REAL /* Enable the following hash defines to make use of the process tick where time progresses only when the process is executing. #define SIG_TICK SIGVTALRM #define TIMER_TYPE ITIMER_VIRTUAL */ @@ -180,6 +180,8 @@ extern void vPortAddTaskHandle( void *pxTaskHandle ); #define SIG_TICK SIGPROF #define TIMER_TYPE ITIMER_PROF */ +#define xPortIsInsideInterrupt() isIRQ() + #ifdef __cplusplus } #endif diff --git a/module-services/service-desktop/CMakeLists.txt b/module-services/service-desktop/CMakeLists.txt index 4d4614b1369441111a2dd445579a151d71c5abb1..548758f7e3d0a3cae263fc13cace7363ae7fcdb7 100644 --- a/module-services/service-desktop/CMakeLists.txt +++ b/module-services/service-desktop/CMakeLists.txt @@ -5,6 +5,7 @@ option(ENABLE_DEVELOPER_MODE_ENDPOINT "Enable developer mode endpoint in service set(SOURCES endpoints/BaseHelper.cpp + endpoints/Context.cpp endpoints/backup/BackupEndpoint.cpp endpoints/backup/BackupRestore.cpp endpoints/bluetooth/BluetoothEndpoint.cpp @@ -19,6 +20,7 @@ set(SOURCES endpoints/developerMode/DeveloperModeHelper.cpp endpoints/developerMode/Mode/UI_Helper.cpp endpoints/developerMode/Mode/UpdateHelper.cpp + endpoints/developerMode/Mode/LogHelper.cpp endpoints/developerMode/event/DomRequest.cpp endpoints/developerMode/event/ATRequest.cpp endpoints/deviceInfo/DeviceInfoEndpoint.cpp diff --git a/module-services/service-desktop/endpoints/BaseHelper.hpp b/module-services/service-desktop/endpoints/BaseHelper.hpp index 7e355bef6eadcb2848f6605a099b940c5013eb41..66c8fe3acdc501f0254a1d2ee38ca835471636ad 100644 --- a/module-services/service-desktop/endpoints/BaseHelper.hpp +++ b/module-services/service-desktop/endpoints/BaseHelper.hpp @@ -5,6 +5,7 @@ #include #include +#include namespace sys { @@ -35,6 +36,24 @@ namespace parserFSM public: using ProcessResult = std::pair>; + explicit BaseHelper(const std::string &name, sys::Service *p) : owner(p), p_name(name) + {} + + /// generall processing function + /// + /// we should define processing functions, not copy switch cases + /// as we are super ambiguous how we should really handle responses + /// here we can either: + /// return true - to mark that we responded on this request + /// return false - and optionally respond that we didn't handle the request + /// pre and post processing is available on pre/post process method override + [[nodiscard]] auto process(http::Method method, Context &context) -> ProcessResult; + + [[nodiscard]] auto name() const -> const std::string & + { + return p_name; + } + protected: sys::Service *owner = nullptr; /// by default - result = not sent @@ -50,18 +69,7 @@ namespace parserFSM /// post processing action - in case we want to do something after processing request virtual void postProcess(http::Method method, Context &context){}; - public: - explicit BaseHelper(sys::Service *p) : owner(p) - {} - - /// generall processing function - /// - /// we should define processing functions, not copy switch cases - /// as we are super ambiguous how we should really handle responses - /// here we can either: - /// return true - to mark that we responded on this request - /// return fale - and optionally respond that we didn't handle the request - /// pre and post processing is available on pre/post process method override - [[nodiscard]] auto process(http::Method method, Context &context) -> ProcessResult; + private: + std::string p_name; }; }; // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/Context.cpp b/module-services/service-desktop/endpoints/Context.cpp new file mode 100644 index 0000000000000000000000000000000000000000..785655b3be0be36668272c2bac40d9f0d7c66c68 --- /dev/null +++ b/module-services/service-desktop/endpoints/Context.cpp @@ -0,0 +1,29 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "Context.hpp" + +namespace parserFSM +{ + auto Context::createSimpleResponse(const std::string &entryTitle) -> std::string + { + json11::Json::object contextJsonObject = + json11::Json::object{{json::endpoint, static_cast(getEndpoint())}, + {json::status, static_cast(responseContext.status)}, + {json::uuid, getUuid()}}; + if (!responseContext.body.is_null()) { + contextJsonObject[json::body] = responseContext.body; + } + + const json11::Json responseJson{std::move(contextJsonObject)}; + + return buildResponseStr(responseJson.dump().size(), responseJson.dump()); + } + + auto Context::createErrorResponse(http::Code code, const std::string &text) -> std::string + { + setResponseStatus(code); + setResponseBody(std::map{{"error", text}}); + return createSimpleResponse(); + } +} // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/Context.hpp b/module-services/service-desktop/endpoints/Context.hpp index ab8c3b040050e88ffd8c61f11f40f899c60868b9..953e609e9e72306737cb69b0f1770655ac6bc163 100644 --- a/module-services/service-desktop/endpoints/Context.hpp +++ b/module-services/service-desktop/endpoints/Context.hpp @@ -82,20 +82,8 @@ namespace parserFSM } virtual ~Context() noexcept = default; - virtual auto createSimpleResponse(const std::string &entryTitle = json::entries) -> std::string - { - json11::Json::object contextJsonObject = - json11::Json::object{{json::endpoint, static_cast(getEndpoint())}, - {json::status, static_cast(responseContext.status)}, - {json::uuid, getUuid()}}; - if (!responseContext.body.is_null()) { - contextJsonObject[json::body] = responseContext.body; - } - - const json11::Json responseJson{std::move(contextJsonObject)}; - - return buildResponseStr(responseJson.dump().size(), responseJson.dump()); - } + virtual auto createSimpleResponse(const std::string &entryTitle = json::entries) -> std::string; + auto createErrorResponse(http::Code code, const std::string &text) -> std::string; auto setResponse(endpoint::ResponseContext r) { diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp index a2e0b47eb8f380345523bb7b8cbd50740b50c7cb..ff5b2fa606263ab65f4b247c25c64e7c18107acd 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp @@ -9,6 +9,15 @@ using namespace parserFSM; +DeveloperModeEndpoint::DeveloperModeEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr) +{ + debugName = "DeveloperModeEndpoint"; + helpers.emplace_back(std::make_unique("base", ownerServicePtr)); + helpers.emplace_back(std::make_unique("ui", ownerServicePtr)); + helpers.emplace_back(std::make_unique("update", ownerServicePtr)); + helpers.emplace_back(std::make_unique("log", ownerServicePtr)); +} + auto DeveloperModeEndpoint::handle(Context &context) -> void { auto &p = helperSwitcher(context); @@ -34,11 +43,11 @@ auto DeveloperModeEndpoint::handle(Context &context) -> void auto DeveloperModeEndpoint::helperSwitcher(parserFSM::Context &ctx) -> parserFSM::BaseHelper & { - if (ctx.getBody()["ui"] == true) { - return *uiHelper; - } - if (ctx.getBody()["update"] == true) { - return *updateHelper; + std::string name = ctx.getBody().string_value(); + if (auto s = std::find_if( + std::begin(helpers), std::end(helpers), [&name](const auto &val) { return val->name() == name; }); + s != std::end(helpers)) { + return **s; } - return *helper; + return **helpers.begin(); } diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp index 4edbf60bae5020c59f87340a63c8b2bb53418609..f7d9ad8bbfdb1f32097e884b3c390625bd900a9d 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp @@ -6,6 +6,7 @@ #include "DeveloperModeHelper.hpp" #include "Mode/UI_Helper.hpp" #include "Mode/UpdateHelper.hpp" +#include "Mode/LogHelper.hpp" #include #include @@ -26,18 +27,10 @@ namespace sys class DeveloperModeEndpoint : public parserFSM::Endpoint { private: - const std::unique_ptr helper; - const std::unique_ptr uiHelper; - const std::unique_ptr updateHelper; + std::list> helpers; public: - explicit DeveloperModeEndpoint(sys::Service *_ownerServicePtr) - : Endpoint(_ownerServicePtr), helper(std::make_unique(ownerServicePtr)), - uiHelper(std::make_unique(ownerServicePtr)), - updateHelper(std::make_unique(ownerServicePtr)) - { - debugName = "DeveloperModeEndpoint"; - } + explicit DeveloperModeEndpoint(sys::Service *_ownerServicePtr); auto handle(parserFSM::Context &context) -> void override; diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp index 60cd7134dd57db21b6ba017c9e2733a75ec92d03..d34a024907bb8b39f90fb889c3a1eaac530b40ad 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.hpp @@ -34,7 +34,7 @@ namespace parserFSM auto prepareSMS(Context &context) -> ProcessResult; public: - explicit DeveloperModeHelper(sys::Service *p) : BaseHelper(p) + explicit DeveloperModeHelper(const std::string &name, sys::Service *p) : BaseHelper(name, p) {} private: diff --git a/module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.cpp b/module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8146bc284beb6be732ae851b73025d0d5823a6c0 --- /dev/null +++ b/module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.cpp @@ -0,0 +1,57 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "LogHelper.hpp" +#include "Logger.hpp" + +namespace parserFSM +{ + auto LogHelper::processPost(Context &context) -> ProcessResult + { + const auto &body = context.getBody(); + + if (body["service"].is_string() and body["level"].is_number()) { + return setLogLevel(body["service"].string_value(), body["level"].number_value()); + } + else if (body["device"].is_string()) { + return setLogDevice(body["device"].string_value()); + } + + return {sent::no, std::nullopt}; + } + + auto LogHelper::processGet(Context &context) -> ProcessResult + { + const auto &body = context.getBody(); + if (body["service"].is_string()) { + return getLogLevel(body["service"].string_value()); + } + return {sent::no, std::nullopt}; + } + + BaseHelper::ProcessResult LogHelper::setLogLevel(const std::string &serviceName, double level) + { + if (Log::Logger::get().setLogLevel(serviceName, static_cast(level))) { + return {sent::no, endpoint::ResponseContext{.status = http::Code::OK}}; + } + else { + return {sent::no, endpoint::ResponseContext{.status = http::Code::InternalServerError}}; + } + return {sent::no, std::nullopt}; + } + + BaseHelper::ProcessResult LogHelper::setLogDevice(const std::string & /*device*/) + { + return { + sent::no, + endpoint::ResponseContext{http::Code::InternalServerError, + std::map{{"cause", "Logger is badly implemented"}}}}; + } + + BaseHelper::ProcessResult LogHelper::getLogLevel(const std::string &serviceName) + { + auto level = Log::Logger::get().getLogLevel(serviceName); + return {sent::no, endpoint::ResponseContext{http::Code::OK, std::map{{"level", level}}}}; + } + +} // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.hpp b/module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..99b149eec958dcc2cc66a1a39f6556ee7e613563 --- /dev/null +++ b/module-services/service-desktop/endpoints/developerMode/Mode/LogHelper.hpp @@ -0,0 +1,28 @@ +// 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 +#include +#include + +namespace parserFSM +{ + + class LogHelper : public BaseHelper + { + + public: + explicit LogHelper(const std::string &name, sys::Service *p) : BaseHelper(name, p) + {} + + auto processPost(Context &context) -> ProcessResult final; + auto processGet(Context &context) -> ProcessResult final; + + private: + [[nodiscard]] auto setLogLevel(const std::string &, double) -> ProcessResult; + [[nodiscard]] auto setLogDevice(const std::string &dev) -> ProcessResult; + [[nodiscard]] auto getLogLevel(const std::string &) -> ProcessResult; + }; +} // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/developerMode/Mode/UI_Helper.hpp b/module-services/service-desktop/endpoints/developerMode/Mode/UI_Helper.hpp index 38d75ac772a5a48cc726fc1bd82062eb86cbb87c..0bace42f7d028f7e87aebb159ddc3aed1f4ae875 100644 --- a/module-services/service-desktop/endpoints/developerMode/Mode/UI_Helper.hpp +++ b/module-services/service-desktop/endpoints/developerMode/Mode/UI_Helper.hpp @@ -14,7 +14,7 @@ namespace parserFSM { public: - explicit UI_Helper(sys::Service *p) : BaseHelper(p) + explicit UI_Helper(const std::string &name, sys::Service *p) : BaseHelper(name, p) {} /// returns DOM async diff --git a/module-services/service-desktop/endpoints/developerMode/Mode/UpdateHelper.hpp b/module-services/service-desktop/endpoints/developerMode/Mode/UpdateHelper.hpp index 196295d03a1cd5522f68c35fad21621ad8898486..b75ad9adb31eebebaf9c2efbc154fd5751dc9247 100644 --- a/module-services/service-desktop/endpoints/developerMode/Mode/UpdateHelper.hpp +++ b/module-services/service-desktop/endpoints/developerMode/Mode/UpdateHelper.hpp @@ -14,7 +14,7 @@ namespace parserFSM { public: - explicit UpdateHelper(sys::Service *p) : BaseHelper(p) + explicit UpdateHelper(const std::string &name, sys::Service *p) : BaseHelper(name, p) {} auto processPost(Context &context) -> ProcessResult final; diff --git a/module-services/service-desktop/endpoints/security/SecurityEndpoint.hpp b/module-services/service-desktop/endpoints/security/SecurityEndpoint.hpp index 2e62cca1bec1662b53648d950521b6b7e9e6fc3a..7304a24cc8d5debdaa83a0a826e71a9609f4a276 100644 --- a/module-services/service-desktop/endpoints/security/SecurityEndpoint.hpp +++ b/module-services/service-desktop/endpoints/security/SecurityEndpoint.hpp @@ -28,7 +28,8 @@ class SecurityEndpoint : public parserFSM::Endpoint public: explicit SecurityEndpoint(sys::Service *ownerServicePtr) - : Endpoint(ownerServicePtr), helper(std::make_unique(ownerServicePtr)) + : Endpoint(ownerServicePtr), + helper(std::make_unique("security", ownerServicePtr)) { debugName = "SecurityEndpoint"; } diff --git a/module-services/service-desktop/endpoints/security/SecurityEndpointHelper.hpp b/module-services/service-desktop/endpoints/security/SecurityEndpointHelper.hpp index 51c6470d95c80ba54eda9e901b96c618b9287eb4..d025c3d2ded0f8a5bb270e7c0b3c7e025b20b3f9 100644 --- a/module-services/service-desktop/endpoints/security/SecurityEndpointHelper.hpp +++ b/module-services/service-desktop/endpoints/security/SecurityEndpointHelper.hpp @@ -19,7 +19,7 @@ namespace parserFSM class SecurityEndpointHelper : public BaseHelper { public: - explicit SecurityEndpointHelper(sys::Service *p) : BaseHelper(p) + explicit SecurityEndpointHelper(const std::string &name, sys::Service *p) : BaseHelper(name, p) {} static constexpr auto PasscodeLength = 4; diff --git a/module-services/service-desktop/parser/ParserFSM.cpp b/module-services/service-desktop/parser/ParserFSM.cpp index 74233c75701eb8ce5ff19995609c372c62dec251..10f90412df056e17f0adef008e556a9b2cb28e00 100644 --- a/module-services/service-desktop/parser/ParserFSM.cpp +++ b/module-services/service-desktop/parser/ParserFSM.cpp @@ -58,7 +58,9 @@ void StateMachine::parseHeader() auto messageStart = receivedMsg.find(message::endpointChar); if (messageStart == std::string::npos) { - LOG_ERROR("This is not a valid endpoint message! Type=%c", receivedMsg.at(0)); + std::string message = "This is not a valid endpoint message! Type=" + receivedMsg.at(0); + LOG_ERROR("%s", message.c_str()); + messageHandler->putToSendQueue(Context().createErrorResponse(http::Code::BadRequest, message)); return; } @@ -73,13 +75,13 @@ void StateMachine::parseHeader() payloadLength = message::calcPayloadLength(header); if (payloadLength == 0) // failed to obtain payload length from msg { - LOG_ERROR("Damaged header!"); + std::string message = "Damaged header!"; + LOG_ERROR("%s", message.c_str()); + messageHandler->putToSendQueue(Context().createErrorResponse(http::Code::BadRequest, message)); state = State::NoMsg; return; } - LOG_DEBUG("Payload length: %lu", payloadLength); - message::removeHeader(receivedMsg); parseNewMessage(); } diff --git a/module-sys/SystemManager/SystemManager.cpp b/module-sys/SystemManager/SystemManager.cpp index 36bb4d0d45f7a1dbece2bfa69b7e09b32c5190f0..b43bd50341d7a3af55af51be4711b2a4c4ae5494 100644 --- a/module-sys/SystemManager/SystemManager.cpp +++ b/module-sys/SystemManager/SystemManager.cpp @@ -190,7 +190,7 @@ namespace sys LOG_INFO("Order of system services initialization:"); for (const auto &service : sortedServices) { - LOG_INFO("\t> %s", service.get().getName().c_str()); + LOG_DEBUG("\t> %s", service.get().getName().c_str()); } std::for_each(sortedServices.begin(), sortedServices.end(), [this](const auto &service) { const auto startTimeout = service.get().getStartTimeout().count(); diff --git a/module-utils/board/cross/log_rt1051.cpp b/module-utils/board/cross/log_rt1051.cpp index fdc88396f0495740a0bd6ea10fbdb6473e88b1ae..dbac8aeff4bd8915eb59b15017e8dfa992ee2fe1 100644 --- a/module-utils/board/cross/log_rt1051.cpp +++ b/module-utils/board/cross/log_rt1051.cpp @@ -13,13 +13,6 @@ /// - in critical seciton - return CRIT /// - in interrupt return - IRQ /// - else return thread name -static inline const char *getTaskDesc() -{ - return xTaskGetCurrentTaskHandle() == nullptr - ? Log::Logger::CRIT_STR - : xPortIsInsideInterrupt() ? Log::Logger::IRQ_STR : pcTaskGetName(xTaskGetCurrentTaskHandle()); -} - namespace Log { void Logger::addLogHeader(logger_level level, const char *file, int line, const char *function) @@ -43,11 +36,6 @@ namespace Log logColors->resetColor.data()); } - bool Logger::filterLogs(logger_level level) - { - return getLogLevel(getTaskDesc()) <= level; - } - void Logger::logToDevice(const char *fmt, va_list args) { loggerBufferCurrentPos = 0; diff --git a/module-utils/board/linux/log_linux.cpp b/module-utils/board/linux/log_linux.cpp index 6808506b69ad051c78bd2ca6f502f197b36d515f..7654a57c80f8f6b74c8183248a2dd3e7ccea5c53 100644 --- a/module-utils/board/linux/log_linux.cpp +++ b/module-utils/board/linux/log_linux.cpp @@ -28,11 +28,6 @@ namespace Log logColors->resetColor.data()); } - bool Logger::filterLogs(logger_level _level) - { - return _level >= level; - } - void Logger::logToDevice(const char *, va_list) { assert(false && "Not implemented"); diff --git a/module-utils/log/Logger.cpp b/module-utils/log/Logger.cpp index d07e150ec1ca7f44bc4db0fff8120b661044a98b..6e00f57a5b42f927ab26c4da0ee0085293345f01 100644 --- a/module-utils/log/Logger.cpp +++ b/module-utils/log/Logger.cpp @@ -6,6 +6,7 @@ #include #include "LockGuard.hpp" #include +#include #include "macros.h" namespace Log @@ -19,6 +20,8 @@ namespace Log {"ServiceFota", logger_level::LOGINFO}, {"ServiceEink", logger_level::LOGINFO}, {"ServiceDB", logger_level::LOGINFO}, + {"ServiceDesktop_w2", logger_level::LOGINFO}, + {"SysMgrService", logger_level::LOGERROR}, {CRIT_STR, logger_level::LOGTRACE}, {IRQ_STR, logger_level::LOGTRACE}}; const char *Logger::levelNames[] = {"TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"}; @@ -26,6 +29,13 @@ namespace Log Logger::Logger() : circularBuffer(circularBufferSize) {} + const char *Logger::getTaskDesc() + { + return xTaskGetCurrentTaskHandle() == nullptr + ? Log::Logger::CRIT_STR + : xPortIsInsideInterrupt() ? Log::Logger::IRQ_STR : pcTaskGetName(xTaskGetCurrentTaskHandle()); + } + void Logger::enableColors(bool enable) { LockGuard lock(mutex); @@ -40,9 +50,26 @@ namespace Log auto Logger::getLogLevel(const std::string &name) -> logger_level { + LockGuard lock(mutex); + if (auto it = filtered.find(name); it != std::end(filtered)) { + return it->second; + } + filtered[name] = logger_level::LOGTRACE; return filtered[name]; } + bool Logger::setLogLevel(const std::string &name, logger_level level) + { + LockGuard lock(mutex); + filtered[name] = level; + return true; + } + + bool Logger::filterLogs(logger_level level) + { + return getLogLevel(getTaskDesc()) <= level; + } + auto Logger::getLogs() -> std::string { LockGuard lock(mutex); diff --git a/module-utils/log/Logger.hpp b/module-utils/log/Logger.hpp index 87c78eafa1ab0a26ee86d0c6aeaf40158de3e571..fb4ac387432e87c6cd251a136ee6a87e8d18295a 100644 --- a/module-utils/log/Logger.hpp +++ b/module-utils/log/Logger.hpp @@ -39,21 +39,25 @@ namespace Log static constexpr auto CRIT_STR = "CRIT"; static constexpr auto IRQ_STR = "IRQ"; + /// Filter out not interesting logs via thread Name + /// its' using fact that: + /// - TRACE is level 0, for undefined lookups it will be always trace + /// - it will be one time init for apps which doesn't tell what level they should have + /// - for others it will be o1 lookup so it's fine + /// this function appends to logged services list! + [[nodiscard]] auto getLogLevel(const std::string &name) -> logger_level; + bool setLogLevel(const std::string &name, logger_level); + void logToDevice(const char *fmt, va_list args); + private: Logger(); + const char *getTaskDesc(); void addLogHeader(logger_level level, const char *file = nullptr, int line = -1, const char *function = nullptr); [[nodiscard]] bool filterLogs(logger_level level); - /// Filter out not interesting logs via thread Name - /// its' using fact that: - /// - TRACE is level 0, for unedfined lookups it will be alvways trace - /// - it will be one time init for apps which doesn't tell what level they should have - /// - for others it will be o1 lookup so it's fine - [[nodiscard]] auto getLogLevel(const std::string &name) -> logger_level; - void logToDevice(const char *fmt, va_list args); void logToDevice(Device device, std::string_view logMsg, size_t length); [[nodiscard]] size_t loggerBufferSizeLeft() const noexcept { diff --git a/test/get_os_log.py b/test/get_os_log.py index 2803ba380bb2dc4dd8e115fb81357126a6d700ab..3839c2c246d9cc348f84be21d0ce4737a6866906 100755 --- a/test/get_os_log.py +++ b/test/get_os_log.py @@ -6,6 +6,7 @@ import sys import os.path import atexit +from harness import log from harness.harness import Harness from harness.interface.error import TestError, Error from harness.api.developermode import PhoneModeLock @@ -21,14 +22,13 @@ def set_passcode(harness: Harness, flag: bool): def main(): if len(sys.argv) == 1: - print( - f'Please pass log storage directory as the parameter: \'python {sys.argv[0]} \' ') + log.error(f'Please pass log storage directory as the parameter: \'python {sys.argv[0]} \' ') raise TestError(Error.OTHER_ERROR) log_dir = str(sys.argv[1]) if (not os.path.exists(log_dir)): - print(f'Log storage directory {log_dir} not found') + log.error(f'Log storage directory {log_dir} not found') raise TestError(Error.OTHER_ERROR) harness = Harness.from_detect() @@ -43,5 +43,5 @@ if __name__ == "__main__": try: main() except TestError as err: - print(err) + log.error(err) exit(err.get_error_code()) diff --git a/test/pytest/conftest.py b/test/pytest/conftest.py index 31cae82464458f7802925bdb63f9aceb3a50e135..7f1f5c20d5a94eac61c7c56b745a39ec237dde64 100644 --- a/test/pytest/conftest.py +++ b/test/pytest/conftest.py @@ -16,6 +16,7 @@ from harness import utils from harness.interface.error import TestError, Error from harness.interface.CDCSerial import Keytype, CDCSerial as serial from harness.interface.defs import key_codes +from harness.rt_harness_discovery import get_rt1051_harness simulator_port = 'simulator' @@ -68,16 +69,8 @@ def harness(request): try: if port_name is None: log.warning("no port provided! trying automatic detection") - harness = None + harness = get_rt1051_harness(TIMEOUT) - with utils.Timeout.limit(seconds=TIMEOUT): - while not harness: - try: - harness = Harness.from_detect() - except TestError as e: - if e.get_error_code() == Error.PORT_NOT_FOUND: - log.info(f"waiting for a serial port… ({TIMEOUT- int(time.time() - timeout_started)})") - time.sleep(RETRY_EVERY_SECONDS) else: assert '/dev' in port_name or simulator_port in port_name diff --git a/test/pytest/test_updater.py b/test/pytest/test_updater.py index 8c2fa42fdf324949117fff42e290dcb46e8984a2..e8333c00fadfe7db41a9bea5c8e5405f85120d48 100644 --- a/test/pytest/test_updater.py +++ b/test/pytest/test_updater.py @@ -33,6 +33,8 @@ def disable_some_logs(harness: Harness): def test_update(harness: Harness): filename = "update.tar" + disable_some_logs(harness) + log.info(get_version(harness)) PhoneModeLock(False).run(harness) put_file(harness, filename, "/sys/user/") diff --git a/test/requirements.txt b/test/requirements.txt index f1e0b10d7de59e1f819a722f896a596084ef57d8..70ea3796fe08cb0e90d5d819b3e75d2c8c26e696 100644 --- a/test/requirements.txt +++ b/test/requirements.txt @@ -8,3 +8,5 @@ pyserial==3.5 pytest==6.1.2 six==1.15.0 toml==0.10.2 +tqdm=4.59.0 +dataclass_json=1.3.7 diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..53803e5f14ddb022f2399d43578f843ad4c80fcd --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,3 @@ +gitdb==4.0.5 +requests==2.25.1 +tqdm==4.59.0