Use managed guava version
[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("DenialOfServiceTaf is not processing this transaction: This Transaction is not denied"));
135
136                 assertThat(DenialOfServiceTaf.denyIP(ip1), is(true));
137
138                 tafResp = dost.validate(LifeForm.SBLF, reqMock1, respMock);
139                 assertThat(tafResp.desc(), is(ip1 + " is on the IP Denial list"));
140
141                 tafResp = dost.validate(LifeForm.SBLF, reqMock2, respMock);
142                 assertThat(tafResp.desc(), is("DenialOfServiceTaf is not processing this transaction: This Transaction is not denied"));
143         }
144
145         @Test
146         public void revalidateTest() throws CadiException {
147                 DenialOfServiceTaf dost = new DenialOfServiceTaf(accessMock);
148                 Resp resp = dost.revalidate(null, null);
149                 assertThat(resp, is(Resp.NOT_MINE));
150         }
151
152         @Test
153         public void denyIPTest() throws CadiException {
154                 assertThat(DenialOfServiceTaf.isDeniedIP(ip1), is(nullValue()));
155                 assertThat(DenialOfServiceTaf.denyIP(ip1), is(true));  // true because it's been added
156                 assertThat(DenialOfServiceTaf.denyIP(ip2), is(true));  // true because it's been added
157                 assertThat(DenialOfServiceTaf.denyIP(ip1), is(false)); // false because it's already been added
158                 assertThat(DenialOfServiceTaf.denyIP(ip2), is(false)); // false because it's already been added
159
160                 Counter counter;
161                 counter = DenialOfServiceTaf.isDeniedIP(ip1);
162                 assertThat(counter.getName(), is(ip1));
163                 assertThat(counter.getCount(), is(0));
164                 assertThat(counter.getLast(), is(0L));
165                 assertThat(counter.toString(), is(ip1 + " is on the denied list, but has not attempted Access" ));
166
167                 DenialOfServiceTaf dost = new DenialOfServiceTaf(accessMock);
168                 dost.validate(LifeForm.SBLF, reqMock1, respMock);
169                 long approxTime = System.currentTimeMillis();
170
171                 counter = DenialOfServiceTaf.isDeniedIP(ip1);
172                 assertThat(counter.getName(), is(ip1));
173                 assertThat(counter.getCount(), is(1));
174                 assertThat((Math.abs(approxTime - counter.getLast()) < 10), is(true));
175                 assertThat(counter.toString().contains(ip1), is(true));
176                 assertThat(counter.toString().contains(" has been denied 1 times since "), is(true));
177                 assertThat(counter.toString().contains(".  Last denial was "), is(true));
178
179                 // coverage...
180                 dost.validate(LifeForm.SBLF, reqMock1, respMock);
181
182                 assertThat(DenialOfServiceTaf.removeDenyIP(ip1), is(true));
183                 assertThat(DenialOfServiceTaf.removeDenyIP(ip1), is(false));
184                 assertThat(DenialOfServiceTaf.removeDenyIP(ip2), is(true));
185                 assertThat(DenialOfServiceTaf.removeDenyIP(ip2), is(false));
186         }
187
188         @Test
189         public void denyIDTest() throws CadiException {
190                 assertThat(DenialOfServiceTaf.isDeniedID(id1), is(nullValue()));
191                 assertThat(DenialOfServiceTaf.denyID(id1), is(true));  // true because it's been added
192                 assertThat(DenialOfServiceTaf.denyID(id2), is(true));  // true because it's been added
193                 assertThat(DenialOfServiceTaf.denyID(id1), is(false)); // false because it's already been added
194                 assertThat(DenialOfServiceTaf.denyID(id2), is(false)); // false because it's already been added
195
196                 Counter counter;
197                 counter = DenialOfServiceTaf.isDeniedID(id1);
198                 assertThat(counter.getName(), is(id1));
199                 assertThat(counter.getCount(), is(0));
200                 assertThat(counter.getLast(), is(0L));
201
202                 assertThat(DenialOfServiceTaf.removeDenyID(id1), is(true));
203                 assertThat(DenialOfServiceTaf.removeDenyID(id1), is(false));
204                 assertThat(DenialOfServiceTaf.removeDenyID(id2), is(true));
205                 assertThat(DenialOfServiceTaf.removeDenyID(id2), is(false));
206         }
207
208         @Test
209         public void reportTest() throws CadiException {
210                 DenialOfServiceTaf dost = new DenialOfServiceTaf(accessMock);
211                 List<String> denials = dost.report();
212                 assertThat(denials.size(), is(0));
213
214                 DenialOfServiceTaf.denyID(id1);
215                 DenialOfServiceTaf.denyID(id2);
216
217                 DenialOfServiceTaf.denyIP(ip1);
218                 DenialOfServiceTaf.denyIP(ip2);
219
220                 denials = dost.report();
221                 assertThat(denials.size(), is(4));
222                 for (String denied : denials) {
223                         switch (denied.split(" ", 2)[0]) {
224                                 case ip1:
225                                 case ip2:
226                                 case id1:
227                                 case id2:
228                                         break;
229                                 default:
230                                         fail("The line: [" + denied + "] shouldn't be in the report");
231                         }
232                 }
233         }
234
235         @Test
236         public void respDenyIDTest() {
237                 TafResp tafResp = DenialOfServiceTaf.respDenyID(accessMock, id1);
238                 assertThat(tafResp.desc(), is(id1 + " is on the Identity Denial list"));
239         }
240
241         @Test
242         public void ipFileIOTest() throws CadiException, IOException {
243                 @SuppressWarnings("unused")
244                 DenialOfServiceTaf dost;
245
246                 dosIPFile.createNewFile();
247
248                 // coverage...
249                 DenialOfServiceTaf.denyIP(ip1);
250                 DenialOfServiceTaf.removeDenyIP(ip1);
251
252                 dost = new DenialOfServiceTaf(accessMock);
253                 DenialOfServiceTaf.denyIP(ip1);
254                 DenialOfServiceTaf.denyIP(ip2);
255                 // coverage...
256                 DenialOfServiceTaf.denyIP(ip2);
257
258                 String contents = readContentsFromFile(dosIPFile);
259                 assertThat(contents.contains(ip1), is(true));
260                 assertThat(contents.contains(ip2), is(true));
261
262                 // Removing all ips should delete the file
263                 assertThat(dosIPFile.exists(), is(true));
264                 DenialOfServiceTaf.removeDenyIP(ip1);
265                 DenialOfServiceTaf.removeDenyIP(ip2);
266                 assertThat(dosIPFile.exists(), is(false));
267
268                 dosIPFile.createNewFile();
269
270                 DenialOfServiceTaf.denyIP(ip1);
271                 DenialOfServiceTaf.denyIP(ip2);
272
273                 setPrivateField(DenialOfServiceTaf.class, "dosIP", null);
274                 dost = new DenialOfServiceTaf(accessMock);
275
276                 contents = readContentsFromFile(dosIPFile);
277                 assertThat(contents.contains(ip1), is(true));
278                 assertThat(contents.contains(ip2), is(true));
279
280                 dosIPFile.delete();
281
282                 // coverage...
283                 setPrivateField(DenialOfServiceTaf.class, "deniedIP", null);
284                 DenialOfServiceTaf.denyIP(ip1);
285                 dosIPFile.delete();
286                 DenialOfServiceTaf.removeDenyIP(ip1);
287
288                 // coverage...
289                 dosIPFile.delete();
290                 setPrivateField(DenialOfServiceTaf.class, "dosIP", null);
291                 dost = new DenialOfServiceTaf(accessMock);
292         }
293
294         @Test
295         public void idFileIOTest() throws CadiException, IOException {
296                 @SuppressWarnings("unused")
297                 DenialOfServiceTaf dost;
298
299                 dosIDFile.createNewFile();
300
301                 // coverage...
302                 DenialOfServiceTaf.denyID(id1);
303                 DenialOfServiceTaf.removeDenyID(id1);
304
305                 dost = new DenialOfServiceTaf(accessMock);
306                 DenialOfServiceTaf.denyID(id1);
307                 DenialOfServiceTaf.denyID(id2);
308                 // coverage...
309                 DenialOfServiceTaf.denyID(id2);
310
311                 String contents = readContentsFromFile(dosIDFile);
312                 assertThat(contents.contains(id1), is(true));
313                 assertThat(contents.contains(id2), is(true));
314
315                 // Removing all ids should delete the file
316                 assertThat(dosIDFile.exists(), is(true));
317                 DenialOfServiceTaf.removeDenyID(id1);
318                 DenialOfServiceTaf.removeDenyID(id2);
319                 assertThat(dosIDFile.exists(), is(false));
320
321                 dosIDFile.createNewFile();
322
323                 DenialOfServiceTaf.denyID(id1);
324                 DenialOfServiceTaf.denyID(id2);
325
326                 setPrivateField(DenialOfServiceTaf.class, "dosID", null);
327                 dost = new DenialOfServiceTaf(accessMock);
328
329                 contents = readContentsFromFile(dosIDFile);
330                 assertThat(contents.contains(id1), is(true));
331                 assertThat(contents.contains(id2), is(true));
332
333                 dosIDFile.delete();
334
335                 // coverage...
336                 setPrivateField(DenialOfServiceTaf.class, "deniedID", null);
337                 DenialOfServiceTaf.denyID(id1);
338                 dosIDFile.delete();
339                 DenialOfServiceTaf.removeDenyID(id1);
340
341                 // coverage...
342                 dosIDFile.delete();
343                 setPrivateField(DenialOfServiceTaf.class, "dosID", null);
344                 dost = new DenialOfServiceTaf(accessMock);
345         }
346
347         private void setPrivateField(Class<?> clazz, String fieldName, Object value) {
348                 try {
349                         Field field = clazz.getDeclaredField(fieldName);
350                         field.setAccessible(true);
351                         field.set(null, value);
352                         field.setAccessible(false);
353                 } catch(Exception e) {
354                         System.err.println("Could not set field [" + fieldName + "] to " + value);
355                 }
356         }
357
358         private String readContentsFromFile(File file) throws IOException {
359                 BufferedReader br = new BufferedReader(new FileReader(file));
360                 StringBuilder sb = new StringBuilder();
361                 String line;
362                 while ((line = br.readLine()) != null) {
363                         sb.append(line);
364                 }
365                 br.close();
366                 return sb.toString();
367         }
368
369 }