/* * RHQ Management Platform * Copyright (C) 2005-2011 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.server.sync.test; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.fail; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jmock.Expectations; import org.testng.annotations.Test; import org.rhq.core.domain.plugin.Plugin; import org.rhq.core.domain.plugin.PluginStatusType; import org.rhq.enterprise.server.resource.metadata.PluginManagerLocal; import org.rhq.enterprise.server.sync.ExportReader; import org.rhq.enterprise.server.sync.ExportWriter; import org.rhq.enterprise.server.sync.validators.DeployedAgentPluginsValidator; import org.rhq.enterprise.server.sync.validators.InconsistentStateException; import org.rhq.test.JMockTest; /** * * * @author Lukas Krejci */ //@Test - switching this off for now because this validator is no longer used in any //of the default synchronizers public class DeployedAgentPluginsValidatorTest extends JMockTest { private static final Log LOG = LogFactory.getLog(DeployedAgentPluginsValidator.class); public void testCanExportAndImportState() throws Exception { final PluginManagerLocal pluginManager = context.mock(PluginManagerLocal.class); final DeployedAgentPluginsValidator validator = new DeployedAgentPluginsValidator(pluginManager); context.checking(new Expectations() { { oneOf(pluginManager).getInstalledPlugins(); will(returnValue(new ArrayList<Plugin>(getDeployedPlugins()))); } }); validator.initialize(null, null); StringWriter output = new StringWriter(); try { XMLOutputFactory ofactory = XMLOutputFactory.newInstance(); XMLStreamWriter wrt = ofactory.createXMLStreamWriter(output); //wrap the exported plugins in "something" so that we produce //a valid xml wrt.writeStartDocument(); wrt.writeStartElement("root"); validator.exportState(new ExportWriter(wrt)); wrt.writeEndDocument(); wrt.close(); StringReader input = new StringReader(output.toString()); try { XMLInputFactory ifactory = XMLInputFactory.newInstance(); XMLStreamReader rdr = ifactory.createXMLStreamReader(input); //push the reader to the start of the plugin elements //this is what is expected by the validators rdr.nextTag(); validator.initializeExportedStateValidation(new ExportReader(rdr)); rdr.close(); assertEquals(validator.getPluginsToValidate(), getDeployedPlugins()); } finally { input.close(); } } catch (Exception e) { LOG.error("Test failed. Output generated so far:\n" + output, e); throw e; } finally { output.close(); } } public void testDetectsPluginDifferencies() { final PluginManagerLocal pluginManager = context.mock(PluginManagerLocal.class); //this is what we are going to return from the mocked plugin manager final List<Plugin> installedPlugins = new ArrayList<Plugin>(getDeployedPlugins()); context.checking(new Expectations() { { allowing(pluginManager).getInstalledPlugins(); will(returnValue(installedPlugins)); } }); DeployedAgentPluginsValidator validator = new DeployedAgentPluginsValidator(pluginManager); Set<DeployedAgentPluginsValidator.ConsistentPlugin> pluginsToValidate = getDeployedPlugins(); validator.initialize(null, null); validator.setPluginsToValidate(pluginsToValidate); //this should validate cleanly validator.validateExportedState(); //now add 1 plugin to the validated state DeployedAgentPluginsValidator.ConsistentPlugin newPlugin = createPlugin("superfluous", "1", "md5_4"); pluginsToValidate.add(newPlugin); try { validator.validateExportedState(); fail("validation should have detected that the current installation has one plugin less."); } catch (InconsistentStateException e) { //this is expected } //ok, remove the new plugin from the "exported state" and put it in the current state pluginsToValidate.remove(newPlugin); installedPlugins.add(newPlugin); try { validator.validateExportedState(); fail("validation should have detected that the current installation has one plugin more."); } catch (InconsistentStateException e) { //ok } //make the current state and exported state be in sync again DeployedAgentPluginsValidator.ConsistentPlugin newPluginCopy = new DeployedAgentPluginsValidator.ConsistentPlugin(newPlugin); pluginsToValidate.add(newPluginCopy); //change the newPlugin to not be equal newPlugin.setMd5("md5_different"); try { validator.validateExportedState(); fail("validation should have failed because one of the plugins differs between current and exported states."); } catch (InconsistentStateException e) { //ok } newPlugin.setMd5(newPluginCopy.getMd5()); newPluginCopy.setMd5("md5_different"); try { validator.validateExportedState(); fail("validation should have failed because one of the plugins differs between current and exported states."); } catch (InconsistentStateException e) { //ok } } public void testAllValidatorsEqual() { PluginManagerLocal pluginManager = context.mock(PluginManagerLocal.class); DeployedAgentPluginsValidator v1 = new DeployedAgentPluginsValidator(pluginManager); DeployedAgentPluginsValidator v2 = new DeployedAgentPluginsValidator(pluginManager); DeployedAgentPluginsValidator v3 = new DeployedAgentPluginsValidator(pluginManager); Object o = new Object(); assertEquals(v1, v2); assertEquals(v1, v3); assertEquals(v2, v3); assertFalse(v1.equals(o)); assertFalse(v2.equals(o)); assertFalse(v3.equals(o)); } private static Set<DeployedAgentPluginsValidator.ConsistentPlugin> getDeployedPlugins() { HashSet<DeployedAgentPluginsValidator.ConsistentPlugin> ret = new HashSet<DeployedAgentPluginsValidator.ConsistentPlugin>(); ret.add(createPlugin("p1", "1", "md5_1")); ret.add(createPlugin("p2", "1", "md5_2")); ret.add(createPlugin("p3", "1", "md5_3")); return ret; } private static DeployedAgentPluginsValidator.ConsistentPlugin createPlugin(String name, String version, String md5) { return new DeployedAgentPluginsValidator.ConsistentPlugin(new Plugin(0, name, null, null, true, PluginStatusType.INSTALLED, null, null, md5, version, null, 0, 0)); } }