diff --git a/CMakeLists.txt b/CMakeLists.txt index d6eab38..37be508 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.16) if(TgtEnv STREQUAL "Host") message("Using Host-Branch") + enable_testing() add_subdirectory("test/unitOnHost") elseif(TgtEnv STREQUAL "Target") # add_subdirectory("test/unitOnTarget") diff --git a/components/spit/uTest/spitProcessorTest.cpp b/components/spit/uTest/spitProcessorTest.cpp index 3c5dbdb..f3be48e 100644 --- a/components/spit/uTest/spitProcessorTest.cpp +++ b/components/spit/uTest/spitProcessorTest.cpp @@ -27,7 +27,7 @@ class ClientMock { cbEvents.push(fmt::format("{}: {} {} {} {}", (int)event, isRemote, sType.getID(), sType.Name.get(), sType.GroupName.get())); } void onSpitObject(SProcessor::ObjectEvent event, bool isRemote, const SType &sType, const SObject &sObject) { - cbEvents.push(fmt::format("{}: {} {} {} {} {}", (int)event, isRemote, sType.getID(), sType.Name.get(), sObject.Name.get(), sObject.getID())); + cbEvents.push(fmt::format("{}: {} {} {} {} {}", (int)event, isRemote, sType.getID(), sType.Name.get(), sObject.Name.get(), sObject.getID())); } void onPlay(string playerID, string playerName, char playerType, bool playerIsRunning, uint64_t timeFrames) { } @@ -46,6 +46,8 @@ class ClientMock { class SpitClientFix { protected: + std::vector messages; + ClientMock client; SProcessor::Callbacks callbacks{ .onServerEvent = [&](SProcessor::ServerEvent event, const SadDetectedServer &detectedServer) { client.onServerEvent(event, detectedServer); }, @@ -58,17 +60,18 @@ class SpitClientFix { .onPlayRemoteObjectStatus = [&](const SType &t, const SObject &o, uint64_t p_FrameInsideObject, int value) { client.onPlayRemoteObjectStatus(t, o, p_FrameInsideObject, value); }, .onCheckSpitTypeVeto = [&](bool knownType, bool createdByClient) { return client.onCheckSpitTypeVeto(knownType, createdByClient); }, .onCheckSpitObjectVeto = [&](bool knownType) { return client.onCheckSpitObjectVeto(knownType); }}; - SProcessor::InternalCallbacks intCallbacks { - .delay = [&](int ms){ return ; }, - .sendMessage = [&](Message::OPPart &msg){ return 0; }, - .sendTypeInternal = [&](SType &sType) { return 0; }, - .sendObjectInternal = [&](SObject *sObject) { return 0; } - }; + SProcessor::InternalCallbacks intCallbacks{ + .delay = [&](int ms) { return; }, + .sendMessage = [&](Message::OPPart &msg) { return 0; }, + .parseMessage = [&](Message &msg) { + // auto o = fmt::format("msg-{}", msg.getHeader()->getMessageNumber()); + // messages.push_back(o); + }, + }; SProcessor sut{"sut", "sutProj", "dev", "##GUID##", callbacks, intCallbacks}; }; TEST_CASE_FIXTURE(SpitClientFix, "Spit types") { - { Message::ReportType t; t.setConfirmed(false); @@ -174,3 +177,174 @@ TEST_CASE_FIXTURE(SpitClientFix, "Spit types") { cbEvents.pop(); CHECK(cbEvents.empty()); } + +TEST_CASE_FIXTURE(SpitClientFix, "Message Counter") { + Message::ReportType t1; + t1.setID("type#1"); + t1.setServerRemote(true); + auto m1 = sut.createMessage(t1); + + Message::ReportType t2; + t2.setID("type#2"); + t2.setServerRemote(true); + auto m2 = sut.createMessage(t2); + + Message::ReportType t3; + t3.setID("type#3"); + t3.setServerRemote(true); + auto m3 = sut.createMessage(t3); + + Message::ReportType t4; + t4.setID("type#4"); + t4.setServerRemote(true); + auto m4 = sut.createMessage(t4); + + Message::ReportType t5; + t5.setID("type#5"); + t5.setServerRemote(true); + auto m5 = sut.createMessage(t5); + + Message::ReportType t6; + t6.setID("type#6"); + t6.setServerRemote(true); + auto m6 = sut.createMessage(t6); + + CHECK(cbEvents.empty()); + SUBCASE("Normal order") { + REQUIRE(cbEvents.size() == 0); + sut.checkParseMessageData(m1); + CHECK_MESSAGE(cbEvents.front() == "0: true type#1 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m2); + CHECK_MESSAGE(cbEvents.front() == "0: true type#2 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m3); + CHECK_MESSAGE(cbEvents.front() == "0: true type#3 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m4); + CHECK_MESSAGE(cbEvents.front() == "0: true type#4 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + } + + CHECK(cbEvents.empty()); + SUBCASE("overtakes one") { + REQUIRE(cbEvents.size() == 0); + sut.checkParseMessageData(m1); + CHECK_MESSAGE(cbEvents.front() == "0: true type#1 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m3); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m2); + CHECK_MESSAGE(cbEvents.front() == "0: true type#2 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#3 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m4); + CHECK_MESSAGE(cbEvents.front() == "0: true type#4 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + } + + CHECK(cbEvents.empty()); + SUBCASE("overtakes two") { + REQUIRE(cbEvents.size() == 0); + sut.checkParseMessageData(m1); + CHECK_MESSAGE(cbEvents.front() == "0: true type#1 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m4); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m2); + CHECK_MESSAGE(cbEvents.front() == "0: true type#2 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m3); + CHECK_MESSAGE(cbEvents.front() == "0: true type#3 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#4 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m5); + CHECK_MESSAGE(cbEvents.front() == "0: true type#5 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + } + + CHECK(cbEvents.empty()); + SUBCASE("many overtakes") { + REQUIRE(cbEvents.size() == 0); + sut.checkParseMessageData(m1); + CHECK_MESSAGE(cbEvents.front() == "0: true type#1 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m5); + CHECK(cbEvents.empty()); + sut.checkParseMessageData(m6); + CHECK(cbEvents.empty()); + sut.checkParseMessageData(m4); + CHECK(cbEvents.empty()); + sut.checkParseMessageData(m3); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m2); + CHECK_MESSAGE(cbEvents.front() == "0: true type#2 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#3 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#4 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#5 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#6 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + } + + CHECK(cbEvents.empty()); + SUBCASE("reverse order") { + REQUIRE(cbEvents.size() == 0); + sut.checkParseMessageData(m1); + CHECK_MESSAGE(cbEvents.front() == "0: true type#1 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m6); + CHECK(cbEvents.empty()); + sut.checkParseMessageData(m5); + CHECK(cbEvents.empty()); + sut.checkParseMessageData(m4); + CHECK(cbEvents.empty()); + sut.checkParseMessageData(m3); + CHECK(cbEvents.empty()); + + sut.checkParseMessageData(m2); + CHECK_MESSAGE(cbEvents.front() == "0: true type#2 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#3 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#4 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#5 ", cbEvents.front()); + cbEvents.pop(); + CHECK_MESSAGE(cbEvents.front() == "0: true type#6 ", cbEvents.front()); + cbEvents.pop(); + CHECK(cbEvents.empty()); + } +} \ No newline at end of file diff --git a/components/spit/uTest/spitProcessor_complexTest.cpp b/components/spit/uTest/spitProcessor_complexTest.cpp index 9c0ef85..0a39a93 100644 --- a/components/spit/uTest/spitProcessor_complexTest.cpp +++ b/components/spit/uTest/spitProcessor_complexTest.cpp @@ -61,8 +61,7 @@ class SpitClientCmplsFix { SProcessor::InternalCallbacks intCallbacks { .delay = [&](int ms){ return ; }, .sendMessage = [&](Message::OPPart &msg){ return 0; }, - .sendTypeInternal = [&](SType &sType) { return 0; }, - .sendObjectInternal = [&](SObject *sObject) { return 0; } + .parseMessage = [&](Message &msg) { }, }; SProcessor sut{"sut", "sutProj", "dev", "##GUID##", callbacks, intCallbacks}; }; diff --git a/components/watchFace/include/watchFace.hpp b/components/watchFace/include/watchFace.hpp index ef3f457..7d502ac 100644 --- a/components/watchFace/include/watchFace.hpp +++ b/components/watchFace/include/watchFace.hpp @@ -3,16 +3,17 @@ #include "stepperDrv.hpp" #include "stepperMotor.hpp" #include -#include "syslog.hpp" +#include "logging.hpp" class WatchMotor { static constexpr uint8_t Positions = 6; public: using AlmostFinishedCb = void (*)(uint8_t newIdx); - WatchMotor(IStepperMotor &stepper, AlmostFinishedCb onDone) + WatchMotor(IStepperMotor &stepper, AlmostFinishedCb onDone, ILogging &logger) : _stepper(stepper), - _onFinCb(onDone) { + _onFinCb(onDone), + _logger(logger) { } void moveTo(uint8_t position, uint8_t profile, int minJumps, float accel, float speed) { @@ -46,9 +47,9 @@ class WatchMotor { ESP_LOGD("MV", "Moving to %d by %.2f + %.2f", sign, delta, corr); _stepper.moveBy(delta + corr, profile, accel, speed, [&](int diff) { - Syslog::logv(Syslog::Severity::Debug,"Almost done with head=%i",diff); + _logger.logv(ILogging::Severity::Debug,"Almost done with head=%i",diff); if (diff < 6) { - Syslog::logv(Syslog::Severity::Warning,"Low headroom in Profile pipeline=%i",diff); + _logger.logv(ILogging::Severity::Warning,"Low headroom in Profile pipeline=%i",diff); } if (_onFinCb) { @@ -65,4 +66,5 @@ class WatchMotor { IStepperMotor &_stepper; uint8_t _currentIndex{}; AlmostFinishedCb _onFinCb{}; + ILogging &_logger; }; diff --git a/components/watchFace/uTest/CMakeLists.txt b/components/watchFace/uTest/CMakeLists.txt index e3852fa..78fbf2b 100644 --- a/components/watchFace/uTest/CMakeLists.txt +++ b/components/watchFace/uTest/CMakeLists.txt @@ -1,4 +1,5 @@ UnitTestsFrame() target_link_libraries(${moduleName} PUBLIC devHal + bases ) \ No newline at end of file diff --git a/components/watchFace/uTest/WatchFaceUTest.cpp b/components/watchFace/uTest/WatchFaceUTest.cpp index 79f8f96..9ef3476 100644 --- a/components/watchFace/uTest/WatchFaceUTest.cpp +++ b/components/watchFace/uTest/WatchFaceUTest.cpp @@ -37,6 +37,12 @@ class StepperMotorMock : public IStepperMotor { float nextPos{}; }; +class LoggerMock : public ILogging { + void output(Severity severity, std::string message) override { + // do nothing + } +}; + void onFin(uint8_t idx) { } @@ -47,7 +53,8 @@ class WatchFaceFixture { protected: static constexpr int MicroSteps = 32; StepperMotorMock motor; - WatchMotor sut{motor, onFin}; + LoggerMock logger; + WatchMotor sut{motor, onFin, logger}; private: }; diff --git a/core b/core index 14491fb..37e288c 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 14491fb9c745bb3a2b716ac20071897fe06bdf35 +Subproject commit 37e288c012fbe3e210201cb6cfe3503fc259f299 diff --git a/main/watchMain.cpp b/main/watchMain.cpp index e4e9882..ac7099b 100644 --- a/main/watchMain.cpp +++ b/main/watchMain.cpp @@ -513,7 +513,7 @@ void LightingTask() { }; while (true) { - auto onPos = pictoIllumQue.dequeue(0); + auto onPos = pictoIllumQue.tryDequeue(); if (onPos) { ESP_LOGI(TAG, "Changing picto-Illum to pos = %i", onPos->pos); ESP_LOGI(TAG, "Current color set r%i g%i b%i ", @@ -585,10 +585,11 @@ void MovementTask() { StepperMotor stepper(stepperCfg, stepperDriver, initSens); + SyslogInst logger; WatchMotor watch(stepper, [](uint8_t newPos) { pictoIllumQue.enqueue(std::make_unique(newPos)); responseQueue.enqueue(std::make_unique(ResponseType::StepAt, newPos)); - }); + }, logger); ESP_LOGI("Stepper", "Find Home"); stepper.findRef(); @@ -653,7 +654,7 @@ void MovementTask() { int delay = Random::randomWithIn(2000,3000)/portTICK_PERIOD_MS; Syslog::logv(Syslog::Severity::Informational, "ShuffleMode Wait for %i", delay); - auto cmd = commandQueue.dequeue(delay); + auto cmd = commandQueue.tryDequeueFor(delay); if (cmd) { if (cmd->type != MoveType::Shuffle) { commandQueue.enqueue(std::move(cmd)); diff --git a/main/watchMain.hpp b/main/watchMain.hpp index d63e406..3d905ae 100644 --- a/main/watchMain.hpp +++ b/main/watchMain.hpp @@ -41,22 +41,6 @@ #include "mqttClient.hpp" #include "watchFace.hpp" #include "random.hpp" - -// #include "esp_chip_info.h" -// #include "esp_flash.h" -// #include "esp_ota_ops.h" -// #include "esp_partition.h" -// #include "esp_random.h" -// #include "esp_system.h" -// #include "fileSystem.hpp" -// #include "lwip/apps/netbiosns.h" -// #include "mdns.h" -// #include "soc/soc_caps.h" -// #include "systemFunctions.hpp" -// #include -// #include -// #include - #include "sad_DetectedServer.hpp" #include "spit_object.hpp" #include "spit_player.hpp" diff --git a/makefile b/makefile new file mode 100644 index 0000000..8f13d29 --- /dev/null +++ b/makefile @@ -0,0 +1,20 @@ + +.PHONY: start test clean + +start: + ./startCode + +# testConfig: buildTestOnTarget + +test: + cmake -DTgtEnv:STRING=Target -S . -B buildTestOnTarget + cmake --build buildTestOnTarget --parallel + idf.py -B buildTestOnTarget -p /dev/ttyACM0 flash monitor + +uTest: + cmake -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ -DTgtEnv:STRING=Host -S . -B buildUTest + cmake --build buildUTest --parallel + ctest --test-dir buildUTest + +clean: + rm -rf build buildTestOnTarget diff --git a/test/unitOnHost/CMakeLists.txt b/test/unitOnHost/CMakeLists.txt index f73877d..ba2839b 100644 --- a/test/unitOnHost/CMakeLists.txt +++ b/test/unitOnHost/CMakeLists.txt @@ -1,12 +1,12 @@ cmake_minimum_required(VERSION 3.16) +project(UnitTests) include(../../core/test/unitOnHost/test_core.cmake) UnitTestSetup() -enable_testing() -project(UnitTests) addSubDirs_ofRoot("${CMAKE_CURRENT_LIST_DIR}/../../components") addSubDirs_ofRoot("${CMAKE_CURRENT_LIST_DIR}/../../core/components") add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/../../core/test/unitOnHost/hwMock" hwMock) -# add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/../../core/test/unitOnHost/freeRtos" freeRtos) +add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/../../core/test/unitOnHost/netMock" netMock) +add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/../../core/test/unitOnHost/osMock" osMock)