2 * Copyright (c) 2022 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <gtest/gtest.h>
18 #include <arpa/inet.h>
21 #include "mocks/thread-mock-dummy.h"
23 #define NETWORK_DATA_SIZE 256
24 #define NETWORK_TLVS_SIZE 1024
25 #define DUMMY_TLVS_STR "0e080000000000010000000300001935060004001" \
26 "fffe00208763d64768c8f3ecf0708fdd10ceaadb65a7b05105e1ec3e" \
27 "16d3e0aee52fb7e618a759973030f4f70656e5468726561642d34633" \
28 "33801024c3804103044b2dc6512dce13b11d3386eb2ce7e0c0402a0fff8"
29 #define DUMMY_TLVS_SIZE ((int)(sizeof(DUMMY_TLVS_STR) / 2))
31 class ThreadNetworkTest : public ::testing::Test
34 const char *NETWORK_DUMMY_NAME = "TizenOpenThread";
35 const char *NETWORK_DUMMY_KEY = "c03aa2d3c869847b0e7f2ca288efd251";
36 const char *NETWORK_DUMMY_PSKC = "19d3bd4ee76baad7ff2da29c87c67452";
37 const uint32_t NETWORK_DUMMY_CHANNEL = 15;
38 const uint64_t NETWORK_DUMMY_EXTENDED_PANID = 0xeea0d4484e93db7a;
39 const uint16_t NETWORK_DUMMY_PANID = 0x68a0;
41 thread_instance_h instance;
42 thread_network_h network;
43 thread_network_h operationalNetwork;
44 char name[NETWORK_DATA_SIZE + 1];
45 char key[NETWORK_DATA_SIZE + 1];
46 char pskc[NETWORK_DATA_SIZE + 1];
48 uint64_t extendedPanId;
50 uint8_t tlvsBuffer[NETWORK_TLVS_SIZE];
52 uint8_t ipv6Address[THREAD_IPV6_ADDRESS_SIZE];
53 const char *globalIpaddr;
56 static void getIpAddrCallback(int index, char* ipaddr,
57 thread_ipaddr_type_e ipaddr_type, void *user_data) {};
65 operationalNetwork = nullptr;
66 snprintf(name, NETWORK_DATA_SIZE + 1, "Thread-test");
67 snprintf(key, NETWORK_DATA_SIZE + 1, "f780b002ec7d904c9995daaa78a50083");
68 snprintf(pskc, NETWORK_DATA_SIZE + 1, "ba473fecdb235d30bd65233e6089ee50");
70 extendedPanId = strtoull("18446744073709551615LL", nullptr, 10);
73 tlvsBufferLength = DUMMY_TLVS_SIZE;
77 void TearDown() override
83 thread_unset_operational_network(instance);
84 thread_network_destroy(network);
86 thread_disable(instance);
89 thread_deinitialize();
95 for (int i = 0; i < DUMMY_TLVS_SIZE; ++i)
98 memcpy(subBuffer, &DUMMY_TLVS_STR[2 * i], 2);
100 tlvsBuffer[i] = (uint8_t)strtol(subBuffer, NULL, 16);
104 void makeIpv6Address()
106 struct in6_addr result;
107 inet_pton(AF_INET6, DUMMY_IPV6_ADDRESS, &result);
108 memcpy(ipv6Address, result.s6_addr,
109 THREAD_IPV6_PREFIX_SIZE * sizeof(uint8_t));
113 TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsNotInitialized)
115 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
116 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
117 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
120 TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsInvalidParameter)
122 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
123 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
126 TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsErrorNone)
128 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
129 EXPECT_EQ(THREAD_ERROR_NONE,
130 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
133 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsNotInitialized)
135 uint8_t *tlvs_buffer = NULL;
136 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
137 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
138 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
142 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsInvalidParameter)
144 uint8_t *tlvs_buffer = NULL;
145 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
146 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
150 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone)
152 uint8_t *tlvs_buffer = NULL;
153 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
154 EXPECT_EQ(THREAD_ERROR_NONE,
155 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
159 TEST_F(ThreadNetworkTest, AttachNotInitialized)
161 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
162 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_attach(instance));
165 TEST_F(ThreadNetworkTest, AttachInvalidParameter)
167 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_attach(instance));
170 TEST_F(ThreadNetworkTest, AttachErrorNone)
172 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
173 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_attach(instance));
176 TEST_F(ThreadNetworkTest, DetachNotInitialized)
178 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
179 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_detach(instance));
182 TEST_F(ThreadNetworkTest, DetachInvalidParameter)
184 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_detach(instance));
187 TEST_F(ThreadNetworkTest, DetachErrorNone)
189 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
190 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
191 EXPECT_EQ(THREAD_ERROR_NONE,
192 thread_set_operational_network(instance, network));
193 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_detach(instance));
196 TEST_F(ThreadNetworkTest, GetIpAddrNotInitialized)
198 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
199 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
200 thread_get_ipaddr(instance, getIpAddrCallback,
201 THREAD_IPADDR_TYPE_ALL, nullptr));
204 TEST_F(ThreadNetworkTest, GetIpAddrInvalidParameter)
206 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
207 thread_get_ipaddr(instance, getIpAddrCallback,
208 THREAD_IPADDR_TYPE_ALL, nullptr));
211 TEST_F(ThreadNetworkTest, GetIpAddrErrorNone)
213 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
214 EXPECT_EQ(THREAD_ERROR_NONE,
215 thread_get_ipaddr(instance, getIpAddrCallback,
216 THREAD_IPADDR_TYPE_ALL, nullptr));
217 EXPECT_EQ(THREAD_ERROR_NONE,
218 thread_get_ipaddr(instance, getIpAddrCallback,
219 THREAD_IPADDR_TYPE_LINK_LOCAL, nullptr));
220 EXPECT_EQ(THREAD_ERROR_NONE,
221 thread_get_ipaddr(instance, getIpAddrCallback,
222 THREAD_IPADDR_TYPE_RLOC, nullptr));
223 EXPECT_EQ(THREAD_ERROR_NONE,
224 thread_get_ipaddr(instance, getIpAddrCallback,
225 THREAD_IPADDR_TYPE_MLEID, nullptr));
228 TEST_F(ThreadNetworkTest, AddIpAddrNotInitialized)
230 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
231 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
232 thread_add_ipaddr(instance, ipv6Address));
235 TEST_F(ThreadNetworkTest, AddIpAddrInvalidParameter)
237 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
238 thread_add_ipaddr(instance, ipv6Address));
241 TEST_F(ThreadNetworkTest, AddIpAddrErrorNone)
243 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
244 EXPECT_EQ(THREAD_ERROR_NONE,
245 thread_add_ipaddr(instance, ipv6Address));
248 TEST_F(ThreadNetworkTest, RemoveIpAddrNotInitialized)
250 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
251 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
252 thread_remove_ipaddr(instance, ipv6Address));
255 TEST_F(ThreadNetworkTest, RemoveIpAddrInvalidParameter)
257 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
258 thread_remove_ipaddr(instance, ipv6Address));
261 TEST_F(ThreadNetworkTest, RemoveIpAddrErrorNone)
263 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
264 EXPECT_EQ(THREAD_ERROR_NONE,
265 thread_remove_ipaddr(instance, ipv6Address));
268 TEST_F(ThreadNetworkTest, GetGlobalIpAddrNotInitialized)
270 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
271 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
272 thread_get_global_ipaddr(instance, &globalIpaddr));
275 TEST_F(ThreadNetworkTest, GetGlobalIpAddrInvalidParameter)
277 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
278 thread_get_global_ipaddr(instance, nullptr));
281 TEST_F(ThreadNetworkTest, GetGlobalIpAddrErrorNone)
283 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
284 EXPECT_EQ(THREAD_ERROR_NONE,
285 thread_get_global_ipaddr(instance, &globalIpaddr));
286 g_free((char *)globalIpaddr);
289 TEST_F(ThreadNetworkTest, GetPanIdNotInitialized)
292 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
293 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
294 thread_network_get_panid(instance, &panid));
297 TEST_F(ThreadNetworkTest, GetPanIdInvalidParameter)
300 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
301 thread_network_get_panid(instance, &panid));
304 TEST_F(ThreadNetworkTest, GetPanIdErrorNone)
307 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
308 EXPECT_EQ(THREAD_ERROR_NONE,
309 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
310 EXPECT_EQ(THREAD_ERROR_NONE,
311 thread_network_get_panid(instance, &panid));
314 TEST_F(ThreadNetworkTest, CreateNotInitialized)
316 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
317 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_create(&network));
320 TEST_F(ThreadNetworkTest, CreateInvalidParameter)
322 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_create(nullptr));
325 TEST_F(ThreadNetworkTest, CreateErrorNone)
327 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
330 TEST_F(ThreadNetworkTest, DestroyNotInitialized)
332 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
333 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_destroy(network));
336 TEST_F(ThreadNetworkTest, DestroyInvalidParameter)
338 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_destroy(nullptr));
341 TEST_F(ThreadNetworkTest, DestroyErrorNone)
343 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
344 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_destroy(network));
347 TEST_F(ThreadNetworkTest, SetNameNotInitialized)
349 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
350 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
351 thread_network_set_name(network, NETWORK_DUMMY_NAME));
354 TEST_F(ThreadNetworkTest, SetNameInvalidParameter)
356 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
357 thread_network_set_name(nullptr, NETWORK_DUMMY_NAME));
360 TEST_F(ThreadNetworkTest, SetNameErrorNone)
362 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
363 EXPECT_EQ(THREAD_ERROR_NONE,
364 thread_network_set_name(network, NETWORK_DUMMY_NAME));
367 TEST_F(ThreadNetworkTest, SetKeyNotInitialized)
369 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
370 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
371 thread_network_set_key(network, NETWORK_DUMMY_KEY));
374 TEST_F(ThreadNetworkTest, SetKeyInvalidParameter)
376 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
377 thread_network_set_key(nullptr, NETWORK_DUMMY_KEY));
380 TEST_F(ThreadNetworkTest, SetKeyErrorNone)
382 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
383 EXPECT_EQ(THREAD_ERROR_NONE,
384 thread_network_set_key(network, NETWORK_DUMMY_KEY));
387 TEST_F(ThreadNetworkTest, SetPskcNotInitialized)
389 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
390 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
391 thread_network_set_pskc(network, NETWORK_DUMMY_PSKC));
394 TEST_F(ThreadNetworkTest, SetPskcInvalidParameter)
396 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
397 thread_network_set_pskc(nullptr, NETWORK_DUMMY_PSKC));
400 TEST_F(ThreadNetworkTest, SetPskcErrorNone)
402 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
403 EXPECT_EQ(THREAD_ERROR_NONE,
404 thread_network_set_pskc(network, NETWORK_DUMMY_PSKC));
407 TEST_F(ThreadNetworkTest, SetChannelNotInitialized)
409 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
410 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
411 thread_network_set_channel(network, NETWORK_DUMMY_CHANNEL));
414 TEST_F(ThreadNetworkTest, SetChannelInvalidParameter)
416 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
417 thread_network_set_channel(nullptr, NETWORK_DUMMY_CHANNEL));
420 TEST_F(ThreadNetworkTest, SetChannelErrorNone)
422 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
423 EXPECT_EQ(THREAD_ERROR_NONE,
424 thread_network_set_channel(network, NETWORK_DUMMY_CHANNEL));
427 TEST_F(ThreadNetworkTest, SetExtendedPanidNotInitialized)
429 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
430 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
431 thread_network_set_extended_panid(network, NETWORK_DUMMY_EXTENDED_PANID));
434 TEST_F(ThreadNetworkTest, SetExtendedPanidInvalidParameter)
436 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
437 thread_network_set_extended_panid(nullptr, NETWORK_DUMMY_EXTENDED_PANID));
440 TEST_F(ThreadNetworkTest, SetExtendedPanidErrorNone)
442 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
443 EXPECT_EQ(THREAD_ERROR_NONE,
444 thread_network_set_extended_panid(network, NETWORK_DUMMY_EXTENDED_PANID));
447 TEST_F(ThreadNetworkTest, SetPanidNotInitialized)
449 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
450 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
451 thread_network_set_panid(network, NETWORK_DUMMY_PANID));
454 TEST_F(ThreadNetworkTest, SetPanidInvalidParameter)
456 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
457 thread_network_set_panid(nullptr, NETWORK_DUMMY_PANID));
460 TEST_F(ThreadNetworkTest, SetPanidErrorNone)
462 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
463 EXPECT_EQ(THREAD_ERROR_NONE,
464 thread_network_set_panid(network, NETWORK_DUMMY_PANID));
467 TEST_F(ThreadNetworkTest, SetOperationalNetworkNotInitialized)
469 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
470 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
471 thread_set_operational_network(instance, network));
474 TEST_F(ThreadNetworkTest, SetOperationalNetworkInvalidParameter)
476 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
477 thread_set_operational_network(instance, network));
480 TEST_F(ThreadNetworkTest, SetOperationalNetworkErrorNone)
482 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
483 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
484 EXPECT_EQ(THREAD_ERROR_NONE,
485 thread_set_operational_network(instance, network));
488 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkNotInitialized)
490 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
491 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
492 thread_unset_operational_network(instance));
495 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkInvalidParameter)
497 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
498 thread_unset_operational_network(instance));
501 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkErrorNone)
503 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
504 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
505 EXPECT_EQ(THREAD_ERROR_NONE,
506 thread_set_operational_network(instance, network));
507 EXPECT_EQ(THREAD_ERROR_NONE,
508 thread_unset_operational_network(instance));