Clover Coverage Report - JmDNS 3.4.1
Coverage timestamp: Thu Aug 25 2011 13:06:33 CEST
220   386   26   15.71
24   298   0.12   7
14     1.86  
2    
 
  TextUpdateTest       Line # 36 185 0% 18 20 90.7% 0.90697676
  TextUpdateTest.MockListener       Line # 44 35 0% 8 31 27.9% 0.27906978
 
  (5)
 
1    /**
2    *
3    */
4    package javax.jmdns.test;
5   
6    import static junit.framework.Assert.assertEquals;
7    import static junit.framework.Assert.assertNull;
8    import static junit.framework.Assert.assertNotNull;
9    import static junit.framework.Assert.assertTrue;
10   
11    import java.io.IOException;
12    import java.util.ArrayList;
13    import java.util.Collections;
14    import java.util.Enumeration;
15    import java.util.HashMap;
16    import java.util.List;
17    import java.util.Map;
18    import java.util.logging.ConsoleHandler;
19    import java.util.logging.Level;
20    import java.util.logging.LogManager;
21    import java.util.logging.Logger;
22   
23    import javax.jmdns.JmDNS;
24    import javax.jmdns.ServiceEvent;
25    import javax.jmdns.ServiceInfo;
26    import javax.jmdns.ServiceListener;
27    import javax.jmdns.impl.constants.DNSConstants;
28    import javax.jmdns.impl.tasks.state.DNSStateTask;
29   
30    import org.junit.Before;
31    import org.junit.Test;
32   
33    /**
34    *
35    */
 
36    public class TextUpdateTest {
37   
38    private ServiceInfo service;
39    private ServiceInfo printer;
40    private MockListener serviceListenerMock;
41   
42    private final static String serviceKey = "srvname"; // Max 9 chars
43   
 
44    public static class MockListener implements ServiceListener {
45   
46    private final List<ServiceEvent> _serviceAdded = Collections.synchronizedList(new ArrayList<ServiceEvent>(2));
47    private final List<ServiceEvent> _serviceRemoved = Collections.synchronizedList(new ArrayList<ServiceEvent>(2));
48    private final List<ServiceEvent> _serviceResolved = Collections.synchronizedList(new ArrayList<ServiceEvent>(2));
49   
50    /*
51    * (non-Javadoc)
52    * @see javax.jmdns.ServiceListener#serviceAdded(javax.jmdns.ServiceEvent)
53    */
 
54  5 toggle @Override
55    public void serviceAdded(ServiceEvent event) {
56  5 _serviceAdded.add(event.clone());
57    }
58   
59    /*
60    * (non-Javadoc)
61    * @see javax.jmdns.ServiceListener#serviceRemoved(javax.jmdns.ServiceEvent)
62    */
 
63  0 toggle @Override
64    public void serviceRemoved(ServiceEvent event) {
65  0 _serviceRemoved.add(event.clone());
66    }
67   
68    /*
69    * (non-Javadoc)
70    * @see javax.jmdns.ServiceListener#serviceResolved(javax.jmdns.ServiceEvent)
71    */
 
72  9 toggle @Override
73    public void serviceResolved(ServiceEvent event) {
74  9 _serviceResolved.add(event.clone());
75    }
76   
 
77  5 toggle public List<ServiceEvent> servicesAdded() {
78  5 return _serviceAdded;
79    }
80   
 
81  0 toggle public List<ServiceEvent> servicesRemoved() {
82  0 return _serviceRemoved;
83    }
84   
 
85  8 toggle public List<ServiceEvent> servicesResolved() {
86  8 return _serviceResolved;
87    }
88   
 
89  5 toggle public synchronized void reset() {
90  5 _serviceAdded.clear();
91  5 _serviceRemoved.clear();
92  5 _serviceResolved.clear();
93    }
94   
 
95  0 toggle @Override
96    public String toString() {
97  0 StringBuilder aLog = new StringBuilder();
98  0 aLog.append("Services Added: " + _serviceAdded.size());
99  0 for (ServiceEvent event : _serviceAdded) {
100  0 aLog.append("\n\tevent name: '");
101  0 aLog.append(event.getName());
102  0 aLog.append("' type: '");
103  0 aLog.append(event.getType());
104  0 aLog.append("' info: '");
105  0 aLog.append(event.getInfo());
106    }
107  0 aLog.append("\nServices Removed: " + _serviceRemoved.size());
108  0 for (ServiceEvent event : _serviceRemoved) {
109  0 aLog.append("\n\tevent name: '");
110  0 aLog.append(event.getName());
111  0 aLog.append("' type: '");
112  0 aLog.append(event.getType());
113  0 aLog.append("' info: '");
114  0 aLog.append(event.getInfo());
115    }
116  0 aLog.append("\nServices Resolved: " + _serviceResolved.size());
117  0 for (ServiceEvent event : _serviceResolved) {
118  0 aLog.append("\n\tevent name: '");
119  0 aLog.append(event.getName());
120  0 aLog.append("' type: '");
121  0 aLog.append(event.getType());
122  0 aLog.append("' info: '");
123  0 aLog.append(event.getInfo());
124    }
125  0 return aLog.toString();
126    }
127   
128    }
129   
 
130  5 toggle @Before
131    public void setup() {
132  5 boolean log = false;
133  5 if (log) {
134  0 ConsoleHandler handler = new ConsoleHandler();
135  0 handler.setLevel(Level.FINEST);
136  0 for (Enumeration<String> enumerator = LogManager.getLogManager().getLoggerNames(); enumerator.hasMoreElements();) {
137  0 String loggerName = enumerator.nextElement();
138  0 Logger logger = Logger.getLogger(loggerName);
139  0 logger.addHandler(handler);
140  0 logger.setLevel(Level.FINEST);
141    }
142    }
143   
144  5 String text = "Test hypothetical web server";
145  5 Map<String, byte[]> properties = new HashMap<String, byte[]>();
146  5 properties.put(serviceKey, text.getBytes());
147  5 service = ServiceInfo.create("_html._tcp.local.", "apache-someuniqueid", 80, 0, 0, true, properties);
148  5 text = "Test hypothetical print server";
149  5 properties.clear();
150  5 properties.put(serviceKey, text.getBytes());
151  5 printer = ServiceInfo.create("_html._tcp.local.", "printer-someuniqueid", "_printer", 80, 0, 0, true, properties);
152  5 serviceListenerMock = new MockListener();
153    }
154   
 
155  1 toggle @Test
156    public void testListenForTextUpdateOnOtherRegistry() throws IOException, InterruptedException {
157  1 System.out.println("Unit Test: testListenForTextUpdateOnOtherRegistry()");
158  1 JmDNS registry = null;
159  1 JmDNS newServiceRegistry = null;
160  1 try {
161  1 registry = JmDNS.create("Listener");
162  1 registry.addServiceListener(service.getType(), serviceListenerMock);
163    //
164  1 newServiceRegistry = JmDNS.create("Registry");
165  1 newServiceRegistry.registerService(service);
166   
167    // We get the service added event when we register the service. However the service has not been resolved at this point.
168    // The info associated with the event only has the minimum information i.e. name and type.
169  1 List<ServiceEvent> servicesAdded = serviceListenerMock.servicesAdded();
170  1 assertEquals("We did not get the service added event.", 1, servicesAdded.size());
171  1 ServiceInfo info = servicesAdded.get(servicesAdded.size() - 1).getInfo();
172  1 assertEquals("We did not get the right name for the resolved service:", service.getName(), info.getName());
173  1 assertEquals("We did not get the right type for the resolved service:", service.getType(), info.getType());
174    // We get the service added event when we register the service. However the service has not been resolved at this point.
175    // The info associated with the event only has the minimum information i.e. name and type.
176  1 List<ServiceEvent> servicesResolved = serviceListenerMock.servicesResolved();
177  1 assertEquals("We did not get the service resolved event.", 1, servicesResolved.size());
178  1 ServiceInfo result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
179  1 assertNotNull("Did not get the expected service info: ", result);
180  1 assertEquals("Did not get the expected service info: ", service, result);
181  1 assertEquals("Did not get the expected service info text: ", service.getPropertyString(serviceKey), result.getPropertyString(serviceKey));
182   
183  1 serviceListenerMock.reset();
184  1 String text = "Test improbable web server";
185  1 Map<String, byte[]> properties = new HashMap<String, byte[]>();
186  1 properties.put(serviceKey, text.getBytes());
187  1 service.setText(properties);
188  1 Thread.sleep(3000);
189  1 servicesResolved = serviceListenerMock.servicesResolved();
190  1 assertEquals("We did not get the service text updated event.", 1, servicesResolved.size());
191  1 result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
192  1 assertEquals("Did not get the expected service info text: ", text, result.getPropertyString(serviceKey));
193   
194  1 serviceListenerMock.reset();
195  1 text = "Test more improbable web server";
196  1 properties = new HashMap<String, byte[]>();
197  1 properties.put(serviceKey, text.getBytes());
198  1 service.setText(properties);
199  1 Thread.sleep(3000);
200  1 servicesResolved = serviceListenerMock.servicesResolved();
201  1 assertEquals("We did not get the service text updated event.", 1, servicesResolved.size());
202  1 result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
203  1 assertEquals("Did not get the expected service info text: ", text, result.getPropertyString(serviceKey));
204   
205  1 serviceListenerMock.reset();
206  1 text = "Test even more improbable web server";
207  1 properties = new HashMap<String, byte[]>();
208  1 properties.put(serviceKey, text.getBytes());
209  1 service.setText(properties);
210  1 Thread.sleep(3000);
211  1 servicesResolved = serviceListenerMock.servicesResolved();
212  1 assertEquals("We did not get the service text updated event.", 1, servicesResolved.size());
213  1 result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
214  1 assertEquals("Did not get the expected service info text: ", text, result.getPropertyString(serviceKey));
215   
216    } finally {
217  1 if (registry != null) registry.close();
218  1 if (newServiceRegistry != null) newServiceRegistry.close();
219    }
220    }
221   
 
222  1 toggle @Test
223    public void testRegisterEmptyTXTField() throws IOException, InterruptedException {
224  1 System.out.println("Unit Test: testRegisterEmptyTXTField()");
225  1 JmDNS registry = null;
226  1 JmDNS newServiceRegistry = null;
227  1 try {
228  1 registry = JmDNS.create("Listener");
229  1 registry.addServiceListener(service.getType(), serviceListenerMock);
230    //
231  1 newServiceRegistry = JmDNS.create("Registry");
232  1 newServiceRegistry.registerService(service);
233   
234    // We get the service added event when we register the service. However the service has not been resolved at this point.
235    // The info associated with the event only has the minimum information i.e. name and type.
236  1 List<ServiceEvent> servicesAdded = serviceListenerMock.servicesAdded();
237  1 assertEquals("We did not get the service added event.", 1, servicesAdded.size());
238  1 ServiceInfo info = servicesAdded.get(servicesAdded.size() - 1).getInfo();
239  1 assertEquals("We did not get the right name for the resolved service:", service.getName(), info.getName());
240  1 assertEquals("We did not get the right type for the resolved service:", service.getType(), info.getType());
241    // We get the service added event when we register the service. However the service has not been resolved at this point.
242    // The info associated with the event only has the minimum information i.e. name and type.
243  1 List<ServiceEvent> servicesResolved = serviceListenerMock.servicesResolved();
244  1 assertEquals("We did not get the service resolved event.", 1, servicesResolved.size());
245  1 ServiceInfo result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
246  1 assertNotNull("Did not get the expected service info: ", result);
247  1 assertEquals("Did not get the expected service info: ", service, result);
248  1 assertEquals("Did not get the expected service info text: ", service.getPropertyString(serviceKey), result.getPropertyString(serviceKey));
249   
250  1 serviceListenerMock.reset();
251  1 Map<String, byte[]> properties = new HashMap<String, byte[]>();
252  1 service.setText(properties);
253  1 Thread.sleep(3000);
254  1 servicesResolved = serviceListenerMock.servicesResolved();
255  1 assertEquals("We did not get the service text updated event.", 1, servicesResolved.size());
256  1 result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
257  1 assertNull("Did not get the expected service info text: ", result.getPropertyString(serviceKey));
258    } finally {
259  1 if (registry != null) registry.close();
260  1 if (newServiceRegistry != null) newServiceRegistry.close();
261    }
262    }
263   
 
264  1 toggle @Test
265    public void testRegisterCaseSensitiveField() throws IOException {
266  1 System.out.println("Unit Test: testRegisterCaseSensitiveField()");
267  1 JmDNS registry = null;
268  1 JmDNS newServiceRegistry = null;
269  1 try {
270  1 String text = "Test hypothetical Web Server";
271  1 Map<String, byte[]> properties = new HashMap<String, byte[]>();
272  1 properties.put(serviceKey, text.getBytes());
273  1 service = ServiceInfo.create("_Html._Tcp.local.", "Apache-SomeUniqueId", 80, 0, 0, true, properties);
274   
275  1 registry = JmDNS.create("Listener");
276  1 registry.addServiceListener(service.getType(), serviceListenerMock);
277    //
278  1 newServiceRegistry = JmDNS.create("Registry");
279  1 newServiceRegistry.registerService(service);
280   
281    // We get the service added event when we register the service. However the service has not been resolved at this point.
282    // The info associated with the event only has the minimum information i.e. name and type.
283  1 List<ServiceEvent> servicesAdded = serviceListenerMock.servicesAdded();
284  1 assertEquals("We did not get the service added event.", 1, servicesAdded.size());
285  1 ServiceInfo info = servicesAdded.get(servicesAdded.size() - 1).getInfo();
286  1 assertEquals("We did not get the right name for the resolved service:", service.getName(), info.getName());
287  1 assertEquals("We did not get the right type for the resolved service:", service.getType(), info.getType());
288    // We get the service added event when we register the service. However the service has not been resolved at this point.
289    // The info associated with the event only has the minimum information i.e. name and type.
290  1 List<ServiceEvent> servicesResolved = serviceListenerMock.servicesResolved();
291  1 assertEquals("We did not get the service resolved event.", 1, servicesResolved.size());
292  1 ServiceInfo result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
293  1 assertNotNull("Did not get the expected service info: ", result);
294  1 assertEquals("Did not get the expected service info: ", service, result);
295  1 assertEquals("Did not get the expected service info text: ", service.getPropertyString(serviceKey), result.getPropertyString(serviceKey));
296   
297  1 ServiceInfo[] infos = registry.list(service.getType());
298  1 assertEquals("We did not get the right list of service info.", 1, infos.length);
299  1 assertEquals("Did not get the expected service info: ", service, infos[0]);
300  1 assertEquals("Did not get the expected service info text: ", service.getPropertyString(serviceKey), infos[0].getPropertyString(serviceKey));
301   
302  1 infos = registry.list(service.getType().toLowerCase());
303  1 assertEquals("We did not get the right list of service info.", 1, infos.length);
304  1 assertEquals("Did not get the expected service info: ", service, infos[0]);
305  1 assertEquals("Did not get the expected service info text: ", service.getPropertyString(serviceKey), infos[0].getPropertyString(serviceKey));
306   
307    } finally {
308  1 if (registry != null) registry.close();
309  1 if (newServiceRegistry != null) newServiceRegistry.close();
310    }
311    }
312   
 
313  1 toggle @Test
314    public void testRenewExpiringRequests() throws IOException, InterruptedException {
315  1 System.out.println("Unit Test: testRenewExpiringRequests()");
316  1 JmDNS registry = null;
317  1 JmDNS newServiceRegistry = null;
318  1 try {
319   
320    // To test for expiring TTL
321  1 DNSStateTask.setDefaultTTL(1 * 60);
322   
323  1 registry = JmDNS.create("Listener");
324  1 registry.addServiceListener(service.getType(), serviceListenerMock);
325    //
326  1 newServiceRegistry = JmDNS.create("Registry");
327  1 newServiceRegistry.registerService(service);
328   
329  1 List<ServiceEvent> servicesAdded = serviceListenerMock.servicesAdded();
330  1 assertTrue("We did not get the service added event.", servicesAdded.size() == 1);
331   
332  1 ServiceInfo[] services = registry.list(service.getType());
333  1 assertEquals("We should see the service we just registered: ", 1, services.length);
334  1 assertEquals(service, services[0]);
335   
336    // wait for the TTL
337  1 Thread.sleep(2 * 60 * 1000);
338   
339  1 services = registry.list(service.getType());
340  1 assertEquals("We should see the service after the renewal: ", 1, services.length);
341  1 assertEquals(service, services[0]);
342   
343    } finally {
344  1 if (registry != null) registry.close();
345  1 if (newServiceRegistry != null) newServiceRegistry.close();
346  1 DNSStateTask.setDefaultTTL(DNSConstants.DNS_TTL);
347    }
348    }
349   
 
350  1 toggle @Test
351    public void testSubtype() throws IOException {
352  1 System.out.println("Unit Test: testSubtype()");
353  1 JmDNS registry = null;
354  1 JmDNS newServiceRegistry = null;
355  1 try {
356  1 registry = JmDNS.create("Listener");
357  1 registry.addServiceListener(service.getType(), serviceListenerMock);
358    //
359  1 newServiceRegistry = JmDNS.create("Registry");
360  1 newServiceRegistry.registerService(printer);
361   
362    // We get the service added event when we register the service. However the service has not been resolved at this point.
363    // The info associated with the event only has the minimum information i.e. name and type.
364  1 List<ServiceEvent> servicesAdded = serviceListenerMock.servicesAdded();
365  1 assertEquals("We did not get the service added event.", 1, servicesAdded.size());
366  1 ServiceInfo info = servicesAdded.get(servicesAdded.size() - 1).getInfo();
367  1 assertEquals("We did not get the right name for the resolved service:", printer.getName(), info.getName());
368  1 assertEquals("We did not get the right type for the resolved service:", printer.getType(), info.getType());
369    // We get the service added event when we register the service. However the service has not been resolved at this point.
370    // The info associated with the event only has the minimum information i.e. name and type.
371  1 List<ServiceEvent> servicesResolved = serviceListenerMock.servicesResolved();
372  1 assertEquals("We did not get the service resolved event.", 1, servicesResolved.size());
373  1 ServiceInfo result = servicesResolved.get(servicesResolved.size() - 1).getInfo();
374  1 assertNotNull("Did not get the expected service info: ", result);
375  1 assertEquals("Did not get the expected service info: ", printer, result);
376  1 assertEquals("Did not get the expected service info subtype: ", printer.getSubtype(), result.getSubtype());
377  1 assertEquals("Did not get the expected service info text: ", printer.getPropertyString(serviceKey), result.getPropertyString(serviceKey));
378  1 serviceListenerMock.reset();
379    } finally {
380  1 if (registry != null) registry.close();
381  1 if (newServiceRegistry != null) newServiceRegistry.close();
382    }
383   
384    }
385   
386    }