1. Transitioned to using latest asn1c compiler
[ric-app/admin.git] / test / unit_test_e2sm.cc
diff --git a/test/unit_test_e2sm.cc b/test/unit_test_e2sm.cc
new file mode 100644 (file)
index 0000000..e3432f1
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+  ==================================================================================
+
+  Copyright (c) 2018-2019 AT&T Intellectual Property.
+  
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ==================================================================================
+*/
+
+#define CATCH_CONFIG_MAIN
+#include <catch2/catch.hpp>
+
+#include <cstring>
+#include <assert.h>
+
+#include "e2sm.hpp"
+
+TEST_CASE("E2SM Event Trigger Test Cases", "Encoding/decoding"){
+  
+
+  unsigned char buf[128];
+  size_t buf_size = 128;
+  
+  bool res;
+  asn_dec_rval_t retval;
+
+  e2sm_event_trigger_helper  trigger_data;
+  e2sm_event_trigger_helper trigger_recv;
+
+  e2sm_event_trigger mem_check; // just null declaration to test memory
+  
+  e2sm_event_trigger e2sm_event_trigger;
+  E2N_E2SM_gNB_X2_eventTriggerDefinition_t *event; // used for decoding
+
+
+  SECTION("Encoding event trigger, positive and negative cases"){
+
+    // fill in data
+    trigger_data.egNB_id = "hello world";
+    trigger_data.plmn_id = "something new";
+    trigger_data.egNB_id_type = 2;
+    trigger_data.interface_direction = 1;
+    
+    trigger_data.procedure_code = 27;
+    trigger_data.message_type = 0;
+    
+    //Add multiple interface protocol ie items to cover all test cases ..
+
+    trigger_data.add_protocol_ie_item(1, 1, 1, 1);
+    trigger_data.add_protocol_ie_item(2, 2, 2, 2);
+    trigger_data.add_protocol_ie_item(3, 3, 3, 0);
+    trigger_data.add_protocol_ie_item(4, 3, 4, std::string("Something new"));
+    trigger_data.add_protocol_ie_item(4, 3, 5, std::string("Something old"));
+  
+    res = e2sm_event_trigger.encode_event_trigger(&buf[0], &buf_size, trigger_data);
+    REQUIRE(res == true);
+    
+    event = 0;
+    retval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2SM_gNB_X2_eventTriggerDefinition, (void**)&(event), &buf[0], buf_size);
+    
+    REQUIRE(retval.code == RC_OK);
+    res =  e2sm_event_trigger.get_fields(event, trigger_recv);
+    REQUIRE(res == true);
+    REQUIRE(trigger_recv.interface_direction == trigger_data.interface_direction);
+    REQUIRE(trigger_recv.procedure_code == trigger_data.procedure_code);
+    REQUIRE(trigger_recv.message_type == trigger_data.message_type);
+    REQUIRE(trigger_recv.plmn_id == "som");
+    REQUIRE(trigger_recv.get_list()->size() == trigger_data.get_list()->size());
+    ASN_STRUCT_FREE(asn_DEF_E2N_E2SM_gNB_X2_eventTriggerDefinition, event);
+
+    // buffer size too low
+    buf_size = 2;
+    res = e2sm_event_trigger.encode_event_trigger(&buf[0], &buf_size, trigger_data);
+    REQUIRE(res == false);
+
+    // invalid constraints ...
+    trigger_data.interface_direction = 10;
+    buf_size = 128;
+    res = e2sm_event_trigger.encode_event_trigger(&buf[0], &buf_size, trigger_data);
+    REQUIRE(res == false);
+
+  }
+  
+
+}
+
+
+TEST_CASE("E2SM Indication Header", "e2sm_header"){
+  
+  unsigned char buf_header[128];
+  unsigned char buf_msg[1024];
+  size_t header_size = 128;
+  size_t msg_size = 1024;
+  
+  std::string test_x2ap_message = "This is X2AP !";
+
+  bool res;
+  asn_dec_rval_t retval;
+  e2sm_indication e2sm_builder;
+  e2sm_indication e2sm_receiver;
+  
+  SECTION("Indication Header encoding/decoding"){
+    e2sm_header_helper header_tx;
+  
+    e2sm_header_helper header_re;  
+  
+    header_tx.egNB_id="hello";
+    header_tx.plmn_id="there";
+    header_tx.interface_direction = 1;
+    header_tx.egNB_id_type = 2;
+    
+    // Encode the message
+    res = e2sm_builder.encode_indication_header(&buf_header[0], &header_size, header_tx);
+    REQUIRE(res == true);
+    
+  
+    E2N_E2SM_gNB_X2_indicationHeader_t *header = 0; // used for decoding
+    retval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2SM_gNB_X2_indicationHeader, (void**)&(header), &buf_header[0], header_size);
+
+    REQUIRE(retval.code == RC_OK);
+    
+    res = e2sm_receiver.get_header_fields(header, header_re);
+    REQUIRE(res == true);
+      
+    REQUIRE(header_re.plmn_id == "the");
+    ASN_STRUCT_FREE(asn_DEF_E2N_E2SM_gNB_X2_indicationHeader, header);
+
+    // buffer size too low
+    header_size = 2;
+    res = e2sm_builder.encode_indication_header(&buf_header[0], &header_size, header_tx);
+    REQUIRE(res == false);
+
+    // invalid constraints ...
+    header_tx.interface_direction = 10;
+    header_size = 128;
+    res = e2sm_builder.encode_indication_header(&buf_header[0], &header_size, header_tx);
+    REQUIRE(res == false);
+    
+    
+  }
+
+  SECTION("Indication Message encoding/decoding"){
+    
+    e2sm_message_helper message_tx;
+    e2sm_message_helper message_re;
+
+    message_tx.x2ap_pdu = (unsigned char *)calloc(1024, sizeof(unsigned char));
+    memcpy(message_tx.x2ap_pdu, test_x2ap_message.c_str(), test_x2ap_message.length());
+    message_tx.x2ap_pdu_size = test_x2ap_message.length();
+    
+
+    res = e2sm_builder.encode_indication_message(&buf_msg[0], &msg_size, message_tx);
+    REQUIRE(res == true);
+    
+    E2N_E2SM_gNB_X2_indicationMessage_t *message = 0; // used for decoding
+
+    retval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2SM_gNB_X2_indicationMessage, (void**)&(message), &buf_msg[0], msg_size);
+  
+    REQUIRE(retval.code == RC_OK);
+    res = e2sm_receiver.get_message_fields(message, message_re);
+    REQUIRE(res == true);
+    
+    REQUIRE(message_re.x2ap_pdu_size == message_tx.x2ap_pdu_size);
+    ASN_STRUCT_FREE(asn_DEF_E2N_E2SM_gNB_X2_indicationMessage, message);
+    free(message_tx.x2ap_pdu);
+  }
+  
+}
+
+
+
+TEST_CASE("E2SM Encoding/Decoding", "Control"){
+  
+  unsigned char buf_header[128];
+  unsigned char buf_msg[1024];
+  size_t header_size = 128;
+  size_t msg_size = 1024;
+
+  e2sm_control e2sm_builder;
+  e2sm_header_helper header_tx;
+  e2sm_message_helper message_tx;
+  
+  e2sm_control e2sm_receiver;
+  e2sm_header_helper header_re;
+  e2sm_message_helper message_re;
+
+
+  bool res;
+  asn_dec_rval_t retval;
+
+  E2N_E2SM_gNB_X2_controlHeader_t *header; // used for decoding
+  E2N_E2SM_gNB_X2_controlMessage_t *message; // used for decoding
+
+  SECTION("Control encoding/decoding header"){
+
+    header_tx.egNB_id="hello";
+    header_tx.plmn_id="there";
+    header_tx.interface_direction = 1;
+    header_tx.egNB_id_type = 2;
+
+    
+    res = e2sm_builder.encode_control_header(&buf_header[0], &header_size, header_tx);
+    REQUIRE(res == true);
+    
+    // =================================
+    // Decode the message
+    header = 0;
+    retval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2SM_gNB_X2_controlHeader, (void**)&(header), &buf_header[0], header_size);
+    
+    REQUIRE(retval.code == RC_OK);
+    
+    res = e2sm_receiver.get_header_fields(header, header_re);
+    REQUIRE(res == true);
+    REQUIRE(header_re.plmn_id == "the");
+    REQUIRE(header_re.interface_direction == header_tx.interface_direction);
+    
+    // free the struct since we have already extracted all references
+    ASN_STRUCT_FREE(asn_DEF_E2N_E2SM_gNB_X2_controlHeader, header);
+  }
+
+  SECTION("Control message encoding/decoding"){
+
+    std::string test_x2ap_message = "This is X2AP !";
+    
+    message_tx.x2ap_pdu = (unsigned char *)calloc(1024, sizeof(unsigned char));
+    memcpy(message_tx.x2ap_pdu, test_x2ap_message.c_str(), test_x2ap_message.length());
+    message_tx.x2ap_pdu_size = test_x2ap_message.length();
+
+    res = e2sm_builder.encode_control_message(&buf_msg[0], &msg_size, message_tx);
+    REQUIRE(res == true);
+
+
+    message = 0;
+    retval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2SM_gNB_X2_controlMessage, (void**)&(message), &buf_msg[0], msg_size);
+   
+    REQUIRE(retval.code == RC_OK);
+    res = e2sm_receiver.get_message_fields(message, message_re);
+    REQUIRE(res == true);
+    REQUIRE(message_re.x2ap_pdu_size == message_tx.x2ap_pdu_size);
+    ASN_STRUCT_FREE(asn_DEF_E2N_E2SM_gNB_X2_controlMessage, message);
+    free(message_tx.x2ap_pdu);
+  }
+  
+}