diff --git a/src/network/ConfigHttpServer.cpp b/src/network/ConfigHttpServer.cpp index 8e1de29..b6ba65f 100644 --- a/src/network/ConfigHttpServer.cpp +++ b/src/network/ConfigHttpServer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include namespace network { @@ -191,6 +192,10 @@ private: } double value = body.at("value").get(); + if (!(value > 0.0) || !std::isfinite(value)) { + return send_response(json_response(req_, http::status::bad_request, + json{{"status", "error"}, {"message", "Invalid value: must be a finite number greater than 0"}})); + } double oldValue = 0.0; bool updated = false; const char* field = nullptr; @@ -212,7 +217,7 @@ private: json{{"status", "error"}, {"message", "Failed to update config"}})); } - Logger::info("Updated runway ", field, ": ", oldValue, " -> ", value); + Logger::info("Updated ", area, " ", field, ": ", oldValue, " -> ", value); return send_response(json_response(req_, http::status::ok, json{{"status", "success"}, @@ -223,6 +228,9 @@ private: } catch (const json::parse_error& e) { return send_response(json_response(req_, http::status::bad_request, json{{"status", "error"}, {"message", "Invalid JSON"}, {"detail", e.what()}})); + } catch (const json::type_error& e) { + return send_response(json_response(req_, http::status::bad_request, + json{{"status", "error"}, {"message", "Invalid field type"}, {"detail", e.what()}})); } catch (const std::exception& e) { return send_response(json_response(req_, http::status::internal_server_error, json{{"status", "error"}, {"message", "Internal error"}, {"detail", e.what()}})); diff --git a/tests/BasicCollisionTest.cpp b/tests/BasicCollisionTest.cpp index f521ca9..0b2c3cb 100644 --- a/tests/BasicCollisionTest.cpp +++ b/tests/BasicCollisionTest.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "detector/CollisionDetector.h" #include "vehicle/ControllableVehicles.h" @@ -9,10 +11,27 @@ #include "config/AirportBounds.h" namespace { +std::unordered_set g_registered_test_vehicle_ids; + void RegisterManagedVehicle(const std::string& vehicleId) { ControllableVehicles::getInstance().updateRegistry({ VehicleRegistryEntry{vehicleId, "WUREN"} }); + g_registered_test_vehicle_ids.insert(vehicleId); +} + +void CleanupRegisteredVehicles() { + if (g_registered_test_vehicle_ids.empty()) { + return; + } + + std::vector cleanupEntries; + cleanupEntries.reserve(g_registered_test_vehicle_ids.size()); + for (const auto& vehicleId : g_registered_test_vehicle_ids) { + cleanupEntries.push_back(VehicleRegistryEntry{vehicleId, "PUTONG"}); + } + ControllableVehicles::getInstance().updateRegistry(cleanupEntries); + g_registered_test_vehicle_ids.clear(); } } @@ -82,6 +101,10 @@ protected: detector_ = std::make_unique(*airportBounds_, *mockControllableVehicles_); } + void TearDown() override { + CleanupRegisteredVehicles(); + } + std::unique_ptr airportBounds_; std::unique_ptr mockControllableVehicles_; std::unique_ptr detector_;