--- /dev/null
+/*\r
+==================================================================================\r
+\r
+ Copyright (c) 2018-2019 AT&T Intellectual Property.\r
+\r
+ Licensed under the Apache License, Version 2.0 (the "License");\r
+ you may not use this file except in compliance with the License.\r
+ You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================================\r
+*/\r
+/*\r
+ * unit_test_sgnb_add_request.cc\r
+ *\r
+ * Created on: Sep 9, 2019\r
+ * Author: sjana\r
+ */\r
+\r
+#define CATCH_CONFIG_MAIN\r
+#include <sgnb_addition_request.hpp>\r
+#include <sgnb_addition_response.hpp>\r
+#include <mdclog/mdclog.h>\r
+#include <catch2/catch.hpp>\r
+\r
+#define BUFFER_SIZE 2048\r
+TEST_CASE("X2AP PDUs", "[X2AP SgNB Addition Request]"){\r
+ \r
+ mdclog_attr_t *attr;\r
+ mdclog_attr_init(&attr);\r
+ mdclog_attr_set_ident(attr, "UNIT TEST XAPP FRAMEWORK");\r
+ mdclog_init(attr);\r
+ mdclog_level_set(MDCLOG_DEBUG);\r
+ mdclog_attr_destroy(attr);\r
+ \r
+ bool res;\r
+ \r
+ sgnb_addition_helper encode_data;\r
+ sgnb_addition_helper decode_data;\r
+\r
+ sgnb_addition_request memcheck_req;\r
+ sgnb_addition_request encode_test;\r
+ sgnb_addition_request decode_test;\r
+ unsigned char buf[BUFFER_SIZE];\r
+ size_t buf_size = BUFFER_SIZE;\r
+\r
+ sgnb_addition_response memcheck_resp; \r
+ sgnb_addition_response resp_out;\r
+ \r
+ unsigned char data_buf[BUFFER_SIZE];\r
+ size_t data_size = BUFFER_SIZE;\r
+\r
+ // sgnb data creation static parameters\r
+ unsigned char enc_alg[] = "Bl";\r
+ unsigned char integrity_alg[] = "md";\r
+ unsigned char sgnb_security_key[] = "12345678912345678912345678912345";\r
+ unsigned char mesgnb_container[] = "Information";\r
+ unsigned char transport_layer_addr[] = "AABBCCDDEE";\r
+ unsigned char gtp_tei[] = "ZZYX";\r
+ unsigned char plmn[] = "321";\r
+ unsigned char eutran[] = "4567";\r
+\r
+ SECTION("Verify encoding/decoding of valid data with variable number of erabs"){\r
+\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 10;\r
+\r
+ encode_data.bit_rate_max_up = 1000;\r
+ encode_data.bit_rate_max_dn = 2000;\r
+\r
+ encode_data.encryption_algs = enc_alg;\r
+ encode_data.encryption_algs_size = strlen((char *)enc_alg);\r
+ encode_data.encryption_algs_unused = 0;\r
+\r
+ encode_data.integrity_protection_algs = integrity_alg;\r
+ encode_data.integrity_protection_algs_size = strlen((char *)integrity_alg);\r
+ encode_data.integrity_protection_algs_unused = encode_data.integrity_protection_algs_size/8;\r
+ REQUIRE(encode_data.integrity_protection_algs_size - encode_data.integrity_protection_algs_unused == 2);\r
+\r
+\r
+ encode_data.sgnb_security_key = sgnb_security_key;\r
+ encode_data.sgnb_security_key_size = strlen((char *)sgnb_security_key);\r
+ encode_data.sgnb_security_key_unused = 0;\r
+ REQUIRE(encode_data.sgnb_security_key_size - encode_data.sgnb_security_key_unused == 32);\r
+\r
+\r
+ encode_data.menb_sgnb_container = mesgnb_container;\r
+ encode_data.menb_sgnb_container_size = strlen((char *)mesgnb_container);\r
+\r
+ encode_data.plmn_identity = plmn;\r
+ encode_data.plmn_identity_size = strlen((char *)plmn);\r
+\r
+ encode_data.eutran_identifier = eutran;\r
+ encode_data.eutran_identifier_size = strlen((char *)eutran);\r
+ encode_data.eutran_identifier_unused = 4;\r
+\r
+ REQUIRE(encode_data.eutran_identifier_size*8 - encode_data.eutran_identifier_unused == 28);\r
+ encode_data.subscriber_profile_id = 34;\r
+\r
+ std::vector<erab_item> * ref_array = encode_data.get_list();\r
+ int max_erabs = 30;\r
+ srand(12093021);\r
+\r
+ // pdpc present\r
+ for(int num_erabs = 1; num_erabs < max_erabs; num_erabs++){\r
+\r
+ ref_array->clear();\r
+ \r
+ \r
+ for(int i = 0; i < num_erabs; i++){\r
+ \r
+ ref_array->emplace_back();\r
+ (*ref_array)[i].erab_id = rand() %15;\r
+ (*ref_array)[i].drb_id = i%32 + 1;\r
+ (*ref_array)[i].pdcp_at_sgnb = 1;\r
+ (*ref_array)[i].mcg_resources = 1;\r
+ (*ref_array)[i].scg_resources = 1;\r
+ (*ref_array)[i].sgnb_pdcp_present = 1;\r
+ \r
+ // element sgnb present\r
+ (*ref_array)[i].sgnb_item.qci = 8;\r
+ (*ref_array)[i].sgnb_item.priority_level = 8;\r
+ (*ref_array)[i].sgnb_item.pre_emption_capability = 0;\r
+ (*ref_array)[i].sgnb_item.pre_emption_vulnerability = 1;\r
+ (*ref_array)[i].sgnb_item.transport_layer_addr = transport_layer_addr;\r
+ (*ref_array)[i].sgnb_item.transport_layer_addr_size = strlen((char *)transport_layer_addr);\r
+ (*ref_array)[i].sgnb_item.gtp_tei = gtp_tei;\r
+ (*ref_array)[i].sgnb_item.gtp_tei_size = strlen((char *)gtp_tei);\r
+ (*ref_array)[i].sgnb_item.rlc_mode = 1;\r
+ \r
+ }\r
+ buf_size = BUFFER_SIZE;\r
+ res = encode_test.encode_sgnb_addition_request(buf, &buf_size, encode_data);\r
+ REQUIRE(res == true);\r
+\r
+ // std::string out_file = std::string("X2AP-PDU-SgNBAdditionRequest-NumErabs-") + std::to_string(num_erabs) + std::string(".per");\r
+ // FILE *pfile = fopen(out_file.c_str(), "w");\r
+ // fwrite(buf, sizeof(char), buf_size, pfile);\r
+ // fclose(pfile);\r
+\r
+ // How many times we test decoding the same data\r
+ int num_tests = 10;\r
+ for(int i = 0; i < num_tests; i++){\r
+ decode_data.clear();\r
+ \r
+ X2N_X2AP_PDU_t *x2ap_pdu_obj = 0;\r
+ asn_dec_rval_t rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_X2N_X2AP_PDU, (void**)&x2ap_pdu_obj, buf, buf_size);\r
+ REQUIRE(rval.code == RC_OK);\r
+ \r
+ res = decode_test.get_fields(x2ap_pdu_obj->choice.initiatingMessage, decode_data);\r
+ REQUIRE(res==true);\r
+ \r
+ REQUIRE(decode_data.sgnb_security_key_size - decode_data.sgnb_security_key_unused == 32);\r
+ REQUIRE(decode_data.eutran_identifier_size*8 - decode_data.eutran_identifier_unused == 28);\r
+ REQUIRE(encode_data.get_list()->size() == decode_data.get_list()->size());\r
+ REQUIRE(encode_data.erab_list[0].erab_id == decode_data.erab_list[0].erab_id);\r
+ REQUIRE(encode_data.erab_list[0].drb_id == decode_data.erab_list[0].drb_id);\r
+ REQUIRE(encode_data.erab_list[0].pdcp_at_sgnb == decode_data.erab_list[0].pdcp_at_sgnb);\r
+ \r
+ REQUIRE(encode_data.menb_ue_x2ap_id == decode_data.menb_ue_x2ap_id);\r
+ REQUIRE(encode_data.bit_rate_max_up == decode_data.bit_rate_max_up);\r
+ REQUIRE(encode_data.bit_rate_max_dn == decode_data.bit_rate_max_dn);\r
+ ASN_STRUCT_FREE(asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj);\r
+ }\r
+ \r
+ }\r
+\r
+\r
+ // pdcp not present\r
+ for(int num_erabs = 1; num_erabs < max_erabs; num_erabs++){\r
+\r
+ ref_array->clear();\r
+ \r
+ for(int i = 0; i < num_erabs; i++){\r
+ \r
+ ref_array->emplace_back();\r
+ (*ref_array)[i].erab_id = rand() %15;\r
+ (*ref_array)[i].drb_id = i%32 + 1;\r
+ (*ref_array)[i].pdcp_at_sgnb = 1;\r
+ (*ref_array)[i].mcg_resources = 1;\r
+ (*ref_array)[i].scg_resources = 1;\r
+ (*ref_array)[i].sgnb_pdcp_present = 2;\r
+ \r
+ // element sgnb present\r
+ (*ref_array)[i].sgnb_item.qci = 8;\r
+ (*ref_array)[i].sgnb_item.priority_level = 8;\r
+ (*ref_array)[i].sgnb_item.pre_emption_capability = 0;\r
+ (*ref_array)[i].sgnb_item.pre_emption_vulnerability = 1;\r
+ (*ref_array)[i].sgnb_item.transport_layer_addr = transport_layer_addr;\r
+ (*ref_array)[i].sgnb_item.transport_layer_addr_size = strlen((char *)transport_layer_addr);\r
+ (*ref_array)[i].sgnb_item.gtp_tei = gtp_tei;\r
+ (*ref_array)[i].sgnb_item.gtp_tei_size = strlen((char *)gtp_tei);\r
+ (*ref_array)[i].sgnb_item.rlc_mode = 1;\r
+ \r
+ }\r
+ \r
+ buf_size = BUFFER_SIZE;\r
+ res = encode_test.encode_sgnb_addition_request(buf, &buf_size, encode_data);\r
+ REQUIRE(res == true);\r
+ \r
+ // std::string out_file = std::string("X2AP-PDU-SgNBAdditionRequest-NoPDCP-NumErabs-") + std::to_string(num_erabs) + std::string(".per");\r
+ // FILE *pfile = fopen(out_file.c_str(), "w");\r
+ // fwrite(buf, sizeof(char), buf_size, pfile);\r
+ // fclose(pfile);\r
+ \r
+ \r
+ int num_tests = 10;\r
+ for(int i = 0; i < num_tests; i++){\r
+ decode_data.clear();\r
+ \r
+ X2N_X2AP_PDU_t *x2ap_pdu_obj = 0;\r
+ asn_dec_rval_t rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_X2N_X2AP_PDU, (void**)&x2ap_pdu_obj, buf, buf_size);\r
+ REQUIRE(rval.code == RC_OK);\r
+ \r
+ res = decode_test.get_fields(x2ap_pdu_obj->choice.initiatingMessage, decode_data);\r
+ REQUIRE(res==true);\r
+ \r
+ REQUIRE(decode_data.sgnb_security_key_size - decode_data.sgnb_security_key_unused == 32);\r
+ REQUIRE(decode_data.eutran_identifier_size*8 - decode_data.eutran_identifier_unused == 28);\r
+ REQUIRE(encode_data.get_list()->size() == decode_data.get_list()->size());\r
+ REQUIRE(encode_data.erab_list[0].erab_id == decode_data.erab_list[0].erab_id);\r
+ REQUIRE(encode_data.erab_list[0].drb_id == decode_data.erab_list[0].drb_id);\r
+ REQUIRE(encode_data.erab_list[0].pdcp_at_sgnb == decode_data.erab_list[0].pdcp_at_sgnb);\r
+ \r
+ REQUIRE(encode_data.menb_ue_x2ap_id == decode_data.menb_ue_x2ap_id);\r
+ REQUIRE(encode_data.bit_rate_max_up == decode_data.bit_rate_max_up);\r
+ REQUIRE(encode_data.bit_rate_max_dn == decode_data.bit_rate_max_dn);\r
+ ASN_STRUCT_FREE(asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj);\r
+ }\r
+ \r
+ }\r
+ \r
+ }\r
+ \r
+ SECTION("Encoding, invalid erab"){\r
+\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 120;\r
+\r
+ encode_data.bit_rate_max_up = 1000;\r
+ encode_data.bit_rate_max_dn = 2000;\r
+\r
+ encode_data.encryption_algs = enc_alg;\r
+ encode_data.encryption_algs_size = strlen((char *)enc_alg);\r
+ encode_data.encryption_algs_unused = 0;\r
+\r
+ encode_data.integrity_protection_algs = integrity_alg;\r
+ encode_data.integrity_protection_algs_size = strlen((char *)integrity_alg);\r
+ encode_data.integrity_protection_algs_unused = encode_data.integrity_protection_algs_size/8;\r
+ REQUIRE(encode_data.integrity_protection_algs_size - encode_data.integrity_protection_algs_unused == 2);\r
+\r
+\r
+ encode_data.sgnb_security_key = sgnb_security_key;\r
+ encode_data.sgnb_security_key_size = strlen((char *)sgnb_security_key);\r
+ encode_data.sgnb_security_key_unused = 0;\r
+ REQUIRE(encode_data.sgnb_security_key_size - encode_data.sgnb_security_key_unused == 32);\r
+\r
+\r
+ encode_data.menb_sgnb_container = mesgnb_container;\r
+ encode_data.menb_sgnb_container_size = strlen((char *)mesgnb_container);\r
+\r
+ encode_data.plmn_identity = plmn;\r
+ encode_data.plmn_identity_size = strlen((char *)plmn);\r
+\r
+ encode_data.eutran_identifier = eutran;\r
+ encode_data.eutran_identifier_size = strlen((char *)eutran);\r
+ encode_data.eutran_identifier_unused = 4;\r
+\r
+ REQUIRE(encode_data.eutran_identifier_size*8 - encode_data.eutran_identifier_unused == 28);\r
+ encode_data.subscriber_profile_id = 34;\r
+\r
+ std::vector<erab_item> * ref_array = encode_data.get_list();\r
+ ref_array->clear();\r
+ \r
+ ref_array->emplace_back();\r
+ (*ref_array)[0].erab_id = rand() %15;\r
+ (*ref_array)[0].drb_id = 150;\r
+ (*ref_array)[0].pdcp_at_sgnb = 1;\r
+ (*ref_array)[0].mcg_resources = 1;\r
+ (*ref_array)[0].scg_resources = 1;\r
+ (*ref_array)[0].sgnb_pdcp_present = 1;\r
+ \r
+ // element sgnb present\r
+ (*ref_array)[0].sgnb_item.qci = 8;\r
+ (*ref_array)[0].sgnb_item.priority_level = 8;\r
+ (*ref_array)[0].sgnb_item.pre_emption_capability = 0;\r
+ (*ref_array)[0].sgnb_item.pre_emption_vulnerability = 1;\r
+ (*ref_array)[0].sgnb_item.transport_layer_addr = transport_layer_addr;\r
+ (*ref_array)[0].sgnb_item.transport_layer_addr_size = strlen((char *)transport_layer_addr);\r
+ (*ref_array)[0].sgnb_item.gtp_tei = gtp_tei;\r
+ (*ref_array)[0].sgnb_item.gtp_tei_size = strlen((char *)gtp_tei);\r
+ (*ref_array)[0].sgnb_item.rlc_mode = 1;\r
+ \r
+ res = encode_test.encode_sgnb_addition_request(buf, &buf_size, encode_data);\r
+ REQUIRE(res == false);\r
+ }\r
+\r
+ SECTION("Invalid Encoding, low buffer"){\r
+\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 120;\r
+\r
+ encode_data.bit_rate_max_up = 1000;\r
+ encode_data.bit_rate_max_dn = 2000;\r
+\r
+ encode_data.encryption_algs = enc_alg;\r
+ encode_data.encryption_algs_size = strlen((char *)enc_alg);\r
+ encode_data.encryption_algs_unused = 0;\r
+\r
+ encode_data.integrity_protection_algs = integrity_alg;\r
+ encode_data.integrity_protection_algs_size = strlen((char *)integrity_alg);\r
+ encode_data.integrity_protection_algs_unused = encode_data.integrity_protection_algs_size/8;\r
+ REQUIRE(encode_data.integrity_protection_algs_size - encode_data.integrity_protection_algs_unused == 2);\r
+\r
+\r
+ encode_data.sgnb_security_key = sgnb_security_key;\r
+ encode_data.sgnb_security_key_size = strlen((char *)sgnb_security_key);\r
+ encode_data.sgnb_security_key_unused = 0;\r
+ REQUIRE(encode_data.sgnb_security_key_size - encode_data.sgnb_security_key_unused == 32);\r
+\r
+\r
+ encode_data.menb_sgnb_container = mesgnb_container;\r
+ encode_data.menb_sgnb_container_size = strlen((char *)mesgnb_container);\r
+\r
+ encode_data.plmn_identity = plmn;\r
+ encode_data.plmn_identity_size = strlen((char *)plmn);\r
+\r
+ encode_data.eutran_identifier = eutran;\r
+ encode_data.eutran_identifier_size = strlen((char *)eutran);\r
+ encode_data.eutran_identifier_unused = 4;\r
+\r
+ REQUIRE(encode_data.eutran_identifier_size*8 - encode_data.eutran_identifier_unused == 28);\r
+ encode_data.subscriber_profile_id = 34;\r
+\r
+ std::vector<erab_item> * ref_array = encode_data.get_list();\r
+ ref_array->clear();\r
+ \r
+ ref_array->emplace_back();\r
+ (*ref_array)[0].erab_id = rand() %15;\r
+ (*ref_array)[0].drb_id = 150;\r
+ (*ref_array)[0].pdcp_at_sgnb = 1;\r
+ (*ref_array)[0].mcg_resources = 1;\r
+ (*ref_array)[0].scg_resources = 1;\r
+ (*ref_array)[0].sgnb_pdcp_present = 1;\r
+ \r
+ // element sgnb present\r
+ (*ref_array)[0].sgnb_item.qci = 8;\r
+ (*ref_array)[0].sgnb_item.priority_level = 8;\r
+ (*ref_array)[0].sgnb_item.pre_emption_capability = 0;\r
+ (*ref_array)[0].sgnb_item.pre_emption_vulnerability = 1;\r
+ (*ref_array)[0].sgnb_item.transport_layer_addr = transport_layer_addr;\r
+ (*ref_array)[0].sgnb_item.transport_layer_addr_size = strlen((char *)transport_layer_addr);\r
+ (*ref_array)[0].sgnb_item.gtp_tei = gtp_tei;\r
+ (*ref_array)[0].sgnb_item.gtp_tei_size = strlen((char *)gtp_tei);\r
+ (*ref_array)[0].sgnb_item.rlc_mode = 1;\r
+\r
+ buf_size = 10;\r
+ res = encode_test.encode_sgnb_addition_request(buf, &buf_size, encode_data);\r
+ REQUIRE(res == false);\r
+ }\r
+ \r
+ SECTION("Encoding, missing erab"){\r
+\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 10;\r
+\r
+ encode_data.bit_rate_max_up = 1000;\r
+ encode_data.bit_rate_max_dn = 2000;\r
+\r
+ encode_data.encryption_algs = enc_alg;\r
+ encode_data.encryption_algs_size = strlen((char *)enc_alg);\r
+ encode_data.encryption_algs_unused = 0;\r
+\r
+ encode_data.integrity_protection_algs = integrity_alg;\r
+ encode_data.integrity_protection_algs_size = strlen((char *)integrity_alg);\r
+ encode_data.integrity_protection_algs_unused = encode_data.integrity_protection_algs_size/8;\r
+ REQUIRE(encode_data.integrity_protection_algs_size - encode_data.integrity_protection_algs_unused == 2);\r
+\r
+\r
+ encode_data.sgnb_security_key = sgnb_security_key;\r
+ encode_data.sgnb_security_key_size = strlen((char *)sgnb_security_key);\r
+ encode_data.sgnb_security_key_unused = 0;\r
+ REQUIRE(encode_data.sgnb_security_key_size - encode_data.sgnb_security_key_unused == 32);\r
+\r
+\r
+ encode_data.menb_sgnb_container = mesgnb_container;\r
+ encode_data.menb_sgnb_container_size = strlen((char *)mesgnb_container);\r
+\r
+ encode_data.plmn_identity = plmn;\r
+ encode_data.plmn_identity_size = strlen((char *)plmn);\r
+\r
+ encode_data.eutran_identifier = eutran;\r
+ encode_data.eutran_identifier_size = strlen((char *)eutran);\r
+ encode_data.eutran_identifier_unused = 4;\r
+\r
+ encode_data.subscriber_profile_id = 34;\r
+ res = encode_test.encode_sgnb_addition_request(buf, &buf_size, encode_data);\r
+ REQUIRE(res == false);\r
+ }\r
+\r
+ \r
+ \r
+ SECTION("SgnB Addition Response ACK Encoding/decoding with valid data"){\r
+\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 10;\r
+\r
+ encode_data.bit_rate_max_up = 1000;\r
+ encode_data.bit_rate_max_dn = 2000;\r
+\r
+ encode_data.encryption_algs = enc_alg;\r
+ encode_data.encryption_algs_size = strlen((char *)enc_alg);\r
+ encode_data.encryption_algs_unused = 0;\r
+\r
+ encode_data.integrity_protection_algs = integrity_alg;\r
+ encode_data.integrity_protection_algs_size = strlen((char *)integrity_alg);\r
+ encode_data.integrity_protection_algs_unused = encode_data.integrity_protection_algs_size/8;\r
+ REQUIRE(encode_data.integrity_protection_algs_size - encode_data.integrity_protection_algs_unused == 2);\r
+\r
+\r
+ encode_data.sgnb_security_key = sgnb_security_key;\r
+ encode_data.sgnb_security_key_size = strlen((char *)sgnb_security_key);\r
+ encode_data.sgnb_security_key_unused = 0;\r
+ REQUIRE(encode_data.sgnb_security_key_size - encode_data.sgnb_security_key_unused == 32);\r
+\r
+\r
+ encode_data.menb_sgnb_container = mesgnb_container;\r
+ encode_data.menb_sgnb_container_size = strlen((char *)mesgnb_container);\r
+\r
+ encode_data.plmn_identity = plmn;\r
+ encode_data.plmn_identity_size = strlen((char *)plmn);\r
+\r
+ encode_data.eutran_identifier = eutran;\r
+ encode_data.eutran_identifier_size = strlen((char *)eutran);\r
+ encode_data.eutran_identifier_unused = 4;\r
+\r
+ REQUIRE(encode_data.eutran_identifier_size*8 - encode_data.eutran_identifier_unused == 28);\r
+ encode_data.subscriber_profile_id = 34;\r
+\r
+ std::vector<erab_item> * ref_array = encode_data.get_list();\r
+ ref_array->clear();\r
+ \r
+ int num_erabs = 25;\r
+ srand(12093021);\r
+\r
+ for(int i = 0; i < num_erabs; i++){\r
+ \r
+ ref_array->emplace_back();\r
+ (*ref_array)[i].erab_id = rand() %15;\r
+ (*ref_array)[i].drb_id = i%32 + 1;\r
+ (*ref_array)[i].pdcp_at_sgnb = 1;\r
+ (*ref_array)[i].mcg_resources = 1;\r
+ (*ref_array)[i].scg_resources = 1;\r
+ (*ref_array)[i].sgnb_pdcp_present = 1;\r
+\r
+ // element sgnb present\r
+ (*ref_array)[i].sgnb_item.qci = 8;\r
+ (*ref_array)[i].sgnb_item.priority_level = 8;\r
+ (*ref_array)[i].sgnb_item.pre_emption_capability = 0;\r
+ (*ref_array)[i].sgnb_item.pre_emption_vulnerability = 1;\r
+ (*ref_array)[i].sgnb_item.transport_layer_addr = transport_layer_addr;\r
+ (*ref_array)[i].sgnb_item.transport_layer_addr_size = strlen((char *)transport_layer_addr);\r
+ (*ref_array)[i].sgnb_item.gtp_tei = gtp_tei;\r
+ (*ref_array)[i].sgnb_item.gtp_tei_size = strlen((char *)gtp_tei);\r
+ (*ref_array)[i].sgnb_item.rlc_mode = 1;\r
+ \r
+ }\r
+\r
+ res = resp_out.encode_sgnb_addition_response(buf, &buf_size, encode_data, true);\r
+ REQUIRE(res == true);\r
+\r
+\r
+ // Haven't written get fields for sgnb response yet\r
+ // int num_tests = 10;\r
+ // for(int i = 0; i < num_tests; i++){\r
+ // decode_data.clear();\r
+ \r
+ // X2_X2AP_PDU_t *x2ap_pdu_obj = 0;\r
+ // asn_dec_rval_t rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_X2N_X2AP_PDU, (void**)&x2ap_pdu_obj, buf, buf_size);\r
+ // REQUIRE(rval.code == RC_OK);\r
+ \r
+ // res = resp_out.get_fields(x2ap_pdu_obj->choice.successfulOutcome, decode_data);\r
+ // REQUIRE(res==true);\r
+ \r
+ // REQUIRE(decode_data.sgnb_security_key_size - decode_data.sgnb_security_key_unused == 32);\r
+ // REQUIRE(decode_data.eutran_identifier_size*8 - decode_data.eutran_identifier_unused == 28);\r
+ // REQUIRE(encode_data.get_list()->size() == decode_data.get_list()->size());\r
+ // REQUIRE(encode_data.erab_list[0].erab_id == decode_data.erab_list[0].erab_id);\r
+ // REQUIRE(encode_data.erab_list[0].drb_id == decode_data.erab_list[0].drb_id);\r
+ // REQUIRE(encode_data.erab_list[0].pdcp_at_sgnb == decode_data.erab_list[0].pdcp_at_sgnb);\r
+ \r
+ // REQUIRE(encode_data.menb_ue_x2ap_id == decode_data.menb_ue_x2ap_id);\r
+ // ASN_STRUCT_FREE(asn_DEF_X2N_X2AP_PDU, x2ap_pdu_obj);\r
+ // }\r
+ \r
+ }\r
+\r
+ SECTION("Encoding response, missing erab"){\r
+\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 10;\r
+\r
+ encode_data.bit_rate_max_up = 1000;\r
+ encode_data.bit_rate_max_dn = 2000;\r
+\r
+ encode_data.encryption_algs = enc_alg;\r
+ encode_data.encryption_algs_size = strlen((char *)enc_alg);\r
+ encode_data.encryption_algs_unused = 0;\r
+\r
+ encode_data.integrity_protection_algs = integrity_alg;\r
+ encode_data.integrity_protection_algs_size = strlen((char *)integrity_alg);\r
+ encode_data.integrity_protection_algs_unused = encode_data.integrity_protection_algs_size/8;\r
+ REQUIRE(encode_data.integrity_protection_algs_size - encode_data.integrity_protection_algs_unused == 2);\r
+\r
+\r
+ encode_data.sgnb_security_key = sgnb_security_key;\r
+ encode_data.sgnb_security_key_size = strlen((char *)sgnb_security_key);\r
+ encode_data.sgnb_security_key_unused = 0;\r
+ REQUIRE(encode_data.sgnb_security_key_size - encode_data.sgnb_security_key_unused == 32);\r
+\r
+\r
+ encode_data.menb_sgnb_container = mesgnb_container;\r
+ encode_data.menb_sgnb_container_size = strlen((char *)mesgnb_container);\r
+\r
+ encode_data.plmn_identity = plmn;\r
+ encode_data.plmn_identity_size = strlen((char *)plmn);\r
+\r
+ encode_data.eutran_identifier = eutran;\r
+ encode_data.eutran_identifier_size = strlen((char *)eutran);\r
+ encode_data.eutran_identifier_unused = 4;\r
+\r
+ encode_data.subscriber_profile_id = 34;\r
+ res = resp_out.encode_sgnb_addition_response(buf, &buf_size, encode_data, true);\r
+ REQUIRE(res == false);\r
+ }\r
+\r
+\r
+ // // Checking Sgnb ACK Encoding\r
+ // REQUIRE(response == true);\r
+ // res = resp_out.encode_sgnb_addition_response(data_buf, &data_size,decode_data,response);\r
+ // REQUIRE(res == true);\r
+ \r
+ // // FILE *pfile;\r
+ // // pfile = fopen("sgnb_addition_ack.per", "w");\r
+ // // fwrite(data_buf, sizeof(char), data_size, pfile);\r
+ // // fclose(pfile);\r
+ // }\r
+\r
+ SECTION("Response Reject Encoding, valid"){\r
+ //checking Sgnb Reject Encoding\r
+ encode_data.menb_ue_x2ap_id = 12;\r
+ encode_data.sgnb_ue_x2ap_id = 10;\r
+ encode_data.cause = 1;\r
+ encode_data.cause_desc = 1; \r
+ res = resp_out.encode_sgnb_addition_response(data_buf, &data_size, encode_data, false);\r
+ std::cout <<"Reason = " << resp_out.get_error() << std::endl;\r
+ REQUIRE(res==true);\r
+ }\r
+ \r
+ SECTION("Response Reject Encoding, invalid data"){\r
+ //checking Sgnb Reject Encoding\r
+ encode_data.menb_ue_x2ap_id = 1200;\r
+ encode_data.sgnb_ue_x2ap_id = 10;\r
+ encode_data.cause = 1;\r
+ encode_data.cause_desc = 1; \r
+ res = resp_out.encode_sgnb_addition_response(data_buf, &data_size,decode_data, false);\r
+ REQUIRE(res==false);\r
+ }\r
+\r
+ \r
+\r
+\r
+}\r
+\r
+\r
+\r