takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Test_LoRaMac.cpp Source File

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