Replaced bitwise operator usage with java lang APIs for robustness. Had found that...
[packetcable.git] / packetcable-driver / src / test / java / org / umu / cops / stack / COPSDecisionMsgTest.java
1 package org.umu.cops.stack;
2
3 import org.junit.After;
4 import org.junit.Assert;
5 import org.junit.Before;
6 import org.junit.Test;
7 import org.pcmm.rcd.IPCMMClient;
8 import org.umu.cops.stack.COPSClientSI.CSIType;
9 import org.umu.cops.stack.COPSContext.RType;
10 import org.umu.cops.stack.COPSDecision.Command;
11 import org.umu.cops.stack.COPSDecision.DecisionFlag;
12 import org.umu.cops.stack.COPSError.ErrorTypes;
13 import org.umu.cops.stack.COPSHeader.Flag;
14 import org.umu.cops.stack.COPSHeader.OPCode;
15 import org.umu.cops.stack.COPSObjHeader.CType;
16
17 import java.io.ByteArrayOutputStream;
18 import java.net.InetAddress;
19 import java.net.Socket;
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.Map;
23 import java.util.Set;
24
25 /**
26  * Tests for the first constructor of the COPSDecisionMsg class.
27  * Should any of these tests be inaccurate it is due to the fact that they have been written after COPSDecisionMsg had been
28  * released and my assumptions may be incorrect.
29  */
30 public class COPSDecisionMsgTest {
31
32     TestCOPSServer server;
33     Socket outSocket;
34
35     final static Map<COPSContext, Set<COPSDecision>> staticDecisions = new HashMap<>();
36     static {
37         final Set<COPSDecision> decisions1 = new HashSet<>();
38         decisions1.add(new COPSDecision(CType.CSI, Command.INSTALL, DecisionFlag.REQERROR, new COPSData("12345")));
39         staticDecisions.put(new COPSContext(RType.CONFIG, (short)1), decisions1);
40     }
41
42     @Before
43     public void setup() throws Exception {
44         server = new TestCOPSServer();
45         server.start();
46         outSocket = new Socket(InetAddress.getLocalHost(), server.getPort());
47     }
48
49     @After
50     public void tearDown() throws Exception {
51         outSocket.close();
52         server.close();
53     }
54
55     @Test(expected = IllegalArgumentException.class)
56     public void version0WithError() {
57         new COPSDecisionMsg(0, Flag.SOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()),
58                 new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA), null, null);
59     }
60
61     @Test(expected = IllegalArgumentException.class)
62     public void version0WithDecisions() {
63         new COPSDecisionMsg(0, Flag.SOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()),
64                 staticDecisions, null, null);
65     }
66
67     @Test(expected = IllegalArgumentException.class)
68     public void nullFlagWithError() {
69         new COPSDecisionMsg(1, null, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()),
70                 new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA), null, null);
71     }
72
73     @Test(expected = IllegalArgumentException.class)
74     public void nullFlagWithDecisions() {
75         new COPSDecisionMsg(1, null, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()),
76                 staticDecisions, null, null);
77     }
78
79     @Test(expected = IllegalArgumentException.class)
80     public void nullHandleDeprecatedWithError() {
81         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, null,
82                 new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA), null, null);
83     }
84
85     @Test(expected = IllegalArgumentException.class)
86     public void nullHandleDeprecatedWithDecisions() {
87         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, null, staticDecisions, null, null);
88     }
89
90     @Test(expected = IllegalArgumentException.class)
91     public void nullHandleWithError() {
92         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, null,
93                 new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA), null, null);
94     }
95
96     @Test(expected = IllegalArgumentException.class)
97     public void nullHandleWithDecisions() {
98         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, null, staticDecisions, null, null);
99     }
100
101     @Test(expected = IllegalArgumentException.class)
102     public void nullErrorDeprecated() {
103         final COPSError error = null;
104         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), error, null, null);
105     }
106
107     @Test(expected = IllegalArgumentException.class)
108     public void nullError() {
109         final COPSError error = null;
110         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), error,
111                 null, null);
112     }
113
114     @Test(expected = IllegalArgumentException.class)
115     public void nullDecisionsDeprecated() {
116         final Map<COPSContext, Set<COPSDecision>> decisions = null;
117         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions, null, null);
118     }
119
120     @Test(expected = IllegalArgumentException.class)
121     public void nullDecisions() {
122         final Map<COPSContext, Set<COPSDecision>> decisions = null;
123         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions,
124                 null, null);
125     }
126
127     @Test(expected = IllegalArgumentException.class)
128     public void emptyDecisionsMapDeprecated() {
129         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
130         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions, null, null);
131     }
132
133     @Test(expected = IllegalArgumentException.class)
134     public void emptyDecisionsMap() {
135         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
136         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions,
137                 null, null);
138     }
139
140     @Test(expected = IllegalArgumentException.class)
141     public void nullDecisionsSetDeprecated() {
142         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
143         decisions.put(new COPSContext(RType.CONFIG, (short)1), null);
144         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions, null, null);
145     }
146
147     @Test(expected = IllegalArgumentException.class)
148     public void nullDecisionsSet() {
149         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
150         decisions.put(new COPSContext(RType.CONFIG, (short)1), null);
151         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions,
152                 null, null);
153     }
154
155     @Test(expected = IllegalArgumentException.class)
156     public void emptyDecisionsSetDeprecated() {
157         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
158         decisions.put(new COPSContext(RType.CONFIG, (short)1), new HashSet<COPSDecision>());
159         new COPSDecisionMsg(IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions, null, null);
160     }
161
162     @Test(expected = IllegalArgumentException.class)
163     public void emptyDecisionsSet() {
164         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
165         decisions.put(new COPSContext(RType.CONFIG, (short)1), new HashSet<COPSDecision>());
166         new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE, new COPSHandle(new COPSData()), decisions,
167                 null, null);
168     }
169
170     @Test(expected = IllegalArgumentException.class)
171     public void nullHeaderErrorOnly() {
172         final COPSHeader hdr = null;
173         new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()), new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA),
174                 null, null, null);
175     }
176
177     @Test(expected = IllegalArgumentException.class)
178     public void nullHeaderDecisionsOnly() {
179         final COPSHeader hdr = null;
180         new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()), null, staticDecisions, null, null);
181     }
182
183     @Test(expected = IllegalArgumentException.class)
184     public void invalidHdrErrorOnly() {
185         final COPSHeader hdr = new COPSHeader(1, Flag.UNSOLICITED, OPCode.CC, IPCMMClient.CLIENT_TYPE);
186         new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()), new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA),
187                 null, null, null);
188     }
189
190     @Test(expected = IllegalArgumentException.class)
191     public void invalidHdrDecisionsOnly() {
192         final COPSHeader hdr = new COPSHeader(1, Flag.UNSOLICITED, OPCode.CC, IPCMMClient.CLIENT_TYPE);
193         new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()), null, staticDecisions, null, null);
194     }
195
196     @Test(expected = IllegalArgumentException.class)
197     public void withErrorAndDecisions() {
198         final COPSHeader hdr = new COPSHeader(1, Flag.UNSOLICITED, OPCode.DEC, IPCMMClient.CLIENT_TYPE);
199         new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()), new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA),
200                 staticDecisions, null, null);
201     }
202
203     @Test(expected = IllegalArgumentException.class)
204     public void nullErrorAndDecisions() {
205         final COPSHeader hdr = new COPSHeader(1, Flag.UNSOLICITED, OPCode.DEC, IPCMMClient.CLIENT_TYPE);
206         new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()), null, null, null, null);
207     }
208
209     @Test
210     public void validProtectedError() {
211         final COPSHeader hdr = new COPSHeader(1, Flag.UNSOLICITED, OPCode.DEC, IPCMMClient.CLIENT_TYPE);
212         final COPSDecisionMsg msg = new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()),
213                 new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA), null, null, null);
214         Assert.assertEquals(OPCode.DEC, msg.getHeader().getOpCode());
215         Assert.assertEquals(IPCMMClient.CLIENT_TYPE, msg.getHeader().getClientType());
216         Assert.assertEquals(hdr, msg.getHeader());
217         Assert.assertEquals(new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA), msg.getError());
218         Assert.assertNotNull(msg.getDecisions());
219         Assert.assertTrue(msg.getDecisions().isEmpty());
220         Assert.assertNull(msg.getIntegrity());
221     }
222
223     @Test
224     public void validProtectedDecisions() {
225         final COPSHeader hdr = new COPSHeader(1, Flag.UNSOLICITED, OPCode.DEC, IPCMMClient.CLIENT_TYPE);
226         final COPSDecisionMsg msg = new COPSDecisionMsg(hdr, new COPSHandle(new COPSData()),
227                 null, staticDecisions, null, null);
228         Assert.assertEquals(OPCode.DEC, msg.getHeader().getOpCode());
229         Assert.assertEquals(IPCMMClient.CLIENT_TYPE, msg.getHeader().getClientType());
230         Assert.assertEquals(hdr, msg.getHeader());
231         Assert.assertNull(msg.getError());
232         Assert.assertNotNull(msg.getDecisions());
233         Assert.assertFalse(msg.getDecisions().isEmpty());
234         Assert.assertNotSame(staticDecisions, msg.getDecisions());
235         Assert.assertEquals(staticDecisions, msg.getDecisions());
236         Assert.assertNull(msg.getIntegrity());
237     }
238
239     /**
240      * This test is responsible for creating a COPSDecisionMsg object with error and no decisions
241      * and then is dumped to an OutputStream.
242      * @throws Exception - Test should fail if any exception is thrown
243      */
244     @Test
245     public void testDumpErrorAll() throws Exception {
246         final COPSDecisionMsg msg = new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE,
247                 new COPSHandle(new COPSData()), new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.NA),
248                 new COPSIntegrity(), new COPSClientSI(CSIType.NAMED, new COPSData()));
249
250         final ByteArrayOutputStream os = new ByteArrayOutputStream();
251         msg.dump(os);
252
253         final String out = new String(os.toByteArray());
254         System.out.println(out);
255         final String[] lines = out.split("\n");
256         Assert.assertEquals(25, lines.length);
257
258         // Only checking COPSMsg elements as the COPSObjectMsg elements have already been validated in their own tests
259         Assert.assertEquals("**MSG HEADER**", lines[0]);
260         Assert.assertEquals("Version: 1", lines[1]);
261         Assert.assertEquals("Flags: UNSOLICITED", lines[2]);
262         Assert.assertEquals("OpCode: DEC", lines[3]);
263         Assert.assertEquals("Client-type: -32758", lines[4]);
264     }
265
266     /**
267      * This test is responsible for creating a COPSDecisionMsg object with error and no decisions
268      * and then is dumped to an OutputStream.
269      * @throws Exception - Test should fail if any exception is thrown
270      */
271     @Test
272     public void testDumpDecisionsAll() throws Exception {
273         final COPSDecisionMsg msg = new COPSDecisionMsg(1, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE,
274                 new COPSHandle(new COPSData()), staticDecisions, new COPSIntegrity(),
275                 new COPSClientSI(CSIType.NAMED, new COPSData()));
276
277         final ByteArrayOutputStream os = new ByteArrayOutputStream();
278         msg.dump(os);
279
280         final String out = new String(os.toByteArray());
281         System.out.println(out);
282         final String[] lines = out.split("\n");
283         Assert.assertEquals(29, lines.length);
284
285         // Only checking COPSMsg elements as the COPSObjectMsg elements have already been validated in their own tests
286         Assert.assertEquals("**MSG HEADER**", lines[0]);
287         Assert.assertEquals("Version: 1", lines[1]);
288         Assert.assertEquals("Flags: UNSOLICITED", lines[2]);
289         Assert.assertEquals("OpCode: DEC", lines[3]);
290         Assert.assertEquals("Client-type: -32758", lines[4]);
291     }
292
293     /**
294      * This test is responsible for creating a COPSDecisionMsg error object with the minimal necessary attributes.
295      * It is then streamed over a socket (unmarshalled) then reassembled (marshalled).
296      * @throws Exception - Test should fail if any exception is thrown
297      */
298     @Test
299     public void testWriteErrorMin() throws Exception {
300         final COPSDecisionMsg msg = new COPSDecisionMsg(2, Flag.SOLICITED, IPCMMClient.CLIENT_TYPE,
301                 new COPSHandle(new COPSData("12345")), new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.COMM_FAILURE),
302                 null, null);
303
304         msg.writeData(outSocket);
305
306         final long start = System.currentTimeMillis();
307         while (server.copsMsgs.size() < 1) {
308             Thread.sleep(5);
309             if (System.currentTimeMillis() - start > 2000) break;
310         }
311
312         Assert.assertEquals(1, server.copsMsgs.size());
313         Assert.assertEquals(msg, server.copsMsgs.get(0));
314     }
315
316     /**
317      * This test is responsible for creating a COPSDecisionMsg error object with all valid attributes.
318      * It is then streamed over a socket (unmarshalled) then reassembled (marshalled).
319      * @throws Exception - Test should fail if any exception is thrown
320      */
321     @Test
322     public void testWriteErrorWithIntegrity() throws Exception {
323         final COPSDecisionMsg msg = new COPSDecisionMsg(2, Flag.SOLICITED, IPCMMClient.CLIENT_TYPE,
324                 new COPSHandle(new COPSData("12345")), new COPSError(ErrorTypes.AUTH_FAILURE, ErrorTypes.COMM_FAILURE),
325                 new COPSIntegrity(2, 3, new COPSData("123456")), new COPSClientSI(CSIType.NAMED, new COPSData("123")));
326
327         msg.writeData(outSocket);
328
329         final long start = System.currentTimeMillis();
330         while (server.copsMsgs.size() < 1) {
331             Thread.sleep(5);
332             if (System.currentTimeMillis() - start > 2000) break;
333         }
334
335         Assert.assertEquals(1, server.copsMsgs.size());
336         Assert.assertEquals(msg, server.copsMsgs.get(0));
337     }
338
339     /**
340      * This test is responsible for creating a COPSDecisionMsg error object with all valid attributes.
341      * It is then streamed over a socket (unmarshalled) then reassembled (marshalled).
342      * @throws Exception - Test should fail if any exception is thrown
343      */
344     @Test
345     public void testWriteDecisionsWithIntegrity() throws Exception {
346         final Map<COPSContext, Set<COPSDecision>> decisions = new HashMap<>();
347         final COPSContext context1 = new COPSContext(RType.CONFIG, (short)1);
348         final Set<COPSDecision> decisions1 = new HashSet<>();
349         decisions1.add(new COPSDecision(CType.CSI, Command.INSTALL, DecisionFlag.REQERROR, new COPSData("12345")));
350         decisions1.add(new COPSDecision(CType.NAMED, Command.NULL, DecisionFlag.REQSTATE, new COPSData("123456")));
351         decisions.put(context1, decisions1);
352
353         final COPSContext context2 = new COPSContext(RType.IN_ADMIN, (short)2);
354         final Set<COPSDecision> decisions2 = new HashSet<>();
355         decisions2.add(new COPSDecision(CType.STATELESS, Command.REMOVE, DecisionFlag.REQERROR, new COPSData("1234567")));
356         decisions.put(context2, decisions2);
357
358         final COPSDecisionMsg msg = new COPSDecisionMsg(2, Flag.UNSOLICITED, IPCMMClient.CLIENT_TYPE,
359                 new COPSHandle(new COPSData("12345")), decisions, new COPSIntegrity(4, 5, new COPSData("123456")),
360                 new COPSClientSI(CSIType.NAMED, new COPSData("123")));
361
362         msg.writeData(outSocket);
363
364         final long start = System.currentTimeMillis();
365         while (server.copsMsgs.size() < 1) {
366             Thread.sleep(5);
367             if (System.currentTimeMillis() - start > 2000) break;
368         }
369
370         Assert.assertEquals(1, server.copsMsgs.size());
371         Assert.assertEquals(msg, server.copsMsgs.get(0));
372     }
373
374 }