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