2 ==================================================================================
4 Copyright (c) 2018-2019 AT&T Intellectual Property.
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
20 /* Author : Ashwin Sridharan
24 #define CATCH_CONFIG_MAIN
25 #include <catch2/catch.hpp>
27 #include <NetworkProtector.h>
30 TEST_CASE("Protector Plugin", "Test Input types"){
34 mdclog_attr_init(&attr);
35 mdclog_attr_set_ident(attr, "UNIT TEST MESSAGE PROCESSOR ");
37 mdclog_level_set(MDCLOG_INFO);
38 mdclog_attr_destroy(attr);
41 unsigned char scratch_buf[512];
42 size_t scratch_buf_size = 512;
44 // valid x2 sgnb addition request
45 unsigned char x2ap_buf[256];
46 size_t x2ap_buf_size ;
47 pfile = fopen("test-data/X2AP-PDU-SgNBAdditionRequest.per", "r");
48 REQUIRE(pfile != NULL);
49 x2ap_buf_size = fread((char *)x2ap_buf, sizeof(char), 256, pfile);
55 unsigned char incorrect_x2ap_buf[8192];
56 size_t incorrect_x2ap_buf_size = 8192;
57 for(int i = 0; i < 8192; i++){
58 incorrect_x2ap_buf[i] = rand()%256;
61 // valid x2 but not an initiating message
62 unsigned char x2ap_sgnb_ack[512];
63 size_t x2ap_sgnb_ack_size;
64 pfile = fopen("test-data/X2AP-PDU-SgNBAdditionAck.per", "r");
65 REQUIRE(pfile != NULL);
66 x2ap_sgnb_ack_size = fread((char *)x2ap_sgnb_ack, sizeof(char), 512, pfile);
69 //valid x2 initiating message, but not sgnb addition request
70 unsigned char x2ap_resource_req_buf[512];
71 size_t x2ap_resource_req_buf_size;
72 pfile = fopen("test-data/X2AP-PDU-ResourceStatusRequest.per", "r");
73 REQUIRE(pfile != NULL);
74 x2ap_resource_req_buf_size = fread((char *)x2ap_resource_req_buf, sizeof(char), 512, pfile);
78 SECTION("Valid X2 SgnB Addition Request"){
79 protector n_plugin(1, 20, 5, 0, false);
80 bool res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
82 REQUIRE(n_plugin.get_requests() == 1);
84 // todo: need to validate response ...
85 // decode x2ap response
86 // verify it is a successful message and compare against input x2ap ..
90 SECTION("Invalid X2 message"){
91 protector n_plugin(1, 20, 5, 0, false);
92 bool res = n_plugin(incorrect_x2ap_buf, incorrect_x2ap_buf_size, scratch_buf, &scratch_buf_size);
93 REQUIRE(res == false);
94 REQUIRE(n_plugin.get_requests() == 0);
97 SECTION("Valid X2 but not Initating message"){
99 protector n_plugin(1, 20, 5, 0, false);
100 bool res = n_plugin(x2ap_sgnb_ack, x2ap_sgnb_ack_size, scratch_buf, &scratch_buf_size);
101 REQUIRE(res == false);
102 REQUIRE(n_plugin.get_requests() == 0);
106 SECTION("Valid X2 Initiating but not SgNB Addition Request"){
108 protector n_plugin(1, 20, 5, 0, false);
109 bool res = n_plugin(x2ap_resource_req_buf, x2ap_resource_req_buf_size, scratch_buf, &scratch_buf_size);
110 REQUIRE(res == false);
111 REQUIRE(n_plugin.get_requests() == 0);
115 SECTION("Cycle through various messages"){
116 int num_cycles = 1000;
118 protector n_plugin(1, 20, 5, 0, false);
121 for(int i = 0; i < num_cycles;i++){
122 scratch_buf_size = 512;
123 res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
124 REQUIRE(res == true);
127 res = n_plugin(x2ap_sgnb_ack, x2ap_sgnb_ack_size, scratch_buf, &scratch_buf_size);
128 REQUIRE(res == false);
130 res = n_plugin(x2ap_resource_req_buf, x2ap_resource_req_buf_size, scratch_buf, &scratch_buf_size);
131 REQUIRE(res == false);
133 res = n_plugin(incorrect_x2ap_buf, incorrect_x2ap_buf_size, scratch_buf, &scratch_buf_size);
134 REQUIRE(res == false);
138 REQUIRE(num_valid == n_plugin.get_requests());
139 REQUIRE(n_plugin.get_rejects() == 0);
145 SECTION("No enforce"){
147 int num_packets = 1000;
148 protector n_plugin(0, 20, 5, 100, false);
149 for(int i = 0; i < num_packets; i++){
150 res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
151 REQUIRE(res == true);
154 REQUIRE(n_plugin.get_requests() == num_packets);
155 REQUIRE(n_plugin.get_rejects() == 0);
159 SECTION("No blocking"){
161 int num_packets = 1000;
162 protector n_plugin(1, 20, 5, 0, false);
163 for(int i = 0; i < num_packets; i++){
164 res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
165 REQUIRE(res == true);
168 REQUIRE(n_plugin.get_requests() == num_packets);
169 REQUIRE(n_plugin.get_rejects() == 0);
173 SECTION("All blocking"){
175 int num_packets = 1000;
176 protector n_plugin(1, 20, 0, 100, false);
177 for(int i = 0; i < num_packets; i++){
178 scratch_buf_size = 512;
179 res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
180 REQUIRE(res == true);
183 REQUIRE(n_plugin.get_requests() == num_packets);
184 REQUIRE(n_plugin.get_rejects() == num_packets);
188 SECTION("Configuration"){
190 protector n_plugin(1, 20, 0, 100, false);
191 res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
192 REQUIRE(res == true);
193 REQUIRE(n_plugin.get_requests() == 1);
194 REQUIRE(n_plugin.get_rejects() == 1);
197 REQUIRE(n_plugin.get_requests() == 0);
198 REQUIRE(n_plugin.get_rejects() == 0);
200 n_plugin.configure(0, 20, 0, 100);
201 scratch_buf_size = 512;
202 res = n_plugin(x2ap_buf, x2ap_buf_size, scratch_buf, &scratch_buf_size);
203 REQUIRE(res == true);
204 REQUIRE(n_plugin.get_requests() == 1);
205 REQUIRE(n_plugin.get_rejects() == 0);
207 res = n_plugin.configure(0, -1, 0, 100);
208 REQUIRE(res == false);