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.
20 #include "execute_tests.h"
21 #include "test_cases_join.h"
22 #include "../common/containers.h"
23 #include "../common/test_step.h"
24 #include "../common/common_handlers.h"
33 /* Modify this to change the logging level of Meshlink */
34 #define TEST_MESHLINK_LOG_LEVEL MESHLINK_DEBUG
36 static void test_case_meshlink_join_01(void **state);
37 static bool test_meshlink_join_01(void);
38 static void test_case_meshlink_join_02(void **state);
39 static bool test_meshlink_join_02(void);
40 static void test_case_meshlink_join_03(void **state);
41 static bool test_meshlink_join_03(void);
42 static void test_case_meshlink_join_04(void **state);
43 static bool test_meshlink_join_04(void);
45 /* State structure for join Test Case #1 */
46 static black_box_state_t test_case_join_01_state = {
47 .test_case_name = "test_case_join_01",
50 /* State structure for join Test Case #1 */
51 static black_box_state_t test_case_join_02_state = {
52 .test_case_name = "test_case_join_02",
55 /* State structure for join Test Case #1 */
56 static black_box_state_t test_case_join_03_state = {
57 .test_case_name = "test_case_join_03",
60 static bool join_status;
63 static void status_callback(meshlink_handle_t *mesh, meshlink_node_t *source, bool reach) {
66 if(!strcmp(source->name, "relay")) {
71 /* Execute join Test Case # 1 - valid case*/
72 static void test_case_meshlink_join_01(void **state) {
73 execute_test(test_meshlink_join_01, state);
76 /* Test Steps for meshlink_join Test Case # 1 - Valid case
79 1. Generate invite in relay container and run 'relay' node
81 3. Join NUT with relay using invitation generated.
84 NUT joins relay using the invitation generated.
86 static bool test_meshlink_join_01(void) {
87 meshlink_destroy("join_conf.1");
88 meshlink_destroy("join_conf.2");
90 // Create node instances
91 meshlink_handle_t *mesh1 = meshlink_open("join_conf.1", "nut", "test", DEV_CLASS_STATIONARY);
92 assert(mesh1 != NULL);
93 meshlink_set_log_cb(mesh1, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
94 meshlink_handle_t *mesh2 = meshlink_open("join_conf.2", "relay", "test", DEV_CLASS_STATIONARY);
95 assert(mesh2 != NULL);
96 meshlink_set_log_cb(mesh2, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
98 // Setting node status callback
99 meshlink_set_node_status_cb(mesh1, status_callback);
102 meshlink_start(mesh2);
103 char *invitation = meshlink_invite(mesh2, NULL, "nut");
106 // Joining Node-Under-Test with relay
107 bool ret = meshlink_join(mesh1, invitation);
108 assert_int_equal(ret, true);
109 assert(meshlink_start(mesh1));
112 assert_int_equal(join_status, true);
115 meshlink_close(mesh1);
116 meshlink_close(mesh2);
117 meshlink_destroy("join_conf.1");
118 meshlink_destroy("join_conf.2");
123 /* Execute join Test Case # 2 - Invalid case*/
124 static void test_case_meshlink_join_02(void **state) {
125 execute_test(test_meshlink_join_02, state);
128 /* Test Steps for meshlink_join Test Case # 2 - Invalid case
131 1. Call meshlink_join with NULL as mesh handler argument.
134 report error accordingly when NULL is passed as mesh handle argument
136 static bool test_meshlink_join_02(void) {
137 meshlink_destroy("join_conf.3");
139 // Create node instances
140 meshlink_handle_t *mesh1 = meshlink_open("join_conf.3", "nut", "test", DEV_CLASS_STATIONARY);
141 assert(mesh1 != NULL);
142 meshlink_set_log_cb(mesh1, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
144 char *invitation = meshlink_invite(mesh1, NULL, "nodex");
146 /* meshlink_join called with NULL as mesh handle and with valid invitation */
147 bool ret = meshlink_join(NULL, invitation);
148 assert_int_equal(ret, false);
151 meshlink_close(mesh1);
152 meshlink_destroy("join_conf.3");
157 /* Execute join Test Case # 3- Invalid case*/
158 static void test_case_meshlink_join_03(void **state) {
159 execute_test(test_meshlink_join_03, state);
162 /* Test Steps for meshlink_join Test Case # 3 - Invalid case
166 1. Call meshlink_join with NULL as invitation argument.
169 Report error accordingly when NULL is passed as invite argument
171 static bool test_meshlink_join_03(void) {
172 meshlink_destroy("joinconf.4");
173 meshlink_set_log_cb(NULL, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
175 /* Create meshlink instance */
176 mesh_handle = meshlink_open("joinconf.4", "nut", "node_sim", 1);
178 meshlink_set_log_cb(mesh_handle, TEST_MESHLINK_LOG_LEVEL, meshlink_callback_logger);
180 /* Passing NULL as invitation to join API*/
181 bool ret = meshlink_join(mesh_handle, NULL);
182 assert_int_equal(ret, false);
184 meshlink_close(mesh_handle);
185 meshlink_destroy("joinconf.4");
189 int test_meshlink_join(void) {
190 const struct CMUnitTest blackbox_join_tests[] = {
191 cmocka_unit_test_prestate_setup_teardown(test_case_meshlink_join_01, NULL, NULL,
192 (void *)&test_case_join_01_state),
193 cmocka_unit_test_prestate_setup_teardown(test_case_meshlink_join_02, NULL, NULL,
194 (void *)&test_case_join_02_state),
195 cmocka_unit_test_prestate_setup_teardown(test_case_meshlink_join_03, NULL, NULL,
196 (void *)&test_case_join_03_state)
198 total_tests += sizeof(blackbox_join_tests) / sizeof(blackbox_join_tests[0]);
200 int failed = cmocka_run_group_tests(blackbox_join_tests, NULL, NULL);