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];
55 static void getIpAddrCallback(int index, char* ipaddr,
56 thread_ipaddr_type_e ipaddr_type, void *user_data) {};
64 operationalNetwork = nullptr;
65 snprintf(name, NETWORK_DATA_SIZE + 1, "Thread-test");
66 snprintf(key, NETWORK_DATA_SIZE + 1, "f780b002ec7d904c9995daaa78a50083");
67 snprintf(pskc, NETWORK_DATA_SIZE + 1, "ba473fecdb235d30bd65233e6089ee50");
69 extendedPanId = strtoull("18446744073709551615LL", nullptr, 10);
72 tlvsBufferLength = DUMMY_TLVS_SIZE;
76 void TearDown() override
82 thread_unset_operational_network(instance);
83 thread_network_destroy(network);
85 thread_disable(instance);
88 thread_deinitialize();
94 for (int i = 0; i < DUMMY_TLVS_SIZE; ++i)
97 memcpy(subBuffer, &DUMMY_TLVS_STR[2 * i], 2);
99 tlvsBuffer[i] = (uint8_t)strtol(subBuffer, NULL, 16);
103 void makeIpv6Address()
105 struct in6_addr result;
106 inet_pton(AF_INET6, DUMMY_IPV6_ADDRESS, &result);
107 memcpy(ipv6Address, result.s6_addr,
108 THREAD_IPV6_PREFIX_SIZE * sizeof(uint8_t));
112 TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsNotInitialized)
114 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
115 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
116 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
119 TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsInvalidParameter)
121 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
122 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
125 TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsErrorNone)
127 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
128 EXPECT_EQ(THREAD_ERROR_NONE,
129 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
132 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsNotInitialized)
134 uint8_t *tlvs_buffer = NULL;
135 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
136 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
137 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
141 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsInvalidParameter)
143 uint8_t *tlvs_buffer = NULL;
144 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
145 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
149 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone)
151 uint8_t *tlvs_buffer = NULL;
152 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
153 EXPECT_EQ(THREAD_ERROR_NONE,
154 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
158 TEST_F(ThreadNetworkTest, AttachNotInitialized)
160 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
161 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_attach(instance));
164 TEST_F(ThreadNetworkTest, AttachInvalidParameter)
166 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_attach(instance));
169 TEST_F(ThreadNetworkTest, AttachErrorNone)
171 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
172 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_attach(instance));
175 TEST_F(ThreadNetworkTest, DetachNotInitialized)
177 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
178 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_detach(instance));
181 TEST_F(ThreadNetworkTest, DetachInvalidParameter)
183 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_detach(instance));
186 TEST_F(ThreadNetworkTest, DetachErrorNone)
188 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
189 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
190 EXPECT_EQ(THREAD_ERROR_NONE,
191 thread_set_operational_network(instance, network));
192 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_detach(instance));
195 TEST_F(ThreadNetworkTest, GetIpAddrNotInitialized)
197 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
198 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
199 thread_get_ipaddr(instance, getIpAddrCallback,
200 THREAD_IPADDR_TYPE_ALL, nullptr));
203 TEST_F(ThreadNetworkTest, GetIpAddrInvalidParameter)
205 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
206 thread_get_ipaddr(instance, getIpAddrCallback,
207 THREAD_IPADDR_TYPE_ALL, nullptr));
210 TEST_F(ThreadNetworkTest, GetIpAddrErrorNone)
212 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
213 EXPECT_EQ(THREAD_ERROR_NONE,
214 thread_get_ipaddr(instance, getIpAddrCallback,
215 THREAD_IPADDR_TYPE_ALL, nullptr));
216 EXPECT_EQ(THREAD_ERROR_NONE,
217 thread_get_ipaddr(instance, getIpAddrCallback,
218 THREAD_IPADDR_TYPE_LINK_LOCAL, nullptr));
219 EXPECT_EQ(THREAD_ERROR_NONE,
220 thread_get_ipaddr(instance, getIpAddrCallback,
221 THREAD_IPADDR_TYPE_RLOC, nullptr));
222 EXPECT_EQ(THREAD_ERROR_NONE,
223 thread_get_ipaddr(instance, getIpAddrCallback,
224 THREAD_IPADDR_TYPE_MLEID, nullptr));
227 TEST_F(ThreadNetworkTest, AddIpAddrNotInitialized)
229 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
230 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
231 thread_add_ipaddr(instance, ipv6Address));
234 TEST_F(ThreadNetworkTest, AddIpAddrInvalidParameter)
236 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
237 thread_add_ipaddr(instance, ipv6Address));
240 TEST_F(ThreadNetworkTest, AddIpAddrErrorNone)
242 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
243 EXPECT_EQ(THREAD_ERROR_NONE,
244 thread_add_ipaddr(instance, ipv6Address));
247 TEST_F(ThreadNetworkTest, RemoveIpAddrNotInitialized)
249 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
250 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
251 thread_remove_ipaddr(instance, ipv6Address));
254 TEST_F(ThreadNetworkTest, RemoveIpAddrInvalidParameter)
256 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
257 thread_remove_ipaddr(instance, ipv6Address));
260 TEST_F(ThreadNetworkTest, RemoveIpAddrErrorNone)
262 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
263 EXPECT_EQ(THREAD_ERROR_NONE,
264 thread_remove_ipaddr(instance, ipv6Address));
267 TEST_F(ThreadNetworkTest, GetPanIdNotInitialized)
270 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
271 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
272 thread_network_get_panid(instance, &panid));
275 TEST_F(ThreadNetworkTest, GetPanIdInvalidParameter)
278 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
279 thread_network_get_panid(instance, &panid));
282 TEST_F(ThreadNetworkTest, GetPanIdErrorNone)
285 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
286 EXPECT_EQ(THREAD_ERROR_NONE,
287 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
288 EXPECT_EQ(THREAD_ERROR_NONE,
289 thread_network_get_panid(instance, &panid));
292 TEST_F(ThreadNetworkTest, CreateNotInitialized)
294 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
295 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_create(&network));
298 TEST_F(ThreadNetworkTest, CreateInvalidParameter)
300 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_create(nullptr));
303 TEST_F(ThreadNetworkTest, CreateErrorNone)
305 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
308 TEST_F(ThreadNetworkTest, DestroyNotInitialized)
310 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
311 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_destroy(network));
314 TEST_F(ThreadNetworkTest, DestroyInvalidParameter)
316 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_destroy(nullptr));
319 TEST_F(ThreadNetworkTest, DestroyErrorNone)
321 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
322 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_destroy(network));
325 TEST_F(ThreadNetworkTest, SetNameNotInitialized)
327 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
328 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
329 thread_network_set_name(network, NETWORK_DUMMY_NAME));
332 TEST_F(ThreadNetworkTest, SetNameInvalidParameter)
334 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
335 thread_network_set_name(nullptr, NETWORK_DUMMY_NAME));
338 TEST_F(ThreadNetworkTest, SetNameErrorNone)
340 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
341 EXPECT_EQ(THREAD_ERROR_NONE,
342 thread_network_set_name(network, NETWORK_DUMMY_NAME));
345 TEST_F(ThreadNetworkTest, SetKeyNotInitialized)
347 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
348 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
349 thread_network_set_key(network, NETWORK_DUMMY_KEY));
352 TEST_F(ThreadNetworkTest, SetKeyInvalidParameter)
354 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
355 thread_network_set_key(nullptr, NETWORK_DUMMY_KEY));
358 TEST_F(ThreadNetworkTest, SetKeyErrorNone)
360 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
361 EXPECT_EQ(THREAD_ERROR_NONE,
362 thread_network_set_key(network, NETWORK_DUMMY_KEY));
365 TEST_F(ThreadNetworkTest, SetPskcNotInitialized)
367 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
368 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
369 thread_network_set_pskc(network, NETWORK_DUMMY_PSKC));
372 TEST_F(ThreadNetworkTest, SetPskcInvalidParameter)
374 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
375 thread_network_set_pskc(nullptr, NETWORK_DUMMY_PSKC));
378 TEST_F(ThreadNetworkTest, SetPskcErrorNone)
380 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
381 EXPECT_EQ(THREAD_ERROR_NONE,
382 thread_network_set_pskc(network, NETWORK_DUMMY_PSKC));
385 TEST_F(ThreadNetworkTest, SetChannelNotInitialized)
387 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
388 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
389 thread_network_set_channel(network, NETWORK_DUMMY_CHANNEL));
392 TEST_F(ThreadNetworkTest, SetChannelInvalidParameter)
394 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
395 thread_network_set_channel(nullptr, NETWORK_DUMMY_CHANNEL));
398 TEST_F(ThreadNetworkTest, SetChannelErrorNone)
400 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
401 EXPECT_EQ(THREAD_ERROR_NONE,
402 thread_network_set_channel(network, NETWORK_DUMMY_CHANNEL));
405 TEST_F(ThreadNetworkTest, SetExtendedPanidNotInitialized)
407 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
408 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
409 thread_network_set_extended_panid(network, NETWORK_DUMMY_EXTENDED_PANID));
412 TEST_F(ThreadNetworkTest, SetExtendedPanidInvalidParameter)
414 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
415 thread_network_set_extended_panid(nullptr, NETWORK_DUMMY_EXTENDED_PANID));
418 TEST_F(ThreadNetworkTest, SetExtendedPanidErrorNone)
420 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
421 EXPECT_EQ(THREAD_ERROR_NONE,
422 thread_network_set_extended_panid(network, NETWORK_DUMMY_EXTENDED_PANID));
425 TEST_F(ThreadNetworkTest, SetPanidNotInitialized)
427 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
428 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
429 thread_network_set_panid(network, NETWORK_DUMMY_PANID));
432 TEST_F(ThreadNetworkTest, SetPanidInvalidParameter)
434 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
435 thread_network_set_panid(nullptr, NETWORK_DUMMY_PANID));
438 TEST_F(ThreadNetworkTest, SetPanidErrorNone)
440 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
441 EXPECT_EQ(THREAD_ERROR_NONE,
442 thread_network_set_panid(network, NETWORK_DUMMY_PANID));
445 TEST_F(ThreadNetworkTest, SetOperationalNetworkNotInitialized)
447 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
448 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
449 thread_set_operational_network(instance, network));
452 TEST_F(ThreadNetworkTest, SetOperationalNetworkInvalidParameter)
454 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
455 thread_set_operational_network(instance, network));
458 TEST_F(ThreadNetworkTest, SetOperationalNetworkErrorNone)
460 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
461 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
462 EXPECT_EQ(THREAD_ERROR_NONE,
463 thread_set_operational_network(instance, network));
466 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkNotInitialized)
468 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
469 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
470 thread_unset_operational_network(instance));
473 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkInvalidParameter)
475 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
476 thread_unset_operational_network(instance));
479 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkErrorNone)
481 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
482 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
483 EXPECT_EQ(THREAD_ERROR_NONE,
484 thread_set_operational_network(instance, network));
485 EXPECT_EQ(THREAD_ERROR_NONE,
486 thread_unset_operational_network(instance));