#include #include #include //#define private public #include #include #include #include #include #include using namespace mdd; using namespace httplib; void serverThread() { Server svr; json input; json output; std::string status = "ready"; for (int i = 0; i < 5; ++i) { json entity; entity["type"] = "INPUT"; entity["value"] = i; input.push_back(entity); } for (int i = 0; i < 3; ++i) { json entity; entity["type"] = "OUTPUT"; entity["value"] = i*2; output.push_back(entity); } svr.Get("/inputs", [&](const Request& req, Response& res) { res.set_content(input.dump(), "application/json"); }); svr.Get("/outputs", [&](const Request& req, Response& res) { res.set_content(output.dump(), "application/json"); }); svr.Get("/status", [&](const Request& req, Response& res) { json body; body["status"] = status; std::cout << status << std::endl; res.set_content(body.dump(), "application/json"); }); svr.Post("/update", [&](const Request& req, Response& res, const ContentReader &content_reader) { status = "updating..."; std::string body; content_reader([&](const char *data, size_t data_length) { body.append(data, data_length); return true; }); body = std::string(R"()") + body; json inputs = json::parse(body.c_str()); for (int i = 0; i < inputs.size(); ++i) { input[i]["value"] = inputs[i]["value"]; } output[0]["value"] = input[0]["value"].get() + input[1]["value"].get(); output[1]["value"] = input[2]["value"].get() * input[2]["value"].get(); output[2]["value"] = input[3]["value"].get() - input[4]["value"].get(); std::cout << output[0].dump() << std::endl; std::cout << output[1].dump() << std::endl; std::cout << output[2].dump() << std::endl; res.set_content(output.dump(), "application/json"); status = "ready"; } ); svr.Get("/stop", [&](const Request& req, Response& res) { svr.stop(); }); svr.listen("localhost", 8888); } TEST(ModuleHTTP, updateLayout_intern){ std::thread server (serverThread); ModuleHTTP module("", "localhost", 8888); Client cli("localhost",8888); cli.Get("/stop"); server.join(); auto inputs_types = module.getInputs(); auto inputs_ids = module.getInputIDs(); for (int i = 0; i < 5; ++i) { EXPECT_EQ(inputs_types[i], "INPUT"); EXPECT_EQ(module.getInput(inputs_ids[i])->getValue()["value"].get(), i); } auto outputs_types = module.getOutputs(); auto outputs_ids = module.getOutputIDs(); for (int i = 0; i < 3; ++i) { EXPECT_EQ(outputs_types[i], "OUTPUT"); EXPECT_EQ(module.getOutput(outputs_ids[i])->getValue()["value"].get(), i * 2); } } TEST(ModuleHTTP, updateLayout_extern){ ModuleHTTP module("../../../lib/test/server/server.py","localhost",8888); auto inputs_types = module.getInputs(); auto inputs_ids = module.getInputIDs(); for(int i = 0; i < 5; ++i){ EXPECT_EQ(inputs_types[i], "INPUT"); EXPECT_EQ(module.getInput(inputs_ids[i])->getValue()["value"].get(), i); } auto outputs_types = module.getOutputs(); auto outputs_ids = module.getOutputIDs(); for(int i = 0; i < 3; ++i){ EXPECT_EQ(outputs_types[i], "OUTPUT"); EXPECT_EQ(module.getOutput(outputs_ids[i])->getValue()["value"].get(), i*2); } Client cli("localhost",8888); cli.Get("/stop"); } TEST(ModuleHTTP, update_intern){ std::thread server (serverThread); usleep(500000); ModuleHTTP module("", "localhost", 8888); auto inputs_types = module.getInputs(); auto inputs_ids = module.getInputIDs(); for (int i = 0; i < 5; ++i) { module.getInput(inputs_ids[i])->setDefaultValue()["value"] = 10-i; } module.update(); Client cli("localhost",8888); cli.Get("/stop"); server.join(); inputs_types = module.getInputs(); inputs_ids = module.getInputIDs(); for (int i = 0; i < 5; ++i) { EXPECT_EQ(inputs_types[i], "INPUT"); EXPECT_EQ(module.getInput(inputs_ids[i])->getValue()["value"].get(), 10-i); } auto outputs_types = module.getOutputs(); auto outputs_ids = module.getOutputIDs(); EXPECT_EQ(module.getOutput(outputs_ids[0])->getValue()["value"].get(), 19); EXPECT_EQ(module.getOutput(outputs_ids[1])->getValue()["value"].get(), 64); EXPECT_EQ(module.getOutput(outputs_ids[2])->getValue()["value"].get(), 1); }