/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.agent; import java.util.Properties; import org.testng.annotations.Test; import org.jboss.remoting.InvokerLocator; import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants; import org.rhq.enterprise.communications.ServiceContainerMetricsMBean; import org.rhq.enterprise.communications.command.client.ClientCommandSenderMetrics; import org.rhq.enterprise.communications.command.impl.identify.IdentifyCommand; import org.rhq.enterprise.communications.command.impl.identify.IdentifyCommandResponse; import org.rhq.enterprise.communications.command.server.discovery.AutoDiscoveryListener; /** * This tests the communications layer in the agent. * * @author John Mazzitelli */ @Test(groups = "agent.comm") public class AgentComm4Test extends AgentCommTestBase { private static final boolean ENABLE_TESTS = true; /** * Starts and immediately stops the agents - showing that you can have more than one agent running on the box at any * one time. * * @throws Exception */ @Test(enabled = ENABLE_TESTS) public void testAgentStartStop() throws Exception { AgentMain agent1 = m_agent1Test.createAgent(true); AgentMain agent2 = m_agent2Test.createAgent(true); assert agent1.isStarted() : "agent1 should have been started"; assert agent2.isStarted() : "agent2 should have been started"; agent1.shutdown(); agent2.shutdown(); assert !agent1.isStarted() : "agent1 should have been shutdown"; assert !agent2.isStarted() : "agent2 should have been shutdown"; return; } /** * Checks that you can override configuration properties. * * @throws Exception */ @Test(enabled = ENABLE_TESTS) public void testAgentConfigurationOverride() throws Exception { Properties props1 = new Properties(); setServerLocatorUriProperties(props1, "socket", "127.0.0.1", 22345, null); props1.setProperty(ServiceContainerConfigurationConstants.CONNECTOR_BIND_PORT, AGENT1_SERVER_BIND_PORT); m_agent1Test.setConfigurationOverrides(props1); Properties props2 = new Properties(); setServerLocatorUriProperties(props2, "socket", "127.0.0.1", 12345, null); props2.setProperty(ServiceContainerConfigurationConstants.CONNECTOR_BIND_PORT, AGENT2_SERVER_BIND_PORT); m_agent2Test.setConfigurationOverrides(props2); AgentMain agent1 = m_agent1Test.createAgent(true); AgentMain agent2 = m_agent2Test.createAgent(true); assert agent1.isStarted() : "agent1 should have been started"; assert agent2.isStarted() : "agent2 should have been started"; assert agent1.getServiceContainer().getConfiguration().getConnectorBindPort() == Integer.parseInt(AGENT1_SERVER_BIND_PORT); assert agent2.getServiceContainer().getConfiguration().getConnectorBindPort() == Integer.parseInt(AGENT2_SERVER_BIND_PORT); agent1.shutdown(); agent2.shutdown(); assert !agent1.isStarted() : "agent1 should have been shutdown"; assert !agent2.isStarted() : "agent2 should have been shutdown"; return; } /** * Sends a message from one remote server to another. * * @throws Exception */ @Test(enabled = ENABLE_TESTS) public void testSendMessage() throws Exception { AgentMain agent1 = m_agent1Test.createAgent(true); AgentMain agent2 = m_agent2Test.createAgent(true); IdentifyCommand command = new IdentifyCommand(); IdentifyCommandResponse response; response = (IdentifyCommandResponse) agent1.getClientCommandSender().sendSynch(command); assert response.isSuccessful() : "Failed to send command from agent1 to agent2"; assert new InvokerLocator(response.getIdentification().getInvokerLocator()).getPort() == agent2 .getServiceContainer().getConfiguration().getConnectorBindPort() : "Didn't get the identify of agent2 - what remoting server did we just communicate with??"; response = (IdentifyCommandResponse) agent2.getClientCommandSender().sendSynch(command); assert response.isSuccessful() : "Failed to send command from agent2 to agent1"; assert new InvokerLocator(response.getIdentification().getInvokerLocator()).getPort() == agent1 .getServiceContainer().getConfiguration().getConnectorBindPort() : "Didn't get the identity of agent1 - what remoting server did we just communicate with??"; return; } /** * Sends messages from one remote server to another and makes sure the metrics are collected properly. * * @throws Exception */ @Test(enabled = ENABLE_TESTS) public void testMetrics() throws Exception { AgentMain agent1 = m_agent1Test.createAgent(true); AgentMain agent2 = m_agent2Test.createAgent(true); Thread.sleep(2000); // let's wait for the senders to start and send the connectAgent messages (which will fail) ServiceContainerMetricsMBean server_metrics1 = m_agent1Test.getServerMetrics(); ServiceContainerMetricsMBean server_metrics2 = m_agent2Test.getServerMetrics(); ClientCommandSenderMetrics client_metrics1 = m_agent1Test.getClientMetrics(); ClientCommandSenderMetrics client_metrics2 = m_agent2Test.getClientMetrics(); assert client_metrics1.getNumberSuccessfulCommandsSent() == 0; assert client_metrics1.getNumberFailedCommandsSent() == 0; assert client_metrics2.getNumberSuccessfulCommandsSent() == 0; assert client_metrics2.getNumberFailedCommandsSent() == 0; assert client_metrics2.getAverageExecutionTimeSent() == 0; assert server_metrics1.getNumberSuccessfulCommandsReceived() == 0; assert server_metrics1.getNumberFailedCommandsReceived() == 0; assert server_metrics1.getNumberTotalCommandsReceived() == 0; assert server_metrics2.getNumberSuccessfulCommandsReceived() == 0; assert server_metrics2.getNumberFailedCommandsReceived() == 0; assert server_metrics2.getNumberTotalCommandsReceived() == 0; assert server_metrics2.getAverageExecutionTimeReceived() == 0; IdentifyCommand command = new IdentifyCommand(); IdentifyCommandResponse response; response = (IdentifyCommandResponse) agent1.getClientCommandSender().sendSynch(command); assert response.isSuccessful() : "Failed to send command from agent1 to agent2"; assert new InvokerLocator(response.getIdentification().getInvokerLocator()).getPort() == agent2 .getServiceContainer().getConfiguration().getConnectorBindPort() : "Didn't get the identify of agent2 - what remoting server did we just communicate with??"; assert client_metrics1.getNumberSuccessfulCommandsSent() == 1; assert client_metrics1.getNumberFailedCommandsSent() == 0; assert client_metrics2.getNumberSuccessfulCommandsSent() == 0; assert client_metrics2.getNumberFailedCommandsSent() == 0; assert server_metrics1.getNumberSuccessfulCommandsReceived() == 0; assert server_metrics1.getNumberFailedCommandsReceived() == 0; assert server_metrics1.getNumberTotalCommandsReceived() == 0; assert server_metrics2.getNumberSuccessfulCommandsReceived() == 1; assert server_metrics2.getNumberFailedCommandsReceived() == 0; assert server_metrics2.getNumberTotalCommandsReceived() == 1; response = (IdentifyCommandResponse) agent1.getClientCommandSender().sendSynch(command); assert response.isSuccessful() : "Failed to send command from agent1 to agent2"; assert client_metrics1.getNumberSuccessfulCommandsSent() == 2; assert client_metrics1.getNumberFailedCommandsSent() == 0; assert client_metrics2.getNumberSuccessfulCommandsSent() == 0; assert client_metrics2.getNumberFailedCommandsSent() == 0; assert server_metrics1.getNumberSuccessfulCommandsReceived() == 0; assert server_metrics1.getNumberFailedCommandsReceived() == 0; assert server_metrics1.getNumberTotalCommandsReceived() == 0; assert server_metrics2.getNumberSuccessfulCommandsReceived() == 2; assert server_metrics2.getNumberFailedCommandsReceived() == 0; assert server_metrics2.getNumberTotalCommandsReceived() == 2; response = (IdentifyCommandResponse) agent2.getClientCommandSender().sendSynch(command); assert response.isSuccessful() : "Failed to send command from agent2 to agent1"; assert new InvokerLocator(response.getIdentification().getInvokerLocator()).getPort() == agent1 .getServiceContainer().getConfiguration().getConnectorBindPort() : "Didn't get the identity of agent1 - what remoting server did we just communicate with??"; assert client_metrics1.getNumberSuccessfulCommandsSent() == 2; assert client_metrics1.getNumberFailedCommandsSent() == 0; assert client_metrics2.getNumberSuccessfulCommandsSent() == 1; assert client_metrics2.getNumberFailedCommandsSent() == 0; assert server_metrics1.getNumberSuccessfulCommandsReceived() == 1; assert server_metrics1.getNumberFailedCommandsReceived() == 0; assert server_metrics1.getNumberTotalCommandsReceived() == 1; assert server_metrics2.getNumberSuccessfulCommandsReceived() == 2; assert server_metrics2.getNumberFailedCommandsReceived() == 0; assert server_metrics2.getNumberTotalCommandsReceived() == 2; response = (IdentifyCommandResponse) agent2.getClientCommandSender().sendSynch(command); assert response.isSuccessful() : "Failed to send command from agent2 to agent1"; assert client_metrics1.getNumberSuccessfulCommandsSent() == 2; assert client_metrics1.getNumberFailedCommandsSent() == 0; assert client_metrics2.getNumberSuccessfulCommandsSent() == 2; assert client_metrics2.getNumberFailedCommandsSent() == 0; assert server_metrics1.getNumberSuccessfulCommandsReceived() == 2; assert server_metrics1.getNumberFailedCommandsReceived() == 0; assert server_metrics1.getNumberTotalCommandsReceived() == 2; assert server_metrics2.getNumberSuccessfulCommandsReceived() == 2; assert server_metrics2.getNumberFailedCommandsReceived() == 0; assert server_metrics2.getNumberTotalCommandsReceived() == 2; return; } /** * Tests auto-discovery listeners. * * @throws Exception */ @Test(enabled = false) // WHY DOES THIS ALWAYS FAIL? public void testAutoDiscoveryListeners() throws Exception { System.out.println("testAutoDiscoveryListeners - WHY DOES THIS PERIODICALLY FAIL?"); Properties props1 = new Properties(); props1.setProperty(AgentConfigurationConstants.SERVER_AUTO_DETECTION, "true"); props1.setProperty(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, "-1"); Properties props2 = new Properties(); props2.setProperty(AgentConfigurationConstants.SERVER_AUTO_DETECTION, "false"); props2.setProperty(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, "-1"); m_agent1Test.setConfigurationOverrides(props1); m_agent2Test.setConfigurationOverrides(props2); AgentMain agent1 = m_agent1Test.createAgent(false); agent1.start(); agent1.getClientCommandSender().getRemoteCommunicator().setInitializeCallback(null); final Boolean[] online = new Boolean[] { null }; agent1.getServiceContainer().addDiscoveryListener(new AutoDiscoveryListener() { public void serverOnline(InvokerLocator locator) { online[0] = Boolean.TRUE; } public void serverOffline(InvokerLocator locator) { online[0] = Boolean.FALSE; } }); AgentMain agent2 = null; try { // now start agent2 which creates the remoting server that agent1 should auto-detect agent2 = m_agent2Test.createAgent(true); for (int i = 0; (i < 20) && (online[0] == null); i++) { Thread.sleep(1000L); } assert online[0].booleanValue() : "The server running in agent2 was never auto-discovered by agent1"; // now shutdown agent2 and see that we auto-discovery it going down agent2.shutdown(); for (int i = 0; (i < 20) && (online[0].booleanValue()); i++) { Thread.sleep(1000L); } assert !online[0].booleanValue() : "The server running in agent2 went down but that was not auto-detected by agent1"; } finally { if (agent1 != null) { agent1.shutdown(); } if (agent2 != null) { agent2.shutdown(); } } return; } /** * Tests auto-discovery. * * @throws Exception */ @Test(enabled = false) public void testAutoDiscovery() throws Exception { /* Disabled until we work out the issues of running multicast on the hudson server. jdobies, Feb 2, 2010 */ Properties props1 = new Properties(); props1.setProperty(AgentConfigurationConstants.SERVER_AUTO_DETECTION, "true"); props1.setProperty(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, "-1"); Properties props2 = new Properties(); props2.setProperty(AgentConfigurationConstants.SERVER_AUTO_DETECTION, "false"); props2.setProperty(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, "-1"); m_agent1Test.setConfigurationOverrides(props1); m_agent2Test.setConfigurationOverrides(props2); AgentMain agent1 = m_agent1Test.createAgent(false); agent1.start(); agent1.getClientCommandSender().getRemoteCommunicator().setInitializeCallback(null); AgentMain agent2 = null; try { assert !agent1.getClientCommandSender().isSending() : "Should not be in sending mode yet"; // now start agent2 which creates the remoting server that agent1 should auto-detect agent2 = m_agent2Test.createAgent(true); // our canary-in-the-mine is the sending mode - when auto-discovery works, the sender goes into sending mode boolean discovered = false; for (int i = 0; (i < 20) && !discovered; i++) { Thread.sleep(1000L); discovered = agent1.getClientCommandSender().isSending(); } assert discovered : "The server running in agent2 was never auto-discovered by agent1"; // now shutdown agent2 and see that we auto-discovery it going down agent2.shutdown(); boolean gone_down = false; for (int i = 0; (i < 20) && !gone_down; i++) { Thread.sleep(1000L); gone_down = !agent1.getClientCommandSender().isSending(); } assert gone_down : "The server running in agent2 went down but that was not auto-detected by agent1"; } finally { if (agent1 != null) { agent1.shutdown(); } if (agent2 != null) { agent2.shutdown(); } } return; } /** * Tests server polling (which is like auto-discovery). * * @throws Exception */ @Test(enabled = ENABLE_TESTS) public void testServerPolling() throws Exception { Properties props1 = new Properties(); props1.setProperty(AgentConfigurationConstants.SERVER_AUTO_DETECTION, "false"); props1.setProperty(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, "1000"); Properties props2 = new Properties(); props2.setProperty(AgentConfigurationConstants.SERVER_AUTO_DETECTION, "false"); props2.setProperty(AgentConfigurationConstants.CLIENT_SENDER_SERVER_POLLING_INTERVAL, "-1"); m_agent1Test.setConfigurationOverrides(props1); m_agent2Test.setConfigurationOverrides(props2); AgentMain agent1 = m_agent1Test.createAgent(false); agent1.start(); agent1.getClientCommandSender().getRemoteCommunicator().setInitializeCallback(null); AgentMain agent2 = null; try { assert !agent1.getClientCommandSender().isSending() : "Should not be in sending mode yet"; // now start agent2 which creates the remoting server that agent1 should auto-detect agent2 = m_agent2Test.createAgent(true); // our canary-in-the-mine is the sending mode - when server polling detects the server, the sender goes into sending mode boolean discovered = false; for (int i = 0; (i < 5) && !discovered; i++) { Thread.sleep(1000L); discovered = agent1.getClientCommandSender().isSending(); } assert discovered : "The server running in agent2 was never detected by agent1's server polling"; // now shutdown agent2 and see that we discover it going down via server polling agent2.shutdown(); boolean gone_down = false; for (int i = 0; (i < 60) && !gone_down; i++) { Thread.sleep(1000L); gone_down = !agent1.getClientCommandSender().isSending(); } assert gone_down : "The server running in agent2 went down but that was not detected by agent1's server polling"; } finally { if (agent1 != null) { agent1.shutdown(); } if (agent2 != null) { agent2.shutdown(); } } return; } }