/** * @file requesthandler.cpp * @brief Test for the request-reply handler * @copyright 2015 Dual Inventive Technology Centre B.V. * * This tests the request reply handler. */ #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace Di; static bool strReplace(std::string *str, const std::string& from, const std::string& to) { size_t start_pos = str->find(from); if(start_pos == std::string::npos) return false; str->replace(start_pos, from.length(), to); return true; } TEST(RequestHandler, no_uri) { shared_ptr r = make_shared(""); } TEST(RequestHandler, late_connect) { shared_ptr reply; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); EXPECT_EQ(DNOK, r->sendRequest("01234567801234567890123456789012", "project:test")); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); EXPECT_EQ(DNE_PARAM, r->sendRequest("01234567801234567890123456789012", "project:test")); // Request 1 (echo) auto str = zs->recv(&more); EXPECT_NE(nullptr, str); EXPECT_TRUE(zs->send(*str)); EXPECT_EQ(DNOK, r->receiveReply(&reply)); } TEST(RequestHandler, normal) { shared_ptr reply; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); // Request 1 (echo) EXPECT_EQ(0, r->sendRequest("01234567801234567890123456789012", "project:test")); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); auto js = make_shared(str); EXPECT_TRUE(zs->send(*str)); EXPECT_EQ(0, r->receiveReply(&reply)); JsonDiff jd; EXPECT_TRUE(jd.diff(js, reply)); } TEST(RequestHandler, error_reply) { shared_ptr reply; shared_ptr x, js; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); // Request 2 (add error in reply) EXPECT_EQ(0, r->sendRequest("01234567801234567890123456789012", "project:test")); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); js = make_shared(str); x = make_shared(Json::J_OBJECT); x->setNumber("code", DNE_BACKEND_DEVICE_ERROR); js->setObject("error", x); auto str2 = js->dumpString(); strReplace(&str2, "\"req\"", "\"rep\""); js = make_shared(str2); EXPECT_TRUE(zs->send(str2)); EXPECT_EQ(DNE_BACKEND_DEVICE_ERROR, r->receiveReply(&reply)); JsonDiff jd; EXPECT_TRUE(jd.diff(js, reply)); } TEST(RequestHandler, error_reply_nocode) { shared_ptr reply; shared_ptr x, js; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); // Request 3 (error without error-code in reply) EXPECT_EQ(0, r->sendRequest("01234567801234567990123456789012", "project:test")); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); js = make_shared(str); x = make_shared(Json::J_OBJECT); js->setObject("error", x); auto str2 = js->dumpString(); strReplace(&str2, "\"req\"", "\"rep\""); js = make_shared(str2); EXPECT_TRUE(zs->send(str2)); EXPECT_EQ(DNE_PROTO, r->receiveReply(&reply)); JsonDiff jd; EXPECT_TRUE(jd.diff(js, reply)); } TEST(RequestHandler, invalid_json) { shared_ptr reply; shared_ptr x, js; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); // Request 4 (invalid JSON reply) EXPECT_EQ(0, r->sendRequest("01234567890123567890123456789012", "project:test")); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); auto str2 = "this is invalid json :)"; EXPECT_TRUE(zs->send(str2)); EXPECT_EQ(DNE_PROTO, r->receiveReply(&reply)); } TEST(RequestHandler, noreply) { shared_ptr reply; shared_ptr x, js; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); // Request 5 (no need for reply) EXPECT_EQ(0, r->sendRequest("01234567890123456789012345789012", "project:test")); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); EXPECT_TRUE(zs->send(*str)); EXPECT_EQ(0, r->receiveReply(nullptr)); } TEST(RequestHandler, params) { shared_ptr reply; shared_ptr x, js; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); js = make_shared(Json::J_OBJECT); js->setNull("project"); js->setString("test", "rik"); // Request 6 (with params) EXPECT_EQ(0, r->sendRequest("01234567890123456789001234567891", "project:test", js)); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); EXPECT_TRUE(zs->send(*str)); EXPECT_EQ(0, r->receiveReply(&reply)); } TEST(RequestHandler, timeout) { shared_ptr reply; shared_ptr x, js; bool more; shared_ptr r = make_shared("tcp://localhost:49999"); r->setTimeout(100); shared_ptr ctx = make_shared(); shared_ptr zs = make_shared(ctx, ZMQ_REP); zs->bind("tcp://*:49999"); js = make_shared(Json::J_OBJECT); js->setNull("project"); js->setString("test", "rik"); EXPECT_EQ(0, r->sendRequest("01234567890123456789001234567891", "project:test", js)); auto str = zs->recv(&more); EXPECT_NE(nullptr, str); EXPECT_EQ(DNE_TIMEOUT, r->receiveReply(nullptr)); } TEST(RequestHandler, send_while_disconnected) { shared_ptr r = make_shared("tcp://www.google.com:45678"); r->setTimeout(100); EXPECT_EQ(DNOK, r->sendRequest("01234567890123456789012345789012", "project:test")); EXPECT_EQ(DNE_TIMEOUT, r->receiveReply(nullptr)); }