2 test_cases_join.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_join.h"
26 #include "../common/containers.h"
27 #include "../common/test_step.h"
28 #include "../common/common_handlers.h"
37 /* Modify this to change the logging level of Meshlink */
38 #define TEST_MESHLINK_LOG_LEVEL MESHLINK_DEBUG
40 static void test_case_meshlink_join_01(void **state);
41 static bool test_meshlink_join_01(void);
42 static void test_case_meshlink_join_02(void **state);
43 static bool test_meshlink_join_02(void);
44 static void test_case_meshlink_join_03(void **state);
45 static bool test_meshlink_join_03(void);
47 /* State structure for join Test Case #1 */
48 static black_box_state_t test_case_join_01_state = {
49 .test_case_name = "test_case_join_01",
52 /* State structure for join Test Case #1 */
53 static black_box_state_t test_case_join_02_state = {
54 .test_case_name = "test_case_join_02",
57 /* State structure for join Test Case #1 */
58 static black_box_state_t test_case_join_03_state = {
59 .test_case_name = "test_case_join_03",
62 static bool join_status;
65 static void status_callback(meshlink_handle_t *mesh, meshlink_node_t *source, bool reach) {
68 if(!strcmp(source->name, "relay")) {
73 /* Execute join Test Case # 1 - valid case*/
74 static void test_case_meshlink_join_01(void **state) {
75 execute_test(test_meshlink_join_01, state);
78 /* Test Steps for meshlink_join Test Case # 1 - Valid case
81 1. Generate invite in relay container and run 'relay' node
83 3. Join NUT with relay using invitation generated.
86 NUT joins relay using the invitation generated.
88 static bool test_meshlink_join_01(void) {
89 meshlink_destroy("join_conf.1");
90 meshlink_destroy("join_conf.2");
92 // Create node instances
93 meshlink_handle_t *mesh1 = meshlink_open("join_conf.1", "nut", "test", DEV_CLASS_STATIONARY);
94 assert(mesh1 != NULL);
95 meshlink_set_log_cb(mesh1, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
96 meshlink_handle_t *mesh2 = meshlink_open("join_conf.2", "relay", "test", DEV_CLASS_STATIONARY);
97 assert(mesh2 != NULL);
98 meshlink_set_log_cb(mesh2, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
100 // Setting node status callback
101 meshlink_set_node_status_cb(mesh1, status_callback);
104 meshlink_start(mesh2);
105 char *invitation = meshlink_invite(mesh2, NULL, "nut");
108 // Joining Node-Under-Test with relay
109 bool ret = meshlink_join(mesh1, invitation);
110 assert_int_equal(ret, true);
111 assert(meshlink_start(mesh1));
114 assert_int_equal(join_status, true);
117 meshlink_close(mesh1);
118 meshlink_close(mesh2);
119 meshlink_destroy("join_conf.1");
120 meshlink_destroy("join_conf.2");
125 /* Execute join Test Case # 2 - Invalid case*/
126 static void test_case_meshlink_join_02(void **state) {
127 execute_test(test_meshlink_join_02, state);
130 /* Test Steps for meshlink_join Test Case # 2 - Invalid case
133 1. Call meshlink_join with NULL as mesh handler argument.
136 report error accordingly when NULL is passed as mesh handle argument
138 static bool test_meshlink_join_02(void) {
139 meshlink_destroy("join_conf.3");
141 // Create node instances
142 meshlink_handle_t *mesh1 = meshlink_open("join_conf.3", "nut", "test", DEV_CLASS_STATIONARY);
143 assert(mesh1 != NULL);
144 meshlink_set_log_cb(mesh1, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
146 char *invitation = meshlink_invite(mesh1, NULL, "nodex");
148 /* meshlink_join called with NULL as mesh handle and with valid invitation */
149 bool ret = meshlink_join(NULL, invitation);
150 assert_int_equal(ret, false);
153 meshlink_close(mesh1);
154 meshlink_destroy("join_conf.3");
159 /* Execute join Test Case # 3- Invalid case*/
160 static void test_case_meshlink_join_03(void **state) {
161 execute_test(test_meshlink_join_03, state);
164 /* Test Steps for meshlink_join Test Case # 3 - Invalid case
168 1. Call meshlink_join with NULL as invitation argument.
171 Report error accordingly when NULL is passed as invite argument
173 static bool test_meshlink_join_03(void) {
174 meshlink_destroy("joinconf.4");
175 meshlink_set_log_cb(NULL, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
177 /* Create meshlink instance */
178 mesh_handle = meshlink_open("joinconf.4", "nut", "node_sim", 1);
180 meshlink_set_log_cb(mesh_handle, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
182 /* Passing NULL as invitation to join API*/
183 bool ret = meshlink_join(mesh_handle, NULL);
184 assert_int_equal(ret, false);
186 meshlink_close(mesh_handle);
187 meshlink_destroy("joinconf.4");
191 int test_meshlink_join(void) {
192 const struct CMUnitTest blackbox_join_tests[] = {
193 cmocka_unit_test_prestate_setup_teardown(test_case_meshlink_join_01, NULL, NULL,
194 (void *)&test_case_join_01_state),
195 cmocka_unit_test_prestate_setup_teardown(test_case_meshlink_join_02, NULL, NULL,
196 (void *)&test_case_join_02_state),
197 cmocka_unit_test_prestate_setup_teardown(test_case_meshlink_join_03, NULL, NULL,
198 (void *)&test_case_join_03_state)
200 total_tests += sizeof(blackbox_join_tests) / sizeof(blackbox_join_tests[0]);
202 int failed = cmocka_run_group_tests(blackbox_join_tests, NULL, NULL);