1 package org.apache.commons.jcs3.utils.discovery;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.concurrent.Callable;
25 import java.util.concurrent.ExecutionException;
26 import java.util.concurrent.ExecutorService;
27 import java.util.concurrent.Executors;
28 import java.util.concurrent.Future;
29 import java.util.concurrent.TimeUnit;
30 import java.util.concurrent.TimeoutException;
31
32 import org.apache.commons.jcs3.utils.discovery.UDPDiscoveryMessage.BroadcastType;
33 import org.apache.commons.jcs3.utils.net.HostNameUtil;
34 import org.apache.commons.jcs3.utils.serialization.EncryptingSerializer;
35
36 import junit.framework.TestCase;
37
38
39
40
41 public class UDPDiscoverySenderEncryptedUnitTest
42 extends TestCase
43 {
44
45 private static final String ADDRESS = "228.4.5.9";
46
47
48 private static final int PORT = 5556;
49
50
51 private static final String SENDING_HOST = "imaginary host address";
52
53
54 private static final int SENDING_PORT = 1;
55
56
57 private UDPDiscoveryReceiver receiver;
58
59
60 private UDPDiscoverySender sender;
61
62
63
64
65
66
67
68 @Override
69 protected void setUp()
70 throws Exception
71 {
72 super.setUp();
73
74 EncryptingSerializer serializer = new EncryptingSerializer();
75 serializer.setPreSharedKey("my_key");
76
77 receiver = new UDPDiscoveryReceiver( null, null, ADDRESS, PORT );
78 receiver.setSerializer(serializer);
79 final Thread t = new Thread( receiver );
80 t.start();
81
82 sender = new UDPDiscoverySender(null, ADDRESS, PORT, 1, serializer);
83 }
84
85
86
87
88
89
90 @Override
91 protected void tearDown()
92 throws Exception
93 {
94 receiver.shutdown();
95 sender.close();
96 super.tearDown();
97 }
98
99
100
101
102
103
104 public void testPassiveBroadcast()
105 throws Exception
106 {
107 if (HostNameUtil.getMulticastNetworkInterface() == null)
108 {
109 System.out.println("This machine does not support multicast");
110 return;
111 }
112
113
114 final ArrayList<String> cacheNames = new ArrayList<>();
115
116
117 sender.passiveBroadcast( SENDING_HOST, SENDING_PORT, cacheNames, 1L );
118
119
120
121 final UDPDiscoveryMessage msg = getMessage();
122 assertNotNull("message not received", msg);
123 assertEquals( "wrong port", SENDING_PORT, msg.getPort() );
124 assertEquals( "wrong message type", BroadcastType.PASSIVE, msg.getMessageType() );
125 }
126
127
128
129
130
131
132 public void testRemoveBroadcast()
133 throws Exception
134 {
135 if (HostNameUtil.getMulticastNetworkInterface() == null)
136 {
137 System.out.println("This machine does not support multicast");
138 return;
139 }
140
141
142 final ArrayList<String> cacheNames = new ArrayList<>();
143
144
145 sender.removeBroadcast( SENDING_HOST, SENDING_PORT, cacheNames, 1L );
146
147
148
149 final UDPDiscoveryMessage msg = getMessage();
150 assertNotNull("message not received", msg);
151 assertEquals( "wrong port", SENDING_PORT, msg.getPort() );
152 assertEquals( "wrong message type", BroadcastType.REMOVE, msg.getMessageType() );
153 }
154
155
156
157
158
159
160 public void testRequestBroadcast()
161 throws Exception
162 {
163 if (HostNameUtil.getMulticastNetworkInterface() == null)
164 {
165 System.out.println("This machine does not support multicast");
166 return;
167 }
168
169
170 sender.requestBroadcast();
171
172
173
174 final UDPDiscoveryMessage msg = getMessage();
175 assertNotNull("message not received", msg);
176 assertEquals( "wrong message type", BroadcastType.REQUEST, msg.getMessageType() );
177
178
179 }
180
181
182
183
184
185
186 private UDPDiscoveryMessage getMessage() {
187 ExecutorService executor = Executors.newCachedThreadPool();
188 Callable<Object> task = new Callable<Object>() {
189 @Override
190 public Object call() throws IOException {
191 return receiver.waitForMessage();
192 }
193 };
194 Future<Object> future = executor.submit(task);
195 try {
196 Object obj = future.get(3, TimeUnit.SECONDS);
197
198 assertTrue( "unexpected crap received", obj instanceof UDPDiscoveryMessage );
199
200 return (UDPDiscoveryMessage) obj;
201 } catch (InterruptedException | ExecutionException | TimeoutException ex) {
202 return null;
203 }
204 }
205 }