/* * RHQ Management Platform * Copyright (C) 2005-2014 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.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.prefs.Preferences; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.events.XMLEvent; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Test the configuration importing and exporting functionality and other things. * * @author Michael Burman */ public class AgentConfigurationTest { private AgentTestClass m_agentTest; /** * Nulls out any previously existing agent test class. */ @BeforeMethod public void setUp() { m_agentTest = null; } /** * 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_agentTest != null) { AgentMain agent = m_agentTest.getAgent(); if (agent != null) { agent.shutdown(); m_agentTest.clearAgentConfiguration(); m_agentTest.cleanUpFiles(); } } return; } /** * Test importing and exporting the config files from agent */ @Test public void testExportAndImport() throws Exception { m_agentTest = new AgentTestClass(); AgentMain agent = m_agentTest.createAgent(true); // Store something Properties props = new Properties(); props.setProperty(AgentConfigurationConstants.CLIENT_SENDER_QUEUE_SIZE, "12345"); m_agentTest.setConfigurationOverrides(props); File testFile = File.createTempFile("config-test", ".xml", new File("target/")); agent.executePromptCommand("config export " + testFile.getAbsolutePath()); agent.executePromptCommand("config import " + testFile.getAbsolutePath()); testFile.deleteOnExit(); } /** * Test importing config file from an old agent which hasn't declared DOCTYPE */ @Test public void testImportWithMissingDoctype() throws Exception { m_agentTest = new AgentTestClass(); AgentMain agent = m_agentTest.createAgent(true); // Store something Properties props = new Properties(); props.setProperty(AgentConfigurationConstants.CLIENT_SENDER_QUEUE_SIZE, "12345"); m_agentTest.setConfigurationOverrides(props); File testFile = File.createTempFile("config-test", ".xml", new File("target/")); testFile.deleteOnExit(); agent.executePromptCommand("config export " + testFile.getAbsolutePath()); File withoutDoctype = removeDoctype(testFile); agent.executePromptCommand("config import " + withoutDoctype.getAbsolutePath()); } /** * Remove DOCTYPE declaration from the XML file * @param fileToProcess * @return * @throws Exception */ private File removeDoctype(File fileToProcess) throws Exception { XMLEventReader eventReader = null; XMLEventWriter eventWriter = null; XMLInputFactory inputFactory = XMLInputFactory.newFactory(); XMLOutputFactory outputFactory = XMLOutputFactory.newFactory(); FileInputStream fis = new FileInputStream(fileToProcess); File output = File.createTempFile("config-test-nodoctype", ".xml", new File("target/")); output.deleteOnExit(); FileOutputStream fos = new FileOutputStream(output); eventReader = inputFactory.createXMLEventReader(fis); eventWriter = outputFactory.createXMLEventWriter(fos); while(eventReader.hasNext()) { XMLEvent xmlEvent = eventReader.nextEvent(); switch(xmlEvent.getEventType()) { case XMLEvent.DTD: // We have DTD declaration, remove it by skipping it break; default: eventWriter.add(xmlEvent); break; } } eventReader.close(); eventWriter.close(); return output; } @Test public void testTransportParams() { Preferences prefs = Preferences.userRoot().node("rhqtest").node("AgentConfigurationTest"); // BZ 1166383 - we need to make sure generalizeSocketException=true gets in the params even if we don't specify it // first make sure its in the default assert (new AgentConfiguration(prefs)).getServerTransportParams().contains("generalizeSocketException=true") : "missing expected param"; // now try all different formats of transport param and make sure the one we want always gets in there prefs.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, "/some/path"); assertTransportParams(prefs, "/some/path/?generalizeSocketException=true"); prefs.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, "/some/path/"); assertTransportParams(prefs, "/some/path/?generalizeSocketException=true"); prefs.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, "/some/path/?foo"); assertTransportParams(prefs, "/some/path/?foo&generalizeSocketException=true"); prefs.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, "/some/path/?foo=false"); assertTransportParams(prefs, "/some/path/?foo=false&generalizeSocketException=true"); prefs.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, "foo=false"); assertTransportParams(prefs, "foo=false&generalizeSocketException=true"); prefs.put(AgentConfigurationConstants.SERVER_TRANSPORT_PARAMS, "foo=false&bar=1"); assertTransportParams(prefs, "foo=false&bar=1&generalizeSocketException=true"); } private void assertTransportParams(Preferences p, String expected) { AgentConfiguration config = new AgentConfiguration(p); String actual = config.getServerTransportParams(); assert actual.equals(expected) : "actual [" + actual + "] != expected [" + expected + "]"; } }