47d8f8d157dab1384dffa8259c3325f59bd5d4e2
[aaf/authz.git] / cadi / core / src / test / java / org / onap / aaf / cadi / taf / dos / test / JU_DenialOfServiceTaf.java
1 /*******************************************************************************
2  * ============LICENSE_START====================================================
3  * * org.onap.aaf
4  * * ===========================================================================
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * * ===========================================================================
7  * * Licensed under the Apache License, Version 2.0 (the "License");
8  * * you may not use this file except in compliance with the License.
9  * * You may obtain a copy of the License at
10  * *
11  *  *      http://www.apache.org/licenses/LICENSE-2.0
12  * *
13  *  * Unless required by applicable law or agreed to in writing, software
14  * * distributed under the License is distributed on an "AS IS" BASIS,
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * * See the License for the specific language governing permissions and
17  * * limitations under the License.
18  * * ============LICENSE_END====================================================
19  * *
20  * *
21  ******************************************************************************/
22
23 package org.onap.aaf.cadi.taf.dos.test;
24
25 import static org.junit.Assert.*;
26 import static org.hamcrest.CoreMatchers.*;
27 import static org.mockito.Mockito.*;
28 import org.junit.*;
29 import org.mockito.*;
30
31 import java.io.BufferedReader;
32 import java.io.File;
33 import java.io.FileReader;
34 import java.io.IOException;
35 import java.lang.reflect.Field;
36 import java.util.List;
37
38 import javax.servlet.http.HttpServletRequest;
39 import javax.servlet.http.HttpServletResponse;
40
41 import org.onap.aaf.cadi.Access;
42 import org.onap.aaf.cadi.CachedPrincipal.Resp;
43 import org.onap.aaf.cadi.CadiException;
44 import org.onap.aaf.cadi.config.Config;
45 import org.onap.aaf.cadi.taf.TafResp;
46 import org.onap.aaf.cadi.Taf.LifeForm;
47 import org.onap.aaf.cadi.taf.dos.DenialOfServiceTaf;
48 import org.onap.aaf.cadi.taf.dos.DenialOfServiceTaf.Counter;
49
50 public class JU_DenialOfServiceTaf {
51
52     @Mock
53     HttpServletResponse respMock;
54
55     @Mock
56     HttpServletRequest reqMock1;
57
58     @Mock
59     HttpServletRequest reqMock2;
60
61     @Mock
62     HttpServletRequest reqMock3;
63
64     @Mock
65     Access accessMock;
66
67     private File dosIPFile;
68     private File dosIDFile;
69     private File dosDir;
70     private final String dosDirName = "test";
71     
72     private final String id1 = "id1";
73     private final String id2 = "id2";
74
75     private final String ip1 = "111.111.111.111";
76     private final String ip2 = "222.222.222.222";
77
78     @Before
79     public void setup() throws IOException {
80         MockitoAnnotations.initMocks(this);
81
82         dosDir = new File(dosDirName);
83         dosDir.mkdirs();
84         dosIPFile = new File(dosDirName, "/dosIP");
85         dosIDFile = new File(dosDirName, "/dosID");
86         dosIPFile.delete();
87         dosIDFile.delete();
88
89         when(accessMock.getProperty(Config.AAF_DATA_DIR, null)).thenReturn(dosDirName);
90         when(reqMock1.getRemoteAddr()).thenReturn(ip1);
91         when(reqMock2.getRemoteAddr()).thenReturn(ip2);
92
93         setPrivateField(DenialOfServiceTaf.class, "deniedIP", null);
94         setPrivateField(DenialOfServiceTaf.class, "deniedID", null);
95         setPrivateField(DenialOfServiceTaf.class, "dosIP", null);
96         setPrivateField(DenialOfServiceTaf.class, "dosID", null);
97     }
98
99     @After
100     public void tearDown() {
101         dosIPFile = new File(dosDirName, "/dosIP");
102         dosIDFile = new File(dosDirName, "/dosID");
103         dosIPFile.delete();
104         dosIDFile.delete();
105     }
106
107     @Test
108     public void constructorTest() throws CadiException {
109         @SuppressWarnings("unused")
110         DenialOfServiceTaf dost;
111
112         // coverage...
113         when(accessMock.getProperty(Config.AAF_DATA_DIR, null)).thenReturn(null);
114         dost = new DenialOfServiceTaf(accessMock);
115
116         when(accessMock.getProperty(Config.AAF_DATA_DIR, null)).thenReturn(dosDirName);
117         dost = new DenialOfServiceTaf(accessMock);
118
119         // more coverage...
120         dost = new DenialOfServiceTaf(accessMock);
121
122         // more coverage...
123         setPrivateField(DenialOfServiceTaf.class, "dosID", null);
124         dost = new DenialOfServiceTaf(accessMock);
125     }
126
127     @Test
128     public void validateTest() throws CadiException {
129         DenialOfServiceTaf dost;
130         TafResp tafResp;
131
132         dost = new DenialOfServiceTaf(accessMock);
133         tafResp = dost.validate(LifeForm.SBLF, reqMock1, respMock);
134
135         assertThat(tafResp.desc(), is("Not processing this transaction: This Transaction is not denied"));
136         assertThat(tafResp.taf(), is("DenialOfServiceTaf"));
137
138         assertThat(DenialOfServiceTaf.denyIP(ip1), is(true));
139
140         tafResp = dost.validate(LifeForm.SBLF, reqMock1, respMock);
141         assertThat(tafResp.desc(), is(ip1 + " is on the IP Denial list"));
142
143         tafResp = dost.validate(LifeForm.SBLF, reqMock2, respMock);
144         assertThat(tafResp.desc(), is("Not processing this transaction: This Transaction is not denied"));
145         assertThat(tafResp.taf(), is("DenialOfServiceTaf"));
146     }
147
148     @Test
149     public void revalidateTest() throws CadiException {
150         DenialOfServiceTaf dost = new DenialOfServiceTaf(accessMock);
151         Resp resp = dost.revalidate(null, null);
152         assertThat(resp, is(Resp.NOT_MINE));
153     }
154
155     @Test
156     public void denyIPTest() throws CadiException {
157         assertThat(DenialOfServiceTaf.isDeniedIP(ip1), is(nullValue()));
158         assertThat(DenialOfServiceTaf.denyIP(ip1), is(true));  // true because it's been added
159         assertThat(DenialOfServiceTaf.denyIP(ip2), is(true));  // true because it's been added
160         assertThat(DenialOfServiceTaf.denyIP(ip1), is(false)); // false because it's already been added
161         assertThat(DenialOfServiceTaf.denyIP(ip2), is(false)); // false because it's already been added
162
163         Counter counter;
164         counter = DenialOfServiceTaf.isDeniedIP(ip1);
165         assertThat(counter.getName(), is(ip1));
166         assertThat(counter.getCount(), is(0));
167         assertThat(counter.getLast(), is(0L));
168         assertThat(counter.toString(), is(ip1 + " is on the denied list, but has not attempted Access" ));
169
170         DenialOfServiceTaf dost = new DenialOfServiceTaf(accessMock);
171         dost.validate(LifeForm.SBLF, reqMock1, respMock);
172         long approxTime = System.currentTimeMillis();
173
174         counter = DenialOfServiceTaf.isDeniedIP(ip1);
175         assertThat(counter.getName(), is(ip1));
176         assertThat(counter.getCount(), is(1));
177         assertThat((Math.abs(approxTime - counter.getLast()) < 10), is(true));
178         assertThat(counter.toString().contains(ip1), is(true));
179         assertThat(counter.toString().contains(" has been denied 1 times since "), is(true));
180         assertThat(counter.toString().contains(".  Last denial was "), is(true));
181
182         // coverage...
183         dost.validate(LifeForm.SBLF, reqMock1, respMock);
184
185         assertThat(DenialOfServiceTaf.removeDenyIP(ip1), is(true));
186         assertThat(DenialOfServiceTaf.removeDenyIP(ip1), is(false));
187         assertThat(DenialOfServiceTaf.removeDenyIP(ip2), is(true));
188         assertThat(DenialOfServiceTaf.removeDenyIP(ip2), is(false));
189     }
190
191     @Test
192     public void denyIDTest() throws CadiException {
193         assertThat(DenialOfServiceTaf.isDeniedID(id1), is(nullValue()));
194         assertThat(DenialOfServiceTaf.denyID(id1), is(true));  // true because it's been added
195         assertThat(DenialOfServiceTaf.denyID(id2), is(true));  // true because it's been added
196         assertThat(DenialOfServiceTaf.denyID(id1), is(false)); // false because it's already been added
197         assertThat(DenialOfServiceTaf.denyID(id2), is(false)); // false because it's already been added
198
199         Counter counter;
200         counter = DenialOfServiceTaf.isDeniedID(id1);
201         assertThat(counter.getName(), is(id1));
202         assertThat(counter.getCount(), is(0));
203         assertThat(counter.getLast(), is(0L));
204
205         assertThat(DenialOfServiceTaf.removeDenyID(id1), is(true));
206         assertThat(DenialOfServiceTaf.removeDenyID(id1), is(false));
207         assertThat(DenialOfServiceTaf.removeDenyID(id2), is(true));
208         assertThat(DenialOfServiceTaf.removeDenyID(id2), is(false));
209     }
210
211     @Test
212     public void reportTest() throws CadiException {
213         DenialOfServiceTaf dost = new DenialOfServiceTaf(accessMock);
214         List<String> denials = dost.report();
215         assertThat(denials.size(), is(0));
216
217         DenialOfServiceTaf.denyID(id1);
218         DenialOfServiceTaf.denyID(id2);
219
220         DenialOfServiceTaf.denyIP(ip1);
221         DenialOfServiceTaf.denyIP(ip2);
222
223         denials = dost.report();
224         assertThat(denials.size(), is(4));
225         for (String denied : denials) {
226             switch (denied.split(" ", 2)[0]) {
227                 case ip1:
228                 case ip2:
229                 case id1:
230                 case id2:
231                     break;
232                 default:
233                     fail("The line: [" + denied + "] shouldn't be in the report");
234             }
235         }
236     }
237
238     @Test
239     public void respDenyIDTest() {
240         TafResp tafResp = DenialOfServiceTaf.respDenyID(accessMock, id1);
241         assertThat(tafResp.desc(), is(id1 + " is on the Identity Denial list"));
242     }
243
244     @Test
245     public void ipFileIOTest() throws CadiException, IOException {
246         @SuppressWarnings("unused")
247         DenialOfServiceTaf dost;
248
249         dosIPFile.createNewFile();
250
251         // coverage...
252         DenialOfServiceTaf.denyIP(ip1);
253         DenialOfServiceTaf.removeDenyIP(ip1);
254
255         dost = new DenialOfServiceTaf(accessMock);
256         DenialOfServiceTaf.denyIP(ip1);
257         DenialOfServiceTaf.denyIP(ip2);
258         // coverage...
259         DenialOfServiceTaf.denyIP(ip2);
260
261         String contents = readContentsFromFile(dosIPFile);
262         assertThat(contents.contains(ip1), is(true));
263         assertThat(contents.contains(ip2), is(true));
264
265         // Removing all ips should delete the file
266         assertThat(dosIPFile.exists(), is(true));
267         DenialOfServiceTaf.removeDenyIP(ip1);
268         DenialOfServiceTaf.removeDenyIP(ip2);
269         assertThat(dosIPFile.exists(), is(false));
270
271         dosIPFile.createNewFile();
272
273         DenialOfServiceTaf.denyIP(ip1);
274         DenialOfServiceTaf.denyIP(ip2);
275
276         setPrivateField(DenialOfServiceTaf.class, "dosIP", null);
277         dost = new DenialOfServiceTaf(accessMock);
278
279         contents = readContentsFromFile(dosIPFile);
280         assertThat(contents.contains(ip1), is(true));
281         assertThat(contents.contains(ip2), is(true));
282
283         dosIPFile.delete();
284
285         // coverage...
286         setPrivateField(DenialOfServiceTaf.class, "deniedIP", null);
287         DenialOfServiceTaf.denyIP(ip1);
288         dosIPFile.delete();
289         DenialOfServiceTaf.removeDenyIP(ip1);
290
291         // coverage...
292         dosIPFile.delete();
293         setPrivateField(DenialOfServiceTaf.class, "dosIP", null);
294         dost = new DenialOfServiceTaf(accessMock);
295     }
296
297     @Test
298     public void idFileIOTest() throws CadiException, IOException {
299         @SuppressWarnings("unused")
300         DenialOfServiceTaf dost;
301
302         dosIDFile.createNewFile();
303
304         // coverage...
305         DenialOfServiceTaf.denyID(id1);
306         DenialOfServiceTaf.removeDenyID(id1);
307
308         dost = new DenialOfServiceTaf(accessMock);
309         DenialOfServiceTaf.denyID(id1);
310         DenialOfServiceTaf.denyID(id2);
311         // coverage...
312         DenialOfServiceTaf.denyID(id2);
313
314         String contents = readContentsFromFile(dosIDFile);
315         assertThat(contents.contains(id1), is(true));
316         assertThat(contents.contains(id2), is(true));
317
318         // Removing all ids should delete the file
319         assertThat(dosIDFile.exists(), is(true));
320         DenialOfServiceTaf.removeDenyID(id1);
321         DenialOfServiceTaf.removeDenyID(id2);
322         assertThat(dosIDFile.exists(), is(false));
323
324         dosIDFile.createNewFile();
325
326         DenialOfServiceTaf.denyID(id1);
327         DenialOfServiceTaf.denyID(id2);
328
329         setPrivateField(DenialOfServiceTaf.class, "dosID", null);
330         dost = new DenialOfServiceTaf(accessMock);
331
332         contents = readContentsFromFile(dosIDFile);
333         assertThat(contents.contains(id1), is(true));
334         assertThat(contents.contains(id2), is(true));
335
336         dosIDFile.delete();
337
338         // coverage...
339         setPrivateField(DenialOfServiceTaf.class, "deniedID", null);
340         DenialOfServiceTaf.denyID(id1);
341         dosIDFile.delete();
342         DenialOfServiceTaf.removeDenyID(id1);
343
344         // coverage...
345         dosIDFile.delete();
346         setPrivateField(DenialOfServiceTaf.class, "dosID", null);
347         dost = new DenialOfServiceTaf(accessMock);
348     }
349
350     private void setPrivateField(Class<?> clazz, String fieldName, Object value) {
351         try {
352             Field field = clazz.getDeclaredField(fieldName);
353             field.setAccessible(true);
354             field.set(null, value);
355             field.setAccessible(false);
356         } catch (Exception e) {
357             System.err.println("Could not set field [" + fieldName + "] to " + value);
358         }
359     }
360
361     private String readContentsFromFile(File file) throws IOException {
362         BufferedReader br = new BufferedReader(new FileReader(file));
363         StringBuilder sb = new StringBuilder();
364         String line;
365         while ((line = br.readLine()) != null) {
366             sb.append(line);
367         }
368         br.close();
369         return sb.toString();
370     }
371
372 }