1. Transitioned to using latest asn1c compiler
[ric-app/admin.git] / test / unit_test_sgnb_addition_request.cc
diff --git a/test/unit_test_sgnb_addition_request.cc b/test/unit_test_sgnb_addition_request.cc
new file mode 100644 (file)
index 0000000..c061af2
--- /dev/null
@@ -0,0 +1,582 @@
+/*\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