From 0cc17fc668968075e837d8eafdb184b93fb4a370 Mon Sep 17 00:00:00 2001 From: Davin McCall Date: Mon, 9 Jul 2018 18:39:27 +0100 Subject: [PATCH] tests: add some protocol tests. --- src/includes/control.h | 9 ++- src/tests/cptests/cptests.cc | 138 +++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 3 deletions(-) diff --git a/src/includes/control.h b/src/includes/control.h index c9d981e..b914bd0 100644 --- a/src/includes/control.h +++ b/src/includes/control.h @@ -79,6 +79,12 @@ class control_conn_t : private service_listener { friend rearm control_conn_cb(eventloop_t *loop, control_conn_watcher *watcher, int revents); + public: + // A mapping between service records and their associated numerical identifier used + // in communction + using handle_t = uint32_t; + + private: control_conn_watcher iob; eventloop_t &loop; service_set *services; @@ -96,9 +102,6 @@ class control_conn_t : private service_listener template using list = std::list; template using vector = std::vector; - // A mapping between service records and their associated numerical identifier used - // in communction - using handle_t = uint32_t; std::unordered_multimap service_key_map; std::map key_service_map; diff --git a/src/tests/cptests/cptests.cc b/src/tests/cptests/cptests.cc index 00a8176..1041c1d 100644 --- a/src/tests/cptests/cptests.cc +++ b/src/tests/cptests/cptests.cc @@ -93,6 +93,141 @@ void cptest_listservices() delete cc; } +void cptest_findservice1() +{ + service_set sset; + + const char * const service_name_2 = "test-service-2"; + + service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {}); + sset.add_service(s1); + service_record *s2 = new service_record(&sset, "test-service-2", service_type_t::INTERNAL, {}); + sset.add_service(s2); + service_record *s3 = new service_record(&sset, "test-service-3", service_type_t::INTERNAL, {}); + sset.add_service(s3); + + int fd = bp_sys::allocfd(); + auto *cc = new control_conn_t(event_loop, &sset, fd); + + std::vector cmd = { DINIT_CP_FINDSERVICE }; + uint16_t name_len = strlen(service_name_2); + char *name_len_cptr = reinterpret_cast(&name_len); + cmd.insert(cmd.end(), name_len_cptr, name_len_cptr + sizeof(name_len)); + cmd.insert(cmd.end(), service_name_2, service_name_2 + name_len); + + bp_sys::supply_read_data(fd, std::move(cmd)); + + event_loop.regd_bidi_watchers[fd]->read_ready(event_loop, fd); + + // We expect: + // (1 byte) DINIT_RP_SERVICERECORD + // (1 byte) state + // (handle_t) handle + // (1 byte) target state + + std::vector wdata; + bp_sys::extract_written_data(fd, wdata); + + assert(wdata.size() == 3 + sizeof(control_conn_t::handle_t)); + assert(wdata[0] == DINIT_RP_SERVICERECORD); + service_state_t s = static_cast(wdata[1]); + assert(s == service_state_t::STOPPED); + service_state_t ts = static_cast(wdata[6]); + assert(ts == service_state_t::STOPPED); + + delete cc; +} + +void cptest_findservice2() +{ + service_set sset; + + const char * const service_name_2 = "test-service-2"; + + service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {}); + sset.add_service(s1); + service_record *s2 = new service_record(&sset, "test-service-2", service_type_t::INTERNAL, {}); + sset.add_service(s2); + service_record *s3 = new service_record(&sset, "test-service-3", service_type_t::INTERNAL, {}); + sset.add_service(s3); + + sset.start_service(s2); + sset.process_queues(); + + int fd = bp_sys::allocfd(); + auto *cc = new control_conn_t(event_loop, &sset, fd); + + std::vector cmd = { DINIT_CP_FINDSERVICE }; + uint16_t name_len = strlen(service_name_2); + char *name_len_cptr = reinterpret_cast(&name_len); + cmd.insert(cmd.end(), name_len_cptr, name_len_cptr + sizeof(name_len)); + cmd.insert(cmd.end(), service_name_2, service_name_2 + name_len); + + bp_sys::supply_read_data(fd, std::move(cmd)); + + event_loop.regd_bidi_watchers[fd]->read_ready(event_loop, fd); + + // We expect: + // (1 byte) DINIT_RP_SERVICERECORD + // (1 byte) state + // (handle_t) handle + // (1 byte) target state + + std::vector wdata; + bp_sys::extract_written_data(fd, wdata); + + assert(wdata.size() == 3 + sizeof(control_conn_t::handle_t)); + assert(wdata[0] == DINIT_RP_SERVICERECORD); + service_state_t s = static_cast(wdata[1]); + assert(s == service_state_t::STARTED); + service_state_t ts = static_cast(wdata[6]); + assert(ts == service_state_t::STARTED); + + delete cc; +} + +// test finding non-existing service +void cptest_findservice3() +{ + service_set sset; + + const char * const service_name_2 = "test-service-n"; + + service_record *s1 = new service_record(&sset, "test-service-1", service_type_t::INTERNAL, {}); + sset.add_service(s1); + service_record *s2 = new service_record(&sset, "test-service-2", service_type_t::INTERNAL, {}); + sset.add_service(s2); + service_record *s3 = new service_record(&sset, "test-service-3", service_type_t::INTERNAL, {}); + sset.add_service(s3); + + sset.start_service(s2); + sset.process_queues(); + + int fd = bp_sys::allocfd(); + auto *cc = new control_conn_t(event_loop, &sset, fd); + + std::vector cmd = { DINIT_CP_FINDSERVICE }; + uint16_t name_len = strlen(service_name_2); + char *name_len_cptr = reinterpret_cast(&name_len); + cmd.insert(cmd.end(), name_len_cptr, name_len_cptr + sizeof(name_len)); + cmd.insert(cmd.end(), service_name_2, service_name_2 + name_len); + + bp_sys::supply_read_data(fd, std::move(cmd)); + + event_loop.regd_bidi_watchers[fd]->read_ready(event_loop, fd); + + // We expect: + // (1 byte) DINIT_RP_NOSERVICE + + std::vector wdata; + bp_sys::extract_written_data(fd, wdata); + + assert(wdata.size() == 1); + assert(wdata[0] == DINIT_RP_NOSERVICE); + + delete cc; +} + #define RUN_TEST(name, spacing) \ std::cout << #name "..." spacing; \ @@ -103,5 +238,8 @@ int main(int argc, char **argv) { RUN_TEST(cptest_queryver, " "); RUN_TEST(cptest_listservices, ""); + RUN_TEST(cptest_findservice1, ""); + RUN_TEST(cptest_findservice2, ""); + RUN_TEST(cptest_findservice3, ""); return 0; } -- 2.25.1