package org.jolokia.discovery; import java.io.IOException; import java.net.SocketException; import java.net.URL; import java.util.List; import java.util.UUID; import org.jolokia.Version; import org.jolokia.restrictor.AllowAllRestrictor; import org.jolokia.util.LogHandler; import org.jolokia.util.NetworkUtil; import org.json.simple.JSONObject; import org.testng.SkipException; import org.testng.annotations.Test; import static org.jolokia.discovery.AbstractDiscoveryMessage.MessageType.QUERY; import static org.jolokia.discovery.MulticastUtil.sendQueryAndCollectAnswers; import static org.testng.Assert.*; /** * @author roland * @since 27.01.14 */ public class MulticastSocketListenerThreadTest { public static final String JOLOKIA_URL = "http://localhost:8080/jolokia"; private URL url; private String id; private MulticastSocketListenerThread startSocketListener() throws IOException, InterruptedException { url = new URL(JOLOKIA_URL); id = UUID.randomUUID().toString(); final AgentDetails details = new AgentDetails(id); details.setUrl(JOLOKIA_URL); details.setSecured(false); details.setServerInfo("jolokia", "jolokia-test", "1.0"); MulticastSocketListenerThread listenerThread = new MulticastSocketListenerThread(null, getAgentDetailsHolder(details), new AllowAllRestrictor(), new LogHandler.StdoutLogHandler(true)); listenerThread.start(); Thread.sleep(500); return listenerThread; } private AgentDetailsHolder getAgentDetailsHolder(final AgentDetails pDetails) { return new AgentDetailsHolder() { public AgentDetails getAgentDetails() { return pDetails; } }; } @Test public void simple() throws IOException, InterruptedException { checkForMulticastSupport(); MulticastSocketListenerThread listenerThread = startSocketListener(); try { DiscoveryOutgoingMessage out = new DiscoveryOutgoingMessage.Builder(QUERY) .agentId(UUID.randomUUID().toString()) .build(); List<DiscoveryIncomingMessage> discovered = sendQueryAndCollectAnswers(out, 500, new LogHandler.StdoutLogHandler(true)); int idCount = 0; int urlCount = 0; for (DiscoveryIncomingMessage in : discovered) { AgentDetails agentDetails = in.getAgentDetails(); if (agentDetails.getAgentId().equals(id)) { idCount++; } if (JOLOKIA_URL.equals(in.getAgentDetails().toJSONObject().get("url"))) { urlCount++; } assertFalse(in.isQuery()); JSONObject details = agentDetails.toJSONObject(); if (details.get("server_vendor") != null && details.get("server_vendor").equals("jolokia")) { assertEquals(details.get("url"), JOLOKIA_URL); assertEquals(details.get("agent_version"), Version.getAgentVersion()); return; } } assertEquals(idCount,1,"Exactly one in message with the send id should have been received"); assertEquals(urlCount,1,"Only one message with the url should be included"); fail("No message found"); } finally { listenerThread.shutdown(); } } private void checkForMulticastSupport() throws SocketException { if (!NetworkUtil.isMulticastSupported()) { throw new SkipException("No multicast supported"); } } }