/* * 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.io.File; import java.io.FileOutputStream; import java.util.Iterator; import java.util.Map; import java.util.Properties; import org.testng.IInvokedMethod; import org.testng.IInvokedMethodListener; import org.testng.ITestResult; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.rhq.enterprise.communications.ServiceContainerConfiguration; import org.rhq.enterprise.communications.ServiceContainerConfigurationConstants; import org.rhq.enterprise.communications.util.SecurityUtil; /** * Base class used by the tests of communications layer in the agent. * * @author John Mazzitelli */ public class AgentCommTestBase implements IInvokedMethodListener { protected static final int LARGE_STRING_SIZE = 100000; protected static final String LARGE_STRING; protected static final byte[] LARGE_STRING_BYTES; protected static final String AGENT1_SERVER_BIND_PORT = System.getProperty("agent1.server.bind-port", "11111"); protected static final String AGENT2_SERVER_BIND_PORT = System.getProperty("agent2.server.bind-port", "22222"); protected static final String AGENT1_COMM_CONNECTOR_BIND_PORT = System.getProperty( "agent1.communications.connector.bind-port", "11111"); protected static final String AGENT2_COMM_CONNECTOR_BIND_PORT = System.getProperty( "agent2.communications.connector.bind-port", "22222"); protected static final String AGENT1_COMM_MULTICAST_DECTECTOR_PORT = System.getProperty( "agent1.communications.multicast-detector.port", "17777"); protected static final String AGENT2_COMM_MULTICAST_DECTECTOR_PORT = System.getProperty( "agent2.communications.multicast-detector.port", "18888"); static { StringBuffer stream_data_buf = new StringBuffer(LARGE_STRING_SIZE); for (int i = 0; i < LARGE_STRING_SIZE; i += 10) { stream_data_buf.append(".123456789"); } LARGE_STRING = stream_data_buf.toString(); LARGE_STRING_BYTES = LARGE_STRING.getBytes(); } protected File m_veryLargeFile = null; protected AgentTestClass m_agent1Test; protected AgentTestClass m_agent2Test; @Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println("before " + getTestMethod(method)); } @Override public void afterInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println("after " + getTestMethod(method)); } private String getTestMethod(IInvokedMethod method) { return method.getTestMethod().getTestClass().getName() + "." + method.getTestMethod().getMethodName(); } /** * Creates new agent test classes. * * @throws Exception */ @BeforeMethod public void setUp() throws Exception { m_agent1Test = new AgentTestClass(); String agent1CfgFile = System.getProperty("agent1.cfg.file", "test-agent-configuration.xml"); m_agent1Test.setConfigurationFile(agent1CfgFile, "test"); m_agent2Test = new AgentTestClass(); String agent2CfgFile = System.getProperty("agent2.cfg.file", "test-agent2-configuration.xml"); m_agent2Test.setConfigurationFile(agent2CfgFile, "test2"); // make sure we create keystore files - some tests needs both existing at the same time as soon as they begin File keystore_file1 = new File("target/testdata/keystore.dat"); if (!keystore_file1.exists()) { keystore_file1.getParentFile().mkdirs(); m_agent1Test.createAgent(false); AgentConfiguration agent_config1 = m_agent1Test.getAgent().getConfiguration(); ServiceContainerConfiguration server_config1 = agent_config1.getServiceContainerPreferences(); SecurityUtil.createKeyStore(server_config1.getConnectorSecurityKeystoreFile(), server_config1 .getConnectorSecurityKeystoreAlias(), "CN=RHQ, OU=RedHat, O=redhat.com, C=US", server_config1 .getConnectorSecurityKeystorePassword(), server_config1.getConnectorSecurityKeystoreKeyPassword(), "DSA", 36500); } File keystore_file2 = new File("target/testdata2/keystore.dat"); if (!keystore_file2.exists()) { keystore_file2.getParentFile().mkdirs(); m_agent2Test.createAgent(false); AgentConfiguration agent_config2 = m_agent2Test.getAgent().getConfiguration(); ServiceContainerConfiguration server_config2 = agent_config2.getServiceContainerPreferences(); SecurityUtil.createKeyStore(server_config2.getConnectorSecurityKeystoreFile(), server_config2 .getConnectorSecurityKeystoreAlias(), "CN=RHQ, OU=RedHat, O=redhat.com, C=US", server_config2 .getConnectorSecurityKeystorePassword(), server_config2.getConnectorSecurityKeystoreKeyPassword(), "DSA", 36500); } } /** * Ensures any agent that was started is shutdown and all configuration is cleared so as not to retain overridden * preferences left over by the tests. */ @AfterMethod public void tearDown() { if (m_agent1Test != null) { AgentMain agent = m_agent1Test.getAgent(); if (agent != null) { agent.shutdown(); m_agent1Test.clearAgentConfiguration(); m_agent1Test.cleanUpFiles(); } } if (m_agent2Test != null) { AgentMain agent = m_agent2Test.getAgent(); if (agent != null) { agent.shutdown(); m_agent2Test.clearAgentConfiguration(); m_agent2Test.cleanUpFiles(); } } // Because overrides (-D arguments to AgentMain) also set System properties, you can't run multiple agents in a single VM // when you override arguments that are NOT to be the same on all agents in the VM (like bind port). You can override // things like queue size and other params that can be the same across all agents in the VM. // Here, I just clear all system properties that any test might have set so we don't run into this problem. Properties sysprops = System.getProperties(); Properties to_remove = new Properties(); for (Iterator iter = sysprops.entrySet().iterator(); iter.hasNext();) { Map.Entry entry = (Map.Entry) iter.next(); if (((String) entry.getKey()).startsWith(ServiceContainerConfigurationConstants.PROPERTY_NAME_PREFIX) || ((String) entry.getKey()).startsWith(AgentConfigurationConstants.PROPERTY_NAME_PREFIX)) { to_remove.put(entry.getKey(), entry.getValue()); } } for (Iterator iter = to_remove.keySet().iterator(); iter.hasNext();) { System.getProperties().remove(iter.next()); } return; } /** * Cleans up after all the tests in this class have executed. */ @AfterClass public void cleanUp() { if (m_veryLargeFile != null) { m_veryLargeFile.delete(); } } /** * This will set the appropriate properties in <code>props</code> to define the server locator URI. * * @param props * @param transport * @param addr * @param port * @param transport_params */ protected void setServerLocatorUriProperties(Properties props, String transport, String addr, int port, String transport_params) { props.setProperty(AgentConfigurationConstants.SERVER_TRANSPORT, transport); props.setProperty(AgentConfigurationConstants.SERVER_BIND_ADDRESS, addr); props.setProperty(AgentConfigurationConstants.SERVER_BIND_PORT, Integer.toString(port)); if (transport_params != null) { props.setProperty(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, transport_params); } } /** * This will set the appropriate properties in <code>props</code> to define the server locator URI. * * @param props * @param transport * @param addr * @param port * @param transport_params */ protected void setServerLocatorUriProperties(Properties props, String transport, String addr, String port, String transport_params) { props.setProperty(AgentConfigurationConstants.SERVER_TRANSPORT, transport); props.setProperty(AgentConfigurationConstants.SERVER_BIND_ADDRESS, addr); props.setProperty(AgentConfigurationConstants.SERVER_BIND_PORT, port); if (transport_params != null) { props.setProperty(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, transport_params); } } /** * Creates a very large file that we can use for testing streaming of large data. * * @return the file * * @throws Exception */ protected File createVeryLargeFile() throws Exception { if (m_veryLargeFile == null) { File file = File.createTempFile("agent-comm-test-large-file", null); FileOutputStream o = new FileOutputStream(file); // creates a 1MB file for (int i = 0; i < 1000000; i++) { o.write("123456789\n".getBytes()); } o.close(); m_veryLargeFile = file; } return m_veryLargeFile; } }