Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Test_LoRaMac.cpp
00001 /* 00002 * Copyright (c) 2018, Arm Limited and affiliates 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 00018 #include "gtest/gtest.h" 00019 #include "LoRaMac.h" 00020 #include "LoRaPHY_stub.h" 00021 #include "LoRaMacCrypto_stub.h" 00022 #include "LoRaMacCommand_stub.h" 00023 #include "LoRaWANTimer_stub.h" 00024 #include "EventQueue_stub.h" 00025 00026 using namespace events; 00027 00028 class my_phy : public LoRaPHY 00029 { 00030 public: 00031 my_phy(){}; 00032 00033 virtual ~my_phy(){}; 00034 }; 00035 00036 class Test_LoRaMac : public testing::Test { 00037 protected: 00038 LoRaMac *object; 00039 00040 virtual void SetUp() 00041 { 00042 object = new LoRaMac(); 00043 } 00044 00045 virtual void TearDown() 00046 { 00047 delete object; 00048 } 00049 }; 00050 00051 TEST_F(Test_LoRaMac, constructor) 00052 { 00053 EXPECT_TRUE(object); 00054 } 00055 00056 void my_cb() 00057 { 00058 00059 } 00060 00061 TEST_F(Test_LoRaMac, initialize) 00062 { 00063 my_phy phy; 00064 object->bind_phy(phy); 00065 00066 lorawan_connect_t conn; 00067 uint8_t key[16]; 00068 conn.connection_u.otaa.app_key = key; 00069 conn.connection_u.otaa.app_eui = key; 00070 conn.connection_u.otaa.dev_eui = key; 00071 conn.connection_u.otaa.nb_trials = 2; 00072 object->prepare_join(&conn, true); 00073 00074 LoRaWANTimer_stub::call_cb_immediately = true; 00075 EXPECT_TRUE(LORAWAN_STATUS_OK == object->initialize(NULL, my_cb)); 00076 } 00077 00078 TEST_F(Test_LoRaMac, disconnect) 00079 { 00080 object->disconnect(); 00081 } 00082 00083 TEST_F(Test_LoRaMac, nwk_joined) 00084 { 00085 EXPECT_EQ(false, object->nwk_joined()); 00086 } 00087 00088 TEST_F(Test_LoRaMac, add_channel_plan) 00089 { 00090 lorawan_channelplan_t plan; 00091 EXPECT_EQ(LORAWAN_STATUS_OK, object->add_channel_plan(plan)); 00092 00093 object->set_tx_ongoing(true); 00094 EXPECT_EQ(LORAWAN_STATUS_BUSY, object->add_channel_plan(plan)); 00095 } 00096 00097 TEST_F(Test_LoRaMac, remove_channel_plan) 00098 { 00099 EXPECT_EQ(LORAWAN_STATUS_OK, object->remove_channel_plan()); 00100 00101 object->set_tx_ongoing(true); 00102 EXPECT_EQ(LORAWAN_STATUS_BUSY, object->remove_channel_plan()); 00103 } 00104 00105 TEST_F(Test_LoRaMac, get_channel_plan) 00106 { 00107 lorawan_channelplan_t plan; 00108 EXPECT_EQ(LORAWAN_STATUS_OK, object->get_channel_plan(plan)); 00109 } 00110 00111 TEST_F(Test_LoRaMac, remove_single_channel) 00112 { 00113 EXPECT_EQ(LORAWAN_STATUS_OK, object->remove_single_channel(1)); 00114 00115 object->set_tx_ongoing(true); 00116 EXPECT_EQ(LORAWAN_STATUS_BUSY, object->remove_single_channel(1)); 00117 } 00118 00119 TEST_F(Test_LoRaMac, multicast_channel_link) 00120 { 00121 multicast_params_t p; 00122 00123 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->multicast_channel_link(NULL)); 00124 00125 object->set_tx_ongoing(true); 00126 EXPECT_EQ(LORAWAN_STATUS_BUSY, object->multicast_channel_link(&p)); 00127 00128 object->set_tx_ongoing(false); 00129 EXPECT_EQ(LORAWAN_STATUS_OK, object->multicast_channel_link(&p)); 00130 } 00131 00132 TEST_F(Test_LoRaMac, multicast_channel_unlink) 00133 { 00134 multicast_params_t p; 00135 00136 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->multicast_channel_unlink(NULL)); 00137 00138 object->set_tx_ongoing(true); 00139 EXPECT_EQ(LORAWAN_STATUS_BUSY, object->multicast_channel_unlink(&p)); 00140 00141 object->set_tx_ongoing(false); 00142 EXPECT_EQ(LORAWAN_STATUS_OK, object->multicast_channel_unlink(&p)); 00143 } 00144 00145 TEST_F(Test_LoRaMac, send) 00146 { 00147 loramac_mhdr_t mac_hdr; 00148 uint8_t buf[15]; 00149 mac_hdr.bits.mtype = FRAME_TYPE_DATA_CONFIRMED_UP ; 00150 object->send(&mac_hdr, 1, buf, 15); 00151 } 00152 00153 TEST_F(Test_LoRaMac, get_default_tx_datarate) 00154 { 00155 object->get_default_tx_datarate(); 00156 } 00157 00158 TEST_F(Test_LoRaMac, enable_adaptive_datarate) 00159 { 00160 object->enable_adaptive_datarate(true); 00161 } 00162 00163 TEST_F(Test_LoRaMac, set_channel_data_rate) 00164 { 00165 object->set_channel_data_rate(8); 00166 } 00167 00168 TEST_F(Test_LoRaMac, tx_ongoing) 00169 { 00170 object->tx_ongoing(); 00171 } 00172 00173 TEST_F(Test_LoRaMac, set_tx_ongoing) 00174 { 00175 object->set_tx_ongoing(true); 00176 } 00177 00178 TEST_F(Test_LoRaMac, reset_ongoing_tx) 00179 { 00180 object->reset_ongoing_tx(true); 00181 } 00182 00183 TEST_F(Test_LoRaMac, prepare_ongoing_tx) 00184 { 00185 uint8_t buf[16]; 00186 object->prepare_ongoing_tx(1, buf, 16, 1, 0); 00187 } 00188 00189 TEST_F(Test_LoRaMac, send_ongoing_tx) 00190 { 00191 object->send_ongoing_tx(); 00192 } 00193 00194 TEST_F(Test_LoRaMac, get_device_class) 00195 { 00196 object->get_device_class(); 00197 } 00198 00199 void exp_cb() 00200 { 00201 00202 } 00203 00204 TEST_F(Test_LoRaMac, set_device_class) 00205 { 00206 object->set_device_class(CLASS_B, exp_cb); 00207 } 00208 00209 TEST_F(Test_LoRaMac, setup_link_check_request) 00210 { 00211 object->setup_link_check_request(); 00212 } 00213 00214 TEST_F(Test_LoRaMac, prepare_join) 00215 { 00216 lorawan_connect_t conn; 00217 object->prepare_join(&conn, false); 00218 00219 my_phy phy; 00220 object->bind_phy(phy); 00221 EXPECT_EQ(LORAWAN_STATUS_OK, object->join(false)); 00222 00223 uint8_t key[16]; 00224 conn.connection_u.otaa.app_key = NULL; 00225 conn.connection_u.otaa.app_eui = NULL; 00226 conn.connection_u.otaa.dev_eui = NULL; 00227 conn.connection_u.otaa.nb_trials = 0; 00228 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, true)); 00229 00230 conn.connection_u.otaa.app_key = key; 00231 conn.connection_u.otaa.app_eui = NULL; 00232 conn.connection_u.otaa.dev_eui = NULL; 00233 conn.connection_u.otaa.nb_trials = 0; 00234 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, true)); 00235 00236 conn.connection_u.otaa.app_key = key; 00237 conn.connection_u.otaa.app_eui = key; 00238 conn.connection_u.otaa.dev_eui = NULL; 00239 conn.connection_u.otaa.nb_trials = 0; 00240 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, true)); 00241 00242 conn.connection_u.otaa.app_key = key; 00243 conn.connection_u.otaa.app_eui = key; 00244 conn.connection_u.otaa.dev_eui = key; 00245 conn.connection_u.otaa.nb_trials = 0; 00246 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, true)); 00247 00248 LoRaPHY_stub::bool_table[0] = false; 00249 LoRaPHY_stub::bool_counter = 0; 00250 conn.connection_u.otaa.app_key = key; 00251 conn.connection_u.otaa.app_eui = key; 00252 conn.connection_u.otaa.dev_eui = key; 00253 conn.connection_u.otaa.nb_trials = 2; 00254 EXPECT_EQ(LORAWAN_STATUS_OK, object->prepare_join(&conn, true)); 00255 00256 conn.connection_u.abp.dev_addr = 0; 00257 conn.connection_u.abp.nwk_id = 0; 00258 conn.connection_u.abp.nwk_skey = NULL; 00259 conn.connection_u.abp.app_skey = NULL; 00260 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, false)); 00261 00262 conn.connection_u.abp.dev_addr = 1; 00263 conn.connection_u.abp.nwk_id = 0; 00264 conn.connection_u.abp.nwk_skey = NULL; 00265 conn.connection_u.abp.app_skey = NULL; 00266 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, false)); 00267 00268 conn.connection_u.abp.dev_addr = 1; 00269 conn.connection_u.abp.nwk_id = 2; 00270 conn.connection_u.abp.nwk_skey = NULL; 00271 conn.connection_u.abp.app_skey = NULL; 00272 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, false)); 00273 00274 conn.connection_u.abp.dev_addr = 1; 00275 conn.connection_u.abp.nwk_id = 2; 00276 conn.connection_u.abp.nwk_skey = key; 00277 conn.connection_u.abp.app_skey = NULL; 00278 EXPECT_EQ(LORAWAN_STATUS_PARAMETER_INVALID, object->prepare_join(&conn, false)); 00279 00280 conn.connection_u.abp.dev_addr = 1; 00281 conn.connection_u.abp.nwk_id = 2; 00282 conn.connection_u.abp.nwk_skey = key; 00283 conn.connection_u.abp.app_skey = key; 00284 EXPECT_EQ(LORAWAN_STATUS_OK, object->prepare_join(&conn, false)); 00285 00286 EXPECT_EQ(LORAWAN_STATUS_OK, object->prepare_join(NULL, false)); 00287 } 00288 00289 TEST_F(Test_LoRaMac, join) 00290 { 00291 my_phy phy; 00292 object->bind_phy(phy); 00293 EXPECT_EQ(LORAWAN_STATUS_OK, object->join(false)); 00294 00295 lorawan_connect_t conn; 00296 uint8_t key[16]; 00297 conn.connection_u.otaa.app_key = key; 00298 conn.connection_u.otaa.app_eui = key; 00299 conn.connection_u.otaa.dev_eui = key; 00300 conn.connection_u.otaa.nb_trials = 2; 00301 object->prepare_join(&conn, true); 00302 EXPECT_EQ(LORAWAN_STATUS_CONNECT_IN_PROGRESS, object->join(true)); 00303 } 00304 00305 TEST_F(Test_LoRaMac, on_radio_tx_done) 00306 { 00307 my_phy phy; 00308 object->bind_phy(phy); 00309 object->on_radio_tx_done(100); 00310 } 00311 00312 TEST_F(Test_LoRaMac, on_radio_rx_done) 00313 { 00314 uint8_t buf[16]; 00315 object->on_radio_rx_done(buf, 16, 0, 0); 00316 } 00317 00318 TEST_F(Test_LoRaMac, on_radio_tx_timeout) 00319 { 00320 object->on_radio_tx_timeout(); 00321 } 00322 00323 TEST_F(Test_LoRaMac, on_radio_rx_timeout) 00324 { 00325 object->on_radio_rx_timeout(true); 00326 } 00327 00328 TEST_F(Test_LoRaMac, continue_joining_process) 00329 { 00330 my_phy phy; 00331 object->bind_phy(phy); 00332 lorawan_connect_t conn; 00333 uint8_t key[16]; 00334 conn.connection_u.otaa.app_key = key; 00335 conn.connection_u.otaa.app_eui = key; 00336 conn.connection_u.otaa.dev_eui = key; 00337 conn.connection_u.otaa.nb_trials = 2; 00338 object->prepare_join(&conn, true); 00339 object->continue_joining_process(); 00340 } 00341 00342 TEST_F(Test_LoRaMac, continue_sending_process) 00343 { 00344 my_phy phy; 00345 object->bind_phy(phy); 00346 object->continue_sending_process(); 00347 } 00348 00349 TEST_F(Test_LoRaMac, get_mcps_confirmation) 00350 { 00351 object->get_mcps_confirmation(); 00352 } 00353 00354 TEST_F(Test_LoRaMac, get_mcps_indication) 00355 { 00356 object->get_mcps_indication(); 00357 } 00358 00359 TEST_F(Test_LoRaMac, get_mlme_confirmation) 00360 { 00361 object->get_mlme_confirmation(); 00362 } 00363 00364 TEST_F(Test_LoRaMac, get_mlme_indication) 00365 { 00366 object->get_mlme_indication(); 00367 } 00368 00369 TEST_F(Test_LoRaMac, post_process_mcps_req) 00370 { 00371 uint8_t data[16]; 00372 LoRaPHY_stub::bool_counter = 0; 00373 LoRaPHY_stub::bool_table[0] = true; 00374 00375 my_phy phy; 00376 object->bind_phy(phy); 00377 object->join(false); 00378 00379 object->prepare_ongoing_tx(1, data, 15, 0x01, 2); 00380 object->send_ongoing_tx(); 00381 object->post_process_mcps_req(); 00382 00383 LoRaPHY_stub::bool_counter = 0; 00384 object->prepare_ongoing_tx(1, data, 15, 0x02, 2); 00385 object->send_ongoing_tx(); 00386 object->post_process_mcps_req(); 00387 00388 //_mcps_confirmation.ack_received missing here 00389 uint8_t payload[16] = {}; 00390 LoRaPHY_stub::uint16_value = 5; 00391 payload[0] = FRAME_TYPE_DATA_CONFIRMED_DOWN << 5; 00392 payload[5] = 1 << 5; 00393 00394 //address != _params.dev_addr 00395 payload[2] = 2; 00396 object->on_radio_rx_done(payload, 16, 0, 0); 00397 object->post_process_mcps_req(); 00398 00399 payload[2] = 0; 00400 //mic failure 00401 payload[13] = 2; 00402 object->on_radio_rx_done(payload, 16, 0, 0); 00403 object->post_process_mcps_req(); 00404 00405 payload[13] = 0; 00406 //crypto failure 00407 LoRaMacCrypto_stub::int_table_idx_value = 0; 00408 LoRaMacCrypto_stub::int_table[0] = 4; 00409 LoRaMacCrypto_stub::int_table[1] = 4; 00410 // LoRaPHY_stub::uint16_value = 0; 00411 object->on_radio_rx_done(payload, 16, 0, 0); 00412 object->post_process_mcps_req(); 00413 00414 //process_mac_commands failure 00415 LoRaMacCommand_stub::status_value = LORAWAN_STATUS_BUSY; 00416 LoRaMacCrypto_stub::int_table[0] = 0; 00417 LoRaMacCrypto_stub::int_table[1] = 0; 00418 payload[7] = 1; 00419 object->on_radio_rx_done(payload, 16, 0, 0); 00420 object->post_process_mcps_req(); 00421 00422 //FOpts_len != 0 00423 payload[5] = (1 << 5) + 1; 00424 payload[7] = 0; 00425 LoRaMacCommand_stub::status_value = LORAWAN_STATUS_OK; 00426 payload[0] = FRAME_TYPE_DATA_UNCONFIRMED_DOWN << 5; 00427 00428 object->on_radio_rx_done(payload, 13, 0, 0); 00429 00430 //_mac_commands.process_mac_commands fails 00431 LoRaMacCommand_stub::status_value = LORAWAN_STATUS_DATARATE_INVALID; 00432 object->on_radio_rx_done(payload, 13, 0, 0); 00433 00434 object->post_process_mcps_req(); 00435 00436 payload[9] = 1; 00437 LoRaMacCommand_stub::status_value = LORAWAN_STATUS_OK; 00438 payload[0] = FRAME_TYPE_PROPRIETARY << 5; 00439 object->on_radio_rx_done(payload, 16, 0, 0); 00440 object->post_process_mcps_req(); 00441 00442 payload[9] = 0; 00443 payload[5] = 1 << 5; 00444 LoRaMacCommand_stub::status_value = LORAWAN_STATUS_OK; 00445 object->on_radio_rx_done(payload, 16, 0, 0); 00446 object->post_process_mcps_req(); 00447 00448 LoRaPHY_stub::bool_counter = 0; 00449 object->prepare_ongoing_tx(1, data, 15, 0x04, 2); 00450 object->send_ongoing_tx(); 00451 object->post_process_mcps_req(); 00452 00453 LoRaPHY_stub::bool_counter = 0; 00454 object->prepare_ongoing_tx(1, data, 15, 0x08, 2); 00455 object->send_ongoing_tx(); 00456 object->post_process_mcps_req(); 00457 } 00458 00459 TEST_F(Test_LoRaMac, handle_join_accept_frame) 00460 { 00461 LoRaPHY_stub::bool_counter = 0; 00462 LoRaPHY_stub::bool_table[0] = true; 00463 00464 my_phy phy; 00465 object->bind_phy(phy); 00466 00467 uint8_t payload[16] = {}; 00468 LoRaPHY_stub::uint16_value = 5; 00469 payload[0] = FRAME_TYPE_JOIN_ACCEPT << 5; 00470 payload[5] = 1 << 5; 00471 00472 LoRaMacCrypto_stub::int_table_idx_value = 0; 00473 LoRaMacCrypto_stub::int_table[0] = 4; 00474 LoRaMacCrypto_stub::int_table[1] = 4; 00475 LoRaMacCrypto_stub::int_table[2] = 4; 00476 LoRaMacCrypto_stub::int_table[3] = 4; 00477 object->on_radio_rx_done(payload, 16, 0, 0); 00478 00479 LoRaMacCrypto_stub::int_table_idx_value = 0; 00480 LoRaMacCrypto_stub::int_table[0] = 0; 00481 object->on_radio_rx_done(payload, 16, 0, 0); 00482 00483 LoRaMacCrypto_stub::int_table_idx_value = 0; 00484 LoRaMacCrypto_stub::int_table[1] = 0; 00485 object->on_radio_rx_done(payload, 16, 0, 0); 00486 00487 //mic failure case 00488 payload[13] = 17; 00489 LoRaMacCrypto_stub::int_table_idx_value = 0; 00490 object->on_radio_rx_done(payload, 16, 0, 0); 00491 00492 payload[13] = 0; 00493 LoRaMacCrypto_stub::int_table_idx_value = 0; 00494 LoRaMacCrypto_stub::int_table[2] = 0; 00495 object->on_radio_rx_done(payload, 16, 0, 0); 00496 } 00497 00498 TEST_F(Test_LoRaMac, post_process_mcps_ind) 00499 { 00500 object->post_process_mcps_ind(); 00501 } 00502 00503 TEST_F(Test_LoRaMac, post_process_mlme_request) 00504 { 00505 object->post_process_mlme_request(); 00506 } 00507 00508 TEST_F(Test_LoRaMac, post_process_mlme_ind) 00509 { 00510 object->post_process_mlme_ind(); 00511 } 00512 00513 uint8_t batt_cb() 00514 { 00515 00516 } 00517 00518 TEST_F(Test_LoRaMac, set_batterylevel_callback) 00519 { 00520 object->set_batterylevel_callback(batt_cb); 00521 } 00522 00523 TEST_F(Test_LoRaMac, get_backoff_timer_event_id) 00524 { 00525 object->get_backoff_timer_event_id(); 00526 } 00527 00528 TEST_F(Test_LoRaMac, clear_tx_pipe) 00529 { 00530 EXPECT_EQ(LORAWAN_STATUS_OK, object->clear_tx_pipe()); //timer id == 0 00531 00532 my_phy phy; 00533 object->bind_phy(phy); 00534 00535 lorawan_connect_t conn; 00536 uint8_t key[16]; 00537 conn.connection_u.otaa.app_key = key; 00538 conn.connection_u.otaa.app_eui = key; 00539 conn.connection_u.otaa.dev_eui = key; 00540 conn.connection_u.otaa.nb_trials = 2; 00541 object->prepare_join(&conn, true); 00542 00543 EXPECT_TRUE(LORAWAN_STATUS_OK == object->initialize(NULL, my_cb)); 00544 EventQueue_stub::int_value = 0; 00545 EXPECT_EQ(LORAWAN_STATUS_BUSY, object->clear_tx_pipe()); 00546 00547 EventQueue_stub::int_value = 1; 00548 EXPECT_EQ(LORAWAN_STATUS_OK, object->clear_tx_pipe()); 00549 } 00550 00551 TEST_F(Test_LoRaMac, get_current_time) 00552 { 00553 object->get_current_time(); 00554 } 00555 00556 TEST_F(Test_LoRaMac, get_current_slot) 00557 { 00558 object->get_current_slot(); 00559 } 00560
Generated on Tue Aug 9 2022 00:37:22 by
1.7.2