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