1. Transitioned to using latest asn1c compiler
[ric-app/admin.git] / test / unit_test_protector_plugin.cc
diff --git a/test/unit_test_protector_plugin.cc b/test/unit_test_protector_plugin.cc
new file mode 100644 (file)
index 0000000..64daa3a
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+==================================================================================
+
+        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.
+==================================================================================
+*/
+
+/* Author : Ashwin Sridharan
+   Date   : Sept 2019
+*/
+
+#define CATCH_CONFIG_MAIN
+#include <catch2/catch.hpp>
+
+#include <NetworkProtector.h>
+
+
+TEST_CASE("Protector Plugin", "Test Input types"){
+
+
+  mdclog_attr_t *attr;
+  mdclog_attr_init(&attr);
+  mdclog_attr_set_ident(attr, "UNIT TEST MESSAGE PROCESSOR ");
+  mdclog_init(attr);
+  mdclog_level_set(MDCLOG_INFO);
+  mdclog_attr_destroy(attr);
+  FILE *pfile;
+  unsigned char scratch_buf[512];
+  size_t scratch_buf_size = 512;
+  
+  // valid x2 sgnb addition request  
+  unsigned char x2ap_buf[256];
+  size_t x2ap_buf_size ;
+  pfile = fopen("test-data/X2AP-PDU-SgNBAdditionRequest.per", "r");
+  REQUIRE(pfile != NULL);
+  x2ap_buf_size = fread((char *)x2ap_buf, sizeof(char), 256, pfile);
+  fclose(pfile);
+
+
+  // incorrect x2ap pdu 
+  srand(10902390);
+  unsigned char incorrect_x2ap_buf[8192];
+  size_t incorrect_x2ap_buf_size = 8192;
+  for(int i = 0; i < 8192; i++){
+    incorrect_x2ap_buf[i] = rand()%256;
+  }
+
+  // valid x2 but not an initiating message
+  unsigned char x2ap_sgnb_ack[512];
+  size_t x2ap_sgnb_ack_size;
+  pfile = fopen("test-data/X2AP-PDU-SgNBAdditionAck.per", "r");
+  REQUIRE(pfile != NULL);
+  x2ap_sgnb_ack_size = fread((char *)x2ap_sgnb_ack, sizeof(char), 512, pfile);
+  fclose(pfile);
+
+  //valid x2 initiating message, but not sgnb addition request
+  unsigned char x2ap_resource_req_buf[512];
+  size_t x2ap_resource_req_buf_size;
+  pfile = fopen("test-data/X2AP-PDU-ResourceStatusRequest.per", "r");
+  REQUIRE(pfile != NULL);
+  x2ap_resource_req_buf_size = fread((char *)x2ap_resource_req_buf, sizeof(char), 512, pfile);
+  fclose(pfile);
+
+
+  SECTION("Valid X2 SgnB Addition Request"){
+    protector n_plugin(1, 20, 5, 0, false);
+    bool res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+    REQUIRE(res == true);
+    REQUIRE(n_plugin.get_requests() == 1);
+
+    // todo: need to validate response ...
+    // decode x2ap response
+    // verify it is a successful message and compare against input x2ap ..
+
+  }
+
+  SECTION("Invalid X2 message"){
+    protector n_plugin(1, 20, 5, 0, false);
+    bool res = n_plugin(incorrect_x2ap_buf, incorrect_x2ap_buf_size, scratch_buf, &scratch_buf_size);
+    REQUIRE(res == false);
+    REQUIRE(n_plugin.get_requests() == 0);
+  }
+
+  SECTION("Valid X2 but not Initating message"){
+
+    protector n_plugin(1, 20, 5, 0, false);
+    bool res = n_plugin(x2ap_sgnb_ack, x2ap_sgnb_ack_size, scratch_buf, &scratch_buf_size);
+    REQUIRE(res == false);
+    REQUIRE(n_plugin.get_requests() == 0);
+  }
+  
+
+  SECTION("Valid X2 Initiating but not SgNB Addition Request"){
+    
+    protector n_plugin(1, 20, 5, 0, false);
+    bool res = n_plugin(x2ap_resource_req_buf, x2ap_resource_req_buf_size, scratch_buf, &scratch_buf_size);
+    REQUIRE(res == false);
+    REQUIRE(n_plugin.get_requests() == 0);
+    
+  }
+
+  SECTION("Cycle through various messages"){
+    int num_cycles = 1000;
+    int num_valid = 0;
+    protector n_plugin(1, 20, 5, 0, false);
+    bool res;
+    
+    for(int i = 0; i < num_cycles;i++){
+      scratch_buf_size = 512;
+      res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == true);
+      num_valid ++;
+
+      res = n_plugin(x2ap_sgnb_ack, x2ap_sgnb_ack_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == false);
+      
+      res = n_plugin(x2ap_resource_req_buf, x2ap_resource_req_buf_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == false);
+  
+      res = n_plugin(incorrect_x2ap_buf, incorrect_x2ap_buf_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == false);
+      
+    }
+    
+    REQUIRE(num_valid == n_plugin.get_requests());
+    REQUIRE(n_plugin.get_rejects() == 0);
+
+  }
+
+
+  
+  SECTION("No enforce"){
+    bool res;
+    int num_packets = 1000;
+    protector n_plugin(0, 20, 5, 100, false);
+    for(int i = 0; i < num_packets; i++){
+      res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == true);
+    }
+
+    REQUIRE(n_plugin.get_requests() == num_packets);
+    REQUIRE(n_plugin.get_rejects() == 0);
+    
+  }
+
+  SECTION("No blocking"){
+    bool res;
+    int num_packets = 1000;
+    protector n_plugin(1, 20, 5, 0, false);
+    for(int i = 0; i < num_packets; i++){
+      res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == true);
+    }
+
+    REQUIRE(n_plugin.get_requests() == num_packets);
+    REQUIRE(n_plugin.get_rejects() == 0);
+    
+  }
+    
+  SECTION("All blocking"){
+    bool res;
+    int num_packets = 1000;
+    protector n_plugin(1, 20, 0, 100, false);
+    for(int i = 0; i < num_packets; i++){
+      scratch_buf_size = 512;
+      res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+      REQUIRE(res == true);
+    }
+
+    REQUIRE(n_plugin.get_requests() == num_packets);
+    REQUIRE(n_plugin.get_rejects() == num_packets);
+
+  }
+
+  SECTION("Configuration"){
+    bool res;
+    protector n_plugin(1, 20, 0, 100, false);
+    res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+    REQUIRE(res == true);
+    REQUIRE(n_plugin.get_requests() == 1);
+    REQUIRE(n_plugin.get_rejects() == 1);
+    
+    n_plugin.clear();
+    REQUIRE(n_plugin.get_requests() == 0);
+    REQUIRE(n_plugin.get_rejects() == 0);
+
+    n_plugin.configure(0, 20, 0, 100);
+    scratch_buf_size = 512;
+    res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
+    REQUIRE(res == true);
+    REQUIRE(n_plugin.get_requests() == 1);
+    REQUIRE(n_plugin.get_rejects() == 0);
+
+    res = n_plugin.configure(0, -1, 0, 100);
+    REQUIRE(res == false);
+
+  }
+}