From f585f43504d299e2c6ce16a49fc5bed8d334f841 Mon Sep 17 00:00:00 2001 From: Bartosz Burda Date: Sun, 22 Mar 2026 19:12:59 +0100 Subject: [PATCH 1/4] feat: add /logs endpoint verification to all smoke tests Verify global /logs and per-entity /apps/{id}/logs endpoints return non-empty data in all 3 demo smoke tests. Closes #44 --- tests/smoke_test.sh | 22 ++++++++++++++++++++++ tests/smoke_test_moveit.sh | 22 ++++++++++++++++++++++ tests/smoke_test_turtlebot3.sh | 22 ++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/tests/smoke_test.sh b/tests/smoke_test.sh index e943579..5cbce61 100755 --- a/tests/smoke_test.sh +++ b/tests/smoke_test.sh @@ -64,6 +64,28 @@ else fail "GET /apps/lidar-sim/configurations returns 200" "unexpected status code" fi +section "Logs" + +if api_get "/logs"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET /logs returns non-empty items" + else + fail "GET /logs returns non-empty items" "items is empty" + fi +else + fail "GET /logs returns 200" "unexpected status code" +fi + +if api_get "/apps/lidar-sim/logs"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET /apps/lidar-sim/logs returns non-empty items" + else + fail "GET /apps/lidar-sim/logs returns non-empty items" "items is empty" + fi +else + fail "GET /apps/lidar-sim/logs returns 200" "unexpected status code" +fi + section "Fault Injection" # Inject noise fault via configuration API diff --git a/tests/smoke_test_moveit.sh b/tests/smoke_test_moveit.sh index a4a6180..78ec084 100755 --- a/tests/smoke_test_moveit.sh +++ b/tests/smoke_test_moveit.sh @@ -36,6 +36,28 @@ test_entity_discovery "areas" manipulation planning diagnostics bridge test_entity_discovery "components" panda-arm panda-gripper moveit-planning pick-place-loop gateway fault-manager diagnostic-bridge test_entity_discovery "apps" joint-state-broadcaster panda-arm-controller panda-hand-controller robot-state-publisher move-group pick-place-node medkit-gateway medkit-fault-manager diagnostic-bridge-app manipulation-monitor +section "Logs" + +if api_get "/logs"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET /logs returns non-empty items" + else + fail "GET /logs returns non-empty items" "items is empty" + fi +else + fail "GET /logs returns 200" "unexpected status code" +fi + +if api_get "/apps/medkit-gateway/logs"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET /apps/medkit-gateway/logs returns non-empty items" + else + fail "GET /apps/medkit-gateway/logs returns non-empty items" "items is empty" + fi +else + fail "GET /apps/medkit-gateway/logs returns 200" "unexpected status code" +fi + # --- Summary --- print_summary diff --git a/tests/smoke_test_turtlebot3.sh b/tests/smoke_test_turtlebot3.sh index e54a3b4..2a43611 100755 --- a/tests/smoke_test_turtlebot3.sh +++ b/tests/smoke_test_turtlebot3.sh @@ -37,6 +37,28 @@ test_entity_discovery "areas" robot navigation diagnostics bridge test_entity_discovery "components" turtlebot3-base lidar-sensor nav2-stack gateway fault-manager diagnostic-bridge-unit test_entity_discovery "apps" turtlebot3-node robot-state-publisher amcl bt-navigator controller-server planner-server velocity-smoother medkit-gateway medkit-fault-manager diagnostic-bridge anomaly-detector +section "Logs" + +if api_get "/logs"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET /logs returns non-empty items" + else + fail "GET /logs returns non-empty items" "items is empty" + fi +else + fail "GET /logs returns 200" "unexpected status code" +fi + +if api_get "/apps/medkit-gateway/logs"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET /apps/medkit-gateway/logs returns non-empty items" + else + fail "GET /apps/medkit-gateway/logs returns non-empty items" "items is empty" + fi +else + fail "GET /apps/medkit-gateway/logs returns 200" "unexpected status code" +fi + # --- Summary --- print_summary From 7581ef0f215a26f908ca133d3f9d21871ea57017 Mon Sep 17 00:00:00 2001 From: Bartosz Burda Date: Sun, 22 Mar 2026 19:56:51 +0100 Subject: [PATCH 2/4] fix: use per-entity /logs endpoints, drop non-existent global /logs The gateway only exposes logs per-entity (e.g. /apps/{id}/logs), not a global /logs endpoint. Use anomaly-detector for sensor demo (active logger) and medkit-gateway for turtlebot3/moveit. --- tests/smoke_test.sh | 18 ++++-------------- tests/smoke_test_moveit.sh | 10 ---------- tests/smoke_test_turtlebot3.sh | 10 ---------- 3 files changed, 4 insertions(+), 34 deletions(-) diff --git a/tests/smoke_test.sh b/tests/smoke_test.sh index 5cbce61..56fc97b 100755 --- a/tests/smoke_test.sh +++ b/tests/smoke_test.sh @@ -66,24 +66,14 @@ fi section "Logs" -if api_get "/logs"; then +if api_get "/apps/anomaly-detector/logs"; then if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /logs returns non-empty items" + pass "GET /apps/anomaly-detector/logs returns non-empty items" else - fail "GET /logs returns non-empty items" "items is empty" + fail "GET /apps/anomaly-detector/logs returns non-empty items" "items is empty" fi else - fail "GET /logs returns 200" "unexpected status code" -fi - -if api_get "/apps/lidar-sim/logs"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /apps/lidar-sim/logs returns non-empty items" - else - fail "GET /apps/lidar-sim/logs returns non-empty items" "items is empty" - fi -else - fail "GET /apps/lidar-sim/logs returns 200" "unexpected status code" + fail "GET /apps/anomaly-detector/logs returns 200" "unexpected status code" fi section "Fault Injection" diff --git a/tests/smoke_test_moveit.sh b/tests/smoke_test_moveit.sh index 78ec084..0b439c6 100755 --- a/tests/smoke_test_moveit.sh +++ b/tests/smoke_test_moveit.sh @@ -38,16 +38,6 @@ test_entity_discovery "apps" joint-state-broadcaster panda-arm-controller panda- section "Logs" -if api_get "/logs"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /logs returns non-empty items" - else - fail "GET /logs returns non-empty items" "items is empty" - fi -else - fail "GET /logs returns 200" "unexpected status code" -fi - if api_get "/apps/medkit-gateway/logs"; then if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then pass "GET /apps/medkit-gateway/logs returns non-empty items" diff --git a/tests/smoke_test_turtlebot3.sh b/tests/smoke_test_turtlebot3.sh index 2a43611..11c47b5 100755 --- a/tests/smoke_test_turtlebot3.sh +++ b/tests/smoke_test_turtlebot3.sh @@ -39,16 +39,6 @@ test_entity_discovery "apps" turtlebot3-node robot-state-publisher amcl bt-navig section "Logs" -if api_get "/logs"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /logs returns non-empty items" - else - fail "GET /logs returns non-empty items" "items is empty" - fi -else - fail "GET /logs returns 200" "unexpected status code" -fi - if api_get "/apps/medkit-gateway/logs"; then if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then pass "GET /apps/medkit-gateway/logs returns non-empty items" From 8c84c0f73e72c26fb941722a51991459db4ba29e Mon Sep 17 00:00:00 2001 From: Bartosz Burda Date: Sun, 22 Mar 2026 20:04:30 +0100 Subject: [PATCH 3/4] refactor: extract assert_non_empty_items helper to smoke_lib.sh DRY up the repeated api_get + jq '.items | length > 0' pattern used across data, configurations, and logs checks in all 3 demos. --- tests/smoke_lib.sh | 15 ++++++++++++++ tests/smoke_test.sh | 37 +++++++--------------------------- tests/smoke_test_moveit.sh | 10 +-------- tests/smoke_test_turtlebot3.sh | 10 +-------- 4 files changed, 24 insertions(+), 48 deletions(-) diff --git a/tests/smoke_lib.sh b/tests/smoke_lib.sh index ed7270f..30e930d 100755 --- a/tests/smoke_lib.sh +++ b/tests/smoke_lib.sh @@ -123,6 +123,21 @@ wait_for_runtime_linking() { exit 1 } +# Helper: assert endpoint returns 200 with non-empty .items array +# Usage: assert_non_empty_items "/apps/lidar-sim/data" +assert_non_empty_items() { + local endpoint="$1" + if api_get "$endpoint"; then + if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then + pass "GET ${endpoint} returns non-empty items" + else + fail "GET ${endpoint} returns non-empty items" "items is empty" + fi + else + fail "GET ${endpoint} returns 200" "unexpected status code" + fi +} + # Test entity discovery for a given entity type # Usage: test_entity_discovery "areas" "sensors processing diagnostics" test_entity_discovery() { diff --git a/tests/smoke_test.sh b/tests/smoke_test.sh index 56fc97b..e9b0ee5 100755 --- a/tests/smoke_test.sh +++ b/tests/smoke_test.sh @@ -37,44 +37,21 @@ test_entity_discovery "apps" lidar-sim imu-sim gps-sim camera-sim anomaly-detect section "Data Access" -if api_get "/apps/lidar-sim/data"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /apps/lidar-sim/data returns non-empty items" - else - fail "GET /apps/lidar-sim/data returns non-empty items" "items is empty" - fi -else - fail "GET /apps/lidar-sim/data returns 200" "unexpected status code" -fi +assert_non_empty_items "/apps/lidar-sim/data" section "Configurations" -if api_get "/apps/lidar-sim/configurations"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /apps/lidar-sim/configurations returns non-empty items" - else - fail "GET /apps/lidar-sim/configurations returns non-empty items" "items is empty" - fi - if echo "$RESPONSE" | jq -e '.items[] | select(.name == "noise_stddev")' > /dev/null 2>&1; then - pass "configurations contains 'noise_stddev' parameter" - else - fail "configurations contains 'noise_stddev' parameter" "not found in response" - fi +assert_non_empty_items "/apps/lidar-sim/configurations" + +if echo "$RESPONSE" | jq -e '.items[] | select(.name == "noise_stddev")' > /dev/null 2>&1; then + pass "configurations contains 'noise_stddev' parameter" else - fail "GET /apps/lidar-sim/configurations returns 200" "unexpected status code" + fail "configurations contains 'noise_stddev' parameter" "not found in response" fi section "Logs" -if api_get "/apps/anomaly-detector/logs"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /apps/anomaly-detector/logs returns non-empty items" - else - fail "GET /apps/anomaly-detector/logs returns non-empty items" "items is empty" - fi -else - fail "GET /apps/anomaly-detector/logs returns 200" "unexpected status code" -fi +assert_non_empty_items "/apps/anomaly-detector/logs" section "Fault Injection" diff --git a/tests/smoke_test_moveit.sh b/tests/smoke_test_moveit.sh index 0b439c6..c279dbc 100755 --- a/tests/smoke_test_moveit.sh +++ b/tests/smoke_test_moveit.sh @@ -38,15 +38,7 @@ test_entity_discovery "apps" joint-state-broadcaster panda-arm-controller panda- section "Logs" -if api_get "/apps/medkit-gateway/logs"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /apps/medkit-gateway/logs returns non-empty items" - else - fail "GET /apps/medkit-gateway/logs returns non-empty items" "items is empty" - fi -else - fail "GET /apps/medkit-gateway/logs returns 200" "unexpected status code" -fi +assert_non_empty_items "/apps/medkit-gateway/logs" # --- Summary --- diff --git a/tests/smoke_test_turtlebot3.sh b/tests/smoke_test_turtlebot3.sh index 11c47b5..1a54ffa 100755 --- a/tests/smoke_test_turtlebot3.sh +++ b/tests/smoke_test_turtlebot3.sh @@ -39,15 +39,7 @@ test_entity_discovery "apps" turtlebot3-node robot-state-publisher amcl bt-navig section "Logs" -if api_get "/apps/medkit-gateway/logs"; then - if echo "$RESPONSE" | jq -e '.items | length > 0' > /dev/null 2>&1; then - pass "GET /apps/medkit-gateway/logs returns non-empty items" - else - fail "GET /apps/medkit-gateway/logs returns non-empty items" "items is empty" - fi -else - fail "GET /apps/medkit-gateway/logs returns 200" "unexpected status code" -fi +assert_non_empty_items "/apps/medkit-gateway/logs" # --- Summary --- From f85ed012fe18944ee51031f0a3fdfc497fecafc9 Mon Sep 17 00:00:00 2001 From: Bartosz Burda Date: Sun, 22 Mar 2026 20:10:53 +0100 Subject: [PATCH 4/4] fix: use medkit-gateway for logs check in sensor demo anomaly-detector and lidar-sim don't emit /rosout logs in CI, so use medkit-gateway which always has log entries from startup. --- tests/smoke_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke_test.sh b/tests/smoke_test.sh index e9b0ee5..b4f61fa 100755 --- a/tests/smoke_test.sh +++ b/tests/smoke_test.sh @@ -51,7 +51,7 @@ fi section "Logs" -assert_non_empty_items "/apps/anomaly-detector/logs" +assert_non_empty_items "/apps/medkit-gateway/logs" section "Fault Injection"