2 test_cases_submesh03.c -- Execution of specific meshlink black box test cases
3 Copyright (C) 2018 Guus Sliepen <guus@meshlink.io>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "execute_tests.h"
25 #include "test_cases_submesh03.h"
27 #include "../common/containers.h"
28 #include "../common/test_step.h"
29 #include "../common/common_handlers.h"
30 #include "../common/mesh_event_handler.h"
32 #define CORENODE1_ID "0"
33 #define APP1NODE1_ID "1"
34 #define APP1NODE2_ID "2"
38 static bool test_case_status = false;
40 static void test_case_submesh_03(void **state);
41 static bool test_steps_submesh_03(void);
43 static char event_node_name[][10] = {"CORENODE1", "APP1NODE1", "APP1NODE2"};
44 static const char *node_ids[] = { "corenode1", "app1node1", "app1node2" };
46 static mesh_event_t core_node1[] = { NODE_STARTED, CHANNEL_OPENED, CHANNEL_DATA_RECIEVED};
48 static mesh_event_t app1_node1[] = { NODE_STARTED, NODE_JOINED, CHANNEL_OPENED, CHANNEL_DATA_RECIEVED};
50 static mesh_event_t app1_node2[] = { NODE_STARTED, NODE_JOINED, CHANNEL_OPENED, CHANNEL_DATA_RECIEVED, CHANNEL_OPENED, CHANNEL_DATA_RECIEVED, MESH_EVENT_COMPLETED};
52 static node_status_t node_status[3] = {
58 /* State structure for SubMesh Test Case #3 */
59 static char *test_case_submesh_3_nodes[] = { "corenode1", "app1node1", "app1node2" };
60 static black_box_state_t test_case_submesh_3_state = {
61 .test_case_name = "test_cases_submesh03",
62 .node_names = test_case_submesh_3_nodes,
66 static int black_box_group0_setup(void **state) {
69 const char *nodes[] = { "corenode1", "app1node1", "app1node2" };
70 int num_nodes = sizeof(nodes) / sizeof(nodes[0]);
72 PRINT_TEST_CASE_MSG("Creating Containers\n");
74 create_containers(nodes, num_nodes);
79 static int black_box_group0_teardown(void **state) {
82 PRINT_TEST_CASE_MSG("Destroying Containers\n");
88 static void restart_all_nodes(char *import) {
91 for(i = 0; i < 3; i++) {
92 node_step_in_container(node_ids[i], "SIGTERM");
93 node_status[i].current_index = 0;
98 node_sim_in_container_event("corenode1", "1", NULL, CORENODE1_ID, import);
99 node_sim_in_container_event("app1node1", "1", NULL, APP1NODE1_ID, import);
100 node_sim_in_container_event("app1node2", "1", NULL, APP1NODE2_ID, import);
103 static bool event_cb(mesh_event_payload_t payload) {
105 fprintf(stderr, "%s(%lu) : %s\n", event_node_name[payload.client_id], time(NULL), event_status[payload.mesh_event]);
106 assert(change_state(&node_status[payload.client_id], payload.mesh_event));
108 if(payload.mesh_event == NODE_JOINED) {
109 signal_node_start(node_status, 1, 2, (char **)node_ids);
112 if(check_nodes_finished(node_status, 3)) {
113 test_case_status = true;
120 /* Execute SubMesh Test Case # 3 */
121 static void test_case_submesh_03(void **state) {
122 execute_test(test_steps_submesh_03, state);
125 /* Test Steps for SubMesh Test Case # 3
128 1. Run corenode1, app1node1, and app1node2
129 2. Generate invites to app1node1, and app1node2
130 from corenode1 to join corenode1.
131 3. After Join is successful start channels from all nodes and exchange data on channels
132 4. Try to restart all the nodes at the same time.
135 Channels should be formed between nodes of sub-mesh & coremesh, nodes with in sub-mesh
136 and should be able to exchange data even after restart.
138 static bool test_steps_submesh_03(void) {
139 char *invite_app1node1, *invite_app1node2;
142 import = mesh_event_sock_create(eth_if_name);
143 invite_app1node1 = invite_in_container("corenode1", "app1node1");
144 invite_app1node2 = invite_in_container("corenode1", "app1node2");
146 node_sim_in_container_event("corenode1", "1", NULL, CORENODE1_ID, import);
147 node_sim_in_container_event("app1node1", "1", invite_app1node1, APP1NODE1_ID, import);
148 node_sim_in_container_event("app1node2", "1", invite_app1node2, APP1NODE2_ID, import);
150 PRINT_TEST_CASE_MSG("Waiting for nodes to get connected with corenode1\n");
152 assert(wait_for_event(event_cb, 120));
153 assert(test_case_status);
155 test_case_status = false;
157 restart_all_nodes(import);
158 PRINT_TEST_CASE_MSG("Waiting for nodes to get restarted\n");
160 assert(wait_for_event(event_cb, 120));
161 assert(test_case_status);
163 free(invite_app1node1);
164 free(invite_app1node2);
166 mesh_event_destroy();
171 int test_cases_submesh03(void) {
172 const struct CMUnitTest blackbox_group0_tests[] = {
173 cmocka_unit_test_prestate_setup_teardown(test_case_submesh_03, setup_test, teardown_test,
174 (void *)&test_case_submesh_3_state)
176 total_tests += sizeof(blackbox_group0_tests) / sizeof(blackbox_group0_tests[0]);
178 return cmocka_run_group_tests(blackbox_group0_tests, black_box_group0_setup, black_box_group0_teardown);