diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index 23ffd92f5d..a89da36f53 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(${_TEST_NAME}_tests test_dev_mapping.cpp test_filament_bitmap_utils.cpp test_device_progress.cpp + test_device_manager_integration.cpp test_network_versions.cpp test_action_source.cpp test_plugin_host_api.cpp diff --git a/tests/slic3rutils/test_device_manager_integration.cpp b/tests/slic3rutils/test_device_manager_integration.cpp new file mode 100644 index 0000000000..15f6e721cb --- /dev/null +++ b/tests/slic3rutils/test_device_manager_integration.cpp @@ -0,0 +1,167 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +using namespace Slic3r; +using json = nlohmann::json; + +namespace { + +class StubCloudAgent final : public OrcaCloudServiceAgent +{ +public: + StubCloudAgent() : OrcaCloudServiceAgent("") {} + + int get_user_print_info(unsigned int* http_code, std::string* http_body) override + { + if (http_code) + *http_code = 200; + if (http_body) + *http_body = R"({"devices":[]})"; + return 0; + } + + std::string get_user_name() override { return "integration-test-user"; } +}; + +class TestPrinterAgent final : public OrcaPrinterAgent +{ +public: + explicit TestPrinterAgent(std::string id) + : OrcaPrinterAgent(""), m_info{std::move(id), "Integration Test Agent", "1.0", "test agent"} + { + } + + AgentInfo get_agent_info() override { return m_info; } + +private: + AgentInfo m_info; +}; + +struct ScopedAppConfig +{ + AppConfig config; + + ScopedAppConfig() { GUI::wxGetApp().app_config = &config; } + ~ScopedAppConfig() { GUI::wxGetApp().app_config = nullptr; } +}; + +std::string machine_list_response(const std::string& provider, const std::string& agent_id, + std::uint64_t generation, const std::string& name) +{ + json machine; + machine["dev_id"] = "integration-device"; + machine["dev_name"] = name; + machine["dev_online"] = true; + machine["task_status"] = "idle"; + + json response; + response["provider"] = provider; + response["agent_id"] = agent_id; + response["generation"] = generation; + response["devices"] = json::array({machine}); + return response.dump(); +} + +} // namespace + +TEST_CASE("Network agent stamps user-machine responses with request context", "[DeviceManager][integration]") +{ + auto cloud = std::make_shared(); + NetworkAgent network(cloud, nullptr); + network.set_printer_agent(std::make_shared("integration-agent-a")); + + const std::uint64_t generation_before = network.get_user_machine_list_generation(); + unsigned int http_code = 0; + std::string body; + REQUIRE(network.get_user_print_info(&http_code, &body, ORCA_CLOUD_PROVIDER) == 0); + + const json response = json::parse(body); + CHECK(http_code == 200); + CHECK(response["provider"] == ORCA_CLOUD_PROVIDER); + CHECK(response["agent_id"] == "integration-agent-a"); + CHECK(response["generation"] == generation_before + 1); +} + +TEST_CASE("Device manager ignores stale cloud machine responses", "[DeviceManager][integration]") +{ + wxInitializer wx_init; + REQUIRE(wx_init.IsOk()); + ScopedAppConfig app_config; + NetworkAgent network(nullptr, std::make_shared("integration-agent")); + network.set_printer_agent(std::make_shared("integration-agent")); + DeviceManager manager(&network); + + const std::uint64_t current_generation = network.get_user_machine_list_generation(); + manager.parse_user_print_info(machine_list_response(ORCA_CLOUD_PROVIDER, "integration-agent", + current_generation, "Fresh name")); + + auto machines = manager.get_user_machinelist(); + REQUIRE(machines.size() == 1); + REQUIRE(machines.at("integration-device") != nullptr); + CHECK(machines.at("integration-device")->get_dev_name() == "Fresh name"); + + manager.parse_user_print_info(machine_list_response(BBL_CLOUD_PROVIDER, "integration-agent", + current_generation, "Stale provider")); + manager.parse_user_print_info(machine_list_response(ORCA_CLOUD_PROVIDER, "other-agent", + current_generation, "Stale agent")); + manager.parse_user_print_info(machine_list_response(ORCA_CLOUD_PROVIDER, "integration-agent", + current_generation + 1, "Stale generation")); + + machines = manager.get_user_machinelist(); + REQUIRE(machines.size() == 1); + CHECK(machines.at("integration-device")->get_dev_name() == "Fresh name"); +} + +TEST_CASE("Device manager filters and rehomes devices by printer-agent ownership", "[DeviceManager][integration]") +{ + wxInitializer wx_init; + REQUIRE(wx_init.IsOk()); + auto agent_a = std::make_shared("integration-agent-a"); + auto agent_b = std::make_shared("integration-agent-b"); + NetworkAgent network(nullptr, agent_a); + DeviceManager manager(&network); + + BBLocalMachine machine; + machine.dev_id = "integration-lan-device"; + machine.dev_name = "Integration LAN device"; + machine.dev_ip = "192.0.2.10"; + machine.printer_type = "C11"; + + MachineObject* object = manager.insert_local_device(machine, "lan", "free", "", "access-code"); + REQUIRE(object != nullptr); + CHECK(object->printer_agent_id == "integration-agent-a"); + CHECK(manager.get_my_machine_list("integration-agent-a").count(machine.dev_id) == 1); + CHECK(manager.get_my_machine_list("integration-agent-b").empty()); + + network.set_printer_agent(agent_b); + CHECK(manager.get_my_machine_list("integration-agent-b").empty()); + + manager.on_machine_alive(R"({ + "dev_name":"Rediscovered device", + "dev_id":"integration-lan-device", + "dev_ip":"192.0.2.10", + "dev_type":"C11", + "dev_signal":"strong", + "connect_type":"lan", + "bind_state":"free" + })"); + + CHECK(object->printer_agent_id == "integration-agent-b"); + CHECK(manager.get_my_machine_list("integration-agent-a").empty()); + CHECK(manager.get_my_machine_list("integration-agent-b").count(machine.dev_id) == 1); +} diff --git a/tests/slic3rutils/test_device_progress.cpp b/tests/slic3rutils/test_device_progress.cpp index be58dc6030..96dead46f0 100644 --- a/tests/slic3rutils/test_device_progress.cpp +++ b/tests/slic3rutils/test_device_progress.cpp @@ -115,7 +115,7 @@ TEST_CASE("Malformed string progress leaves a fresh machine unchanged", "[Device MachineObject machine(nullptr, nullptr, "test", "test-device", "127.0.0.1"); REQUIRE(machine.subtask_ == nullptr); - CHECK_THROWS_AS(machine.update_print_progress(json("not-a-percent")), std::invalid_argument); + CHECK_NOTHROW(machine.update_print_progress(json("not-a-percent"))); CHECK(machine.mc_print_percent == 0); CHECK(machine.subtask_ == nullptr); }