1. Transitioned to using latest asn1c compiler
[ric-app/admin.git] / test / unit_test_protector_plugin.cc
1 /*
2 ==================================================================================
3
4         Copyright (c) 2018-2019 AT&T Intellectual Property.
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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 ==================================================================================
18 */
19
20 /* Author : Ashwin Sridharan
21    Date   : Sept 2019
22 */
23
24 #define CATCH_CONFIG_MAIN
25 #include <catch2/catch.hpp>
26
27 #include <NetworkProtector.h>
28
29
30 TEST_CASE("Protector Plugin", "Test Input types"){
31
32
33   mdclog_attr_t *attr;
34   mdclog_attr_init(&attr);
35   mdclog_attr_set_ident(attr, "UNIT TEST MESSAGE PROCESSOR ");
36   mdclog_init(attr);
37   mdclog_level_set(MDCLOG_INFO);
38   mdclog_attr_destroy(attr);
39   FILE *pfile;
40  
41   unsigned char scratch_buf[512];
42   size_t scratch_buf_size = 512;
43   
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);
50   fclose(pfile);
51
52
53   // incorrect x2ap pdu 
54   srand(10902390);
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;
59   }
60
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);
67   fclose(pfile);
68
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);
75   fclose(pfile);
76
77
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);
81     REQUIRE(res == true);
82     REQUIRE(n_plugin.get_requests() == 1);
83
84     // todo: need to validate response ...
85     // decode x2ap response
86     // verify it is a successful message and compare against input x2ap ..
87
88   }
89
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);
95   }
96
97   SECTION("Valid X2 but not Initating message"){
98
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);
103   }
104   
105
106   SECTION("Valid X2 Initiating but not SgNB Addition Request"){
107     
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);
112     
113   }
114
115   SECTION("Cycle through various messages"){
116     int num_cycles = 1000;
117     int num_valid = 0;
118     protector n_plugin(1, 20, 5, 0, false);
119     bool res;
120     
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);
125       num_valid ++;
126
127       res = n_plugin(x2ap_sgnb_ack, x2ap_sgnb_ack_size, scratch_buf, &scratch_buf_size);
128       REQUIRE(res == false);
129       
130       res = n_plugin(x2ap_resource_req_buf, x2ap_resource_req_buf_size, scratch_buf, &scratch_buf_size);
131       REQUIRE(res == false);
132   
133       res = n_plugin(incorrect_x2ap_buf, incorrect_x2ap_buf_size, scratch_buf, &scratch_buf_size);
134       REQUIRE(res == false);
135       
136     }
137     
138     REQUIRE(num_valid == n_plugin.get_requests());
139     REQUIRE(n_plugin.get_rejects() == 0);
140
141   }
142
143
144   
145   SECTION("No enforce"){
146     bool res;
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);
152     }
153
154     REQUIRE(n_plugin.get_requests() == num_packets);
155     REQUIRE(n_plugin.get_rejects() == 0);
156     
157   }
158
159   SECTION("No blocking"){
160     bool res;
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);
166     }
167
168     REQUIRE(n_plugin.get_requests() == num_packets);
169     REQUIRE(n_plugin.get_rejects() == 0);
170     
171   }
172     
173   SECTION("All blocking"){
174     bool res;
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);
181     }
182
183     REQUIRE(n_plugin.get_requests() == num_packets);
184     REQUIRE(n_plugin.get_rejects() == num_packets);
185
186   }
187
188   SECTION("Configuration"){
189     bool res;
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);
195     
196     n_plugin.clear();
197     REQUIRE(n_plugin.get_requests() == 0);
198     REQUIRE(n_plugin.get_rejects() == 0);
199
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);
206
207     res = n_plugin.configure(0, -1, 0, 100);
208     REQUIRE(res == false);
209
210   }
211 }