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));
140 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsInvalidParameter)
142 uint8_t *tlvs_buffer = NULL;
143 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
144 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
147 TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone)
149 uint8_t *tlvs_buffer = NULL;
150 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
151 EXPECT_EQ(THREAD_ERROR_NONE,
152 thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength));
156 TEST_F(ThreadNetworkTest, AttachNotInitialized)
158 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
159 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_attach(instance));
162 TEST_F(ThreadNetworkTest, AttachInvalidParameter)
164 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_attach(instance));
167 TEST_F(ThreadNetworkTest, AttachErrorNone)
169 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
170 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_attach(instance));
173 TEST_F(ThreadNetworkTest, DetachNotInitialized)
175 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
176 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_detach(instance));
179 TEST_F(ThreadNetworkTest, DetachInvalidParameter)
181 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_detach(instance));
184 TEST_F(ThreadNetworkTest, DetachErrorNone)
186 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
187 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
188 EXPECT_EQ(THREAD_ERROR_NONE,
189 thread_set_operational_network(instance, network));
190 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_detach(instance));
193 TEST_F(ThreadNetworkTest, GetIpAddrNotInitialized)
195 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
196 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
197 thread_get_ipaddr(instance, getIpAddrCallback,
198 THREAD_IPADDR_TYPE_ALL, nullptr));
201 TEST_F(ThreadNetworkTest, GetIpAddrInvalidParameter)
203 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
204 thread_get_ipaddr(instance, getIpAddrCallback,
205 THREAD_IPADDR_TYPE_ALL, nullptr));
208 TEST_F(ThreadNetworkTest, GetIpAddrErrorNone)
210 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
211 EXPECT_EQ(THREAD_ERROR_NONE,
212 thread_get_ipaddr(instance, getIpAddrCallback,
213 THREAD_IPADDR_TYPE_ALL, nullptr));
214 EXPECT_EQ(THREAD_ERROR_NONE,
215 thread_get_ipaddr(instance, getIpAddrCallback,
216 THREAD_IPADDR_TYPE_LINK_LOCAL, nullptr));
217 EXPECT_EQ(THREAD_ERROR_NONE,
218 thread_get_ipaddr(instance, getIpAddrCallback,
219 THREAD_IPADDR_TYPE_RLOC, nullptr));
220 EXPECT_EQ(THREAD_ERROR_NONE,
221 thread_get_ipaddr(instance, getIpAddrCallback,
222 THREAD_IPADDR_TYPE_MLEID, nullptr));
225 TEST_F(ThreadNetworkTest, AddIpAddrNotInitialized)
227 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
228 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
229 thread_add_ipaddr(instance, ipv6Address));
232 TEST_F(ThreadNetworkTest, AddIpAddrInvalidParameter)
234 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
235 thread_add_ipaddr(instance, ipv6Address));
238 TEST_F(ThreadNetworkTest, AddIpAddrErrorNone)
240 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
241 EXPECT_EQ(THREAD_ERROR_NONE,
242 thread_add_ipaddr(instance, ipv6Address));
245 TEST_F(ThreadNetworkTest, RemoveIpAddrNotInitialized)
247 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
248 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
249 thread_remove_ipaddr(instance, ipv6Address));
252 TEST_F(ThreadNetworkTest, RemoveIpAddrInvalidParameter)
254 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
255 thread_remove_ipaddr(instance, ipv6Address));
258 TEST_F(ThreadNetworkTest, RemoveIpAddrErrorNone)
260 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
261 EXPECT_EQ(THREAD_ERROR_NONE,
262 thread_remove_ipaddr(instance, ipv6Address));
265 TEST_F(ThreadNetworkTest, GetPanIdNotInitialized)
268 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
269 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
270 thread_network_get_panid(instance, &panid));
273 TEST_F(ThreadNetworkTest, GetPanIdInvalidParameter)
276 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
277 thread_network_get_panid(instance, &panid));
280 TEST_F(ThreadNetworkTest, GetPanIdErrorNone)
283 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
284 EXPECT_EQ(THREAD_ERROR_NONE,
285 thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength));
286 EXPECT_EQ(THREAD_ERROR_NONE,
287 thread_network_get_panid(instance, &panid));
290 TEST_F(ThreadNetworkTest, CreateNotInitialized)
292 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
293 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_create(&network));
296 TEST_F(ThreadNetworkTest, CreateInvalidParameter)
298 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_create(nullptr));
301 TEST_F(ThreadNetworkTest, CreateErrorNone)
303 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
306 TEST_F(ThreadNetworkTest, DestroyNotInitialized)
308 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
309 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_destroy(network));
312 TEST_F(ThreadNetworkTest, DestroyInvalidParameter)
314 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_destroy(nullptr));
317 TEST_F(ThreadNetworkTest, DestroyErrorNone)
319 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
320 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_destroy(network));
323 TEST_F(ThreadNetworkTest, SetNameNotInitialized)
325 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
326 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
327 thread_network_set_name(network, NETWORK_DUMMY_NAME));
330 TEST_F(ThreadNetworkTest, SetNameInvalidParameter)
332 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
333 thread_network_set_name(nullptr, NETWORK_DUMMY_NAME));
336 TEST_F(ThreadNetworkTest, SetNameErrorNone)
338 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
339 EXPECT_EQ(THREAD_ERROR_NONE,
340 thread_network_set_name(network, NETWORK_DUMMY_NAME));
343 TEST_F(ThreadNetworkTest, SetKeyNotInitialized)
345 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
346 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
347 thread_network_set_key(network, NETWORK_DUMMY_KEY));
350 TEST_F(ThreadNetworkTest, SetKeyInvalidParameter)
352 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
353 thread_network_set_key(nullptr, NETWORK_DUMMY_KEY));
356 TEST_F(ThreadNetworkTest, SetKeyErrorNone)
358 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
359 EXPECT_EQ(THREAD_ERROR_NONE,
360 thread_network_set_key(network, NETWORK_DUMMY_KEY));
363 TEST_F(ThreadNetworkTest, SetPskcNotInitialized)
365 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
366 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
367 thread_network_set_pskc(network, NETWORK_DUMMY_PSKC));
370 TEST_F(ThreadNetworkTest, SetPskcInvalidParameter)
372 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
373 thread_network_set_pskc(nullptr, NETWORK_DUMMY_PSKC));
376 TEST_F(ThreadNetworkTest, SetPskcErrorNone)
378 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
379 EXPECT_EQ(THREAD_ERROR_NONE,
380 thread_network_set_pskc(network, NETWORK_DUMMY_PSKC));
383 TEST_F(ThreadNetworkTest, SetChannelNotInitialized)
385 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
386 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
387 thread_network_set_channel(network, NETWORK_DUMMY_CHANNEL));
390 TEST_F(ThreadNetworkTest, SetChannelInvalidParameter)
392 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
393 thread_network_set_channel(nullptr, NETWORK_DUMMY_CHANNEL));
396 TEST_F(ThreadNetworkTest, SetChannelErrorNone)
398 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
399 EXPECT_EQ(THREAD_ERROR_NONE,
400 thread_network_set_channel(network, NETWORK_DUMMY_CHANNEL));
403 TEST_F(ThreadNetworkTest, SetExtendedPanidNotInitialized)
405 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
406 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
407 thread_network_set_extended_panid(network, NETWORK_DUMMY_EXTENDED_PANID));
410 TEST_F(ThreadNetworkTest, SetExtendedPanidInvalidParameter)
412 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
413 thread_network_set_extended_panid(nullptr, NETWORK_DUMMY_EXTENDED_PANID));
416 TEST_F(ThreadNetworkTest, SetExtendedPanidErrorNone)
418 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
419 EXPECT_EQ(THREAD_ERROR_NONE,
420 thread_network_set_extended_panid(network, NETWORK_DUMMY_EXTENDED_PANID));
423 TEST_F(ThreadNetworkTest, SetPanidNotInitialized)
425 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
426 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
427 thread_network_set_panid(network, NETWORK_DUMMY_PANID));
430 TEST_F(ThreadNetworkTest, SetPanidInvalidParameter)
432 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
433 thread_network_set_panid(nullptr, NETWORK_DUMMY_PANID));
436 TEST_F(ThreadNetworkTest, SetPanidErrorNone)
438 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
439 EXPECT_EQ(THREAD_ERROR_NONE,
440 thread_network_set_panid(network, NETWORK_DUMMY_PANID));
443 TEST_F(ThreadNetworkTest, SetOperationalNetworkNotInitialized)
445 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
446 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
447 thread_set_operational_network(instance, network));
450 TEST_F(ThreadNetworkTest, SetOperationalNetworkInvalidParameter)
452 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
453 thread_set_operational_network(instance, network));
456 TEST_F(ThreadNetworkTest, SetOperationalNetworkErrorNone)
458 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
459 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
460 EXPECT_EQ(THREAD_ERROR_NONE,
461 thread_set_operational_network(instance, network));
464 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkNotInitialized)
466 EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());
467 EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED,
468 thread_unset_operational_network(instance));
471 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkInvalidParameter)
473 EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER,
474 thread_unset_operational_network(instance));
477 TEST_F(ThreadNetworkTest, UnsetOperationalNetworkErrorNone)
479 EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
480 EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create(&network));
481 EXPECT_EQ(THREAD_ERROR_NONE,
482 thread_set_operational_network(instance, network));
483 EXPECT_EQ(THREAD_ERROR_NONE,
484 thread_unset_operational_network(instance));