/* * RHQ Management Platform * Copyright (C) 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.core.domain.drift; import static java.util.Arrays.asList; import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR; import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR_VALUECONTEXT; import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR_VALUENAME; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import java.util.List; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertyList; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext; import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode; import org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode; public class DriftDefinitionTest { @Test public void getCompareIgnoreIncludesExcludes() { DriftDefinitionComparator comparator = new DriftDefinitionComparator(CompareMode.ONLY_BASE_INFO); DriftDefinition dc1 = new DriftDefinition(new Configuration()); DriftDefinition dc2 = new DriftDefinition(new Configuration()); // make sure our comparator can deal with all the nulls that are in empty configs assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal " + dc2; dc1.setEnabled(false); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc1.setInterval(1000L); dc1.setDriftHandlingMode(DriftHandlingMode.normal); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc1.setName("the-name"); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.setEnabled(false); dc2.setInterval(1000L); dc2.setDriftHandlingMode(DriftHandlingMode.normal); dc2.setName("the-name"); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal " + dc2; dc1.setEnabled(!dc2.isEnabled()); assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different enabled than " + dc2; dc1.setEnabled(dc2.isEnabled()); // put them back to the same value dc1.setInterval(dc2.getInterval() + 2222L); assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different interval than " + dc2; dc1.setInterval(dc2.getInterval()); // put them back to the same value dc1.setDriftHandlingMode(DriftHandlingMode.plannedChanges); assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different drift handling mode than " + dc2; dc1.setDriftHandlingMode(DriftHandlingMode.normal); // put them back to the same value // change the description of dc1 dc1.setDescription("description 1"); assert comparator.compare(dc1, dc2) > 0 : dc1 + " description is different from dc2's"; // set the descriptions to be the same dc2.setDescription(dc1.getDescription()); assert comparator.compare(dc1, dc2) == 0 : dc1 + " description should equal description of " + dc2; // make dc1 description null dc1.setDescription(null); assert comparator.compare(dc1, dc2) < 0 : dc1 + " description is null and " + dc2 + " description is not null"; // make both dc1 and dc2 descriptions non-null and different dc1.setDescription("description 1"); dc2.setDescription("description 2"); assert comparator.compare(dc1, dc2) < 0 : dc1 + " description is different from description of " + dc2; // make descriptions same again dc1.setDescription(null); dc2.setDescription(null); // make dc1 detached dc1.setAttached(false); assert comparator.compare(dc1, dc2) < 0 : dc1 + " is not attached"; // make dc1 attached and dc2 detached dc1.setAttached(true); dc2.setAttached(false); assert comparator.compare(dc1, dc2) > 0 : dc2 + " is not attached"; // make both dc1 and dc2 detached dc1.setAttached(false); assert comparator.compare(dc1, dc2) == 0 : dc1 + " and " + dc2 + " are both detached"; // Make dc1 pinned dc1.setPinned(true); assert comparator.compare(dc1, dc2) > 0 : dc1 + " is pinned"; // make both dc1 and dc2 pinned dc2.setPinned(true); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should be equal to " + dc2; dc1.setName("zzzzz" + dc2.getName()); assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different name than " + dc2; dc1.setName(dc2.getName()); // put them back to the same value assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal " + dc2; // sanity check - we should be back to equals // add some includes and excludes that are different and test that they are ignored by our comparator dc1.setBasedir(new DriftDefinition.BaseDirectory(BaseDirValueContext.fileSystem, "/foo")); dc2.setBasedir(new DriftDefinition.BaseDirectory(BaseDirValueContext.pluginConfiguration, "blah")); dc1.addInclude(new Filter("ipath1", "ipattern1")); dc2.addInclude(new Filter("ipath2", "ipattern2")); dc1.addExclude(new Filter("epath1", "epattern1")); dc2.addExclude(new Filter("epath2", "epattern2")); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal (ignoring basedir/includes/excludes) " + dc2; // now show that our non-ignoring comparator would detect a different comparator = new DriftDefinitionComparator(CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal (not ignoring basedir/includes/excludes) " + dc2; } @Test public void getCompareBaseInfoAndIncludesExcludes() { DriftDefinitionComparator comparator = new DriftDefinitionComparator( CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); DriftDefinition dc1 = new DriftDefinition(new Configuration()); DriftDefinition dc2 = new DriftDefinition(new Configuration()); dc1.setEnabled(true); dc1.setInterval(1000L); dc1.setDriftHandlingMode(DriftHandlingMode.normal); dc1.setName("the-name"); dc1.setPinned(true); dc2.setEnabled(true); dc2.setInterval(1000L); dc2.setDriftHandlingMode(DriftHandlingMode.normal); dc2.setName("the-name"); dc2.setPinned(true); getCompareBaseInfoAndIncludesExcludes(comparator, dc1, dc2); } @Test public void getCompareOnlyIncludesExcludes() { DriftDefinitionComparator comparator = new DriftDefinitionComparator(CompareMode.ONLY_DIRECTORY_SPECIFICATIONS); DriftDefinition dc1 = new DriftDefinition(new Configuration()); DriftDefinition dc2 = new DriftDefinition(new Configuration()); dc1.setEnabled(false); dc1.setInterval(1111L); dc2.setDriftHandlingMode(DriftHandlingMode.normal); dc1.setName("some-name"); dc2.setEnabled(true); dc2.setInterval(2222L); dc2.setDriftHandlingMode(DriftHandlingMode.plannedChanges); dc2.setName("another-name"); getCompareBaseInfoAndIncludesExcludes(comparator, dc1, dc2); } /** * Used by two main tests - we are to pass in a comparator that compares both base info * and filters (with dc1 and dc2 having the same base info to make sure that data is compared too) * and then we are to pass in a comparator that compares only the filters (with dc1 and * dc2 having different base info to make sure that data is ignored). * * Note that when first called, comparator is assumed to see that dc1 and dc2 are the same. * * @param comparator used to test changes in filters * @param dc1 the initial drift definition1 to test * @param dc2 the initial drift definition2 to test */ private void getCompareBaseInfoAndIncludesExcludes(DriftDefinitionComparator comparator, DriftDefinition dc1, DriftDefinition dc2) { assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal " + dc2; // sanity check dc1.setBasedir(new DriftDefinition.BaseDirectory(BaseDirValueContext.pluginConfiguration, "hello.world")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.setBasedir(new DriftDefinition.BaseDirectory(BaseDirValueContext.pluginConfiguration, "hello.world")); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should now be equal " + dc2; assert comparator.compare(dc2, dc1) == 0 : dc2 + " should now be equal " + dc1; dc1.addInclude(new Filter("ipath1", "ipattern1")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.addInclude(new Filter("ipath1", "ipattern1")); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should now be equal " + dc2; assert comparator.compare(dc2, dc1) == 0 : dc2 + " should now be equal " + dc1; // add a second include to see that we test multiple filters dc1.addInclude(new Filter("ipath2", "ipattern2")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.addInclude(new Filter("ipath2", "ipattern2")); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should now be equal " + dc2; assert comparator.compare(dc2, dc1) == 0 : dc2 + " should now be equal " + dc1; // side test just to see null patterns work dc1.addInclude(new Filter("ipath3", null)); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.addInclude(new Filter("ipath3", null)); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should now be equal " + dc2; assert comparator.compare(dc2, dc1) == 0 : dc2 + " should now be equal " + dc1; // now test excludes dc1.addExclude(new Filter("epath1", "epattern1")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.addExclude(new Filter("epath1", "epattern1")); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should now be equal " + dc2; assert comparator.compare(dc2, dc1) == 0 : dc2 + " should now be equal " + dc1; // add a second exclude to see that we test multiple filters dc1.addExclude(new Filter("epath2", "epattern2")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; dc2.addExclude(new Filter("epath2", "epattern2")); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should now be equal " + dc2; assert comparator.compare(dc2, dc1) == 0 : dc2 + " should now be equal " + dc1; // now test that we have the same number of filters but they differ dc1.addInclude(new Filter("ipathA", "ipatternA")); dc2.addInclude(new Filter("ipathZ", "ipatternZ")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; // we don't provide an API to clear filters, so just create new drift definitions and test different excludes dc1 = new DriftDefinition(new Configuration()); dc2 = new DriftDefinition(new Configuration()); assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal " + dc2; // sanity check dc1.addExclude(new Filter("epathA", "epatternA")); dc2.addExclude(new Filter("epathZ", "epatternZ")); assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2; assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1; } @Test public void getName() { String name = "test"; Configuration config = new Configuration(); config.put(new PropertySimple("name", name)); DriftDefinition driftDef = new DriftDefinition(config); assertEquals(driftDef.getName(), name, "Failed to get drift definition name"); } @Test public void getBasedirForFileSystemContext() { String basedir = "/opt/drift/test"; Configuration config = new Configuration(); PropertyMap map = new PropertyMap(PROP_BASEDIR); map.put(new PropertySimple(PROP_BASEDIR_VALUECONTEXT, fileSystem)); map.put(new PropertySimple(PROP_BASEDIR_VALUENAME, basedir)); config.put(map); DriftDefinition driftDef = new DriftDefinition(config); assertEquals(driftDef.getBasedir().getValueName(), basedir, "Failed to get drift definition base directory"); } @Test public void getInterval() { long interval = 3600L; Configuration config = new Configuration(); config.put(new PropertySimple("interval", interval)); DriftDefinition driftDef = new DriftDefinition(config); assertEquals(driftDef.getInterval(), interval, "Failed to get drift definition interval"); } @Test public void getDriftHandlingMode() { DriftHandlingMode mode = DriftHandlingMode.normal; Configuration config = new Configuration(); config.put(new PropertySimple(DriftConfigurationDefinition.PROP_DRIFT_HANDLING_MODE, mode.name())); DriftDefinition driftDef = new DriftDefinition(config); assertEquals(driftDef.getDriftHandlingMode(), mode, "Failed to get drift definition drift handling mode"); mode = DriftHandlingMode.plannedChanges; driftDef.setDriftHandlingMode(mode); assertEquals(driftDef.getDriftHandlingMode(), mode, "Failed to get drift definition drift handling mode"); } @Test public void isPinned() { Configuration config = new Configuration(); config.put(new PropertySimple(DriftConfigurationDefinition.PROP_PINNED, true)); DriftDefinition driftDef = new DriftDefinition(config); assertTrue(driftDef.isPinned(), "Expected drift definition to be pinned"); driftDef.setPinned(false); assertFalse(driftDef.isPinned(), "Expected drift definition not to be pinned"); } @Test public void getIncludes() { String path1 = "lib"; String pattern1 = "*.jar"; String path2 = "conf"; String pattern2 = "*.xml"; Configuration config = new Configuration(); PropertyList includes = new PropertyList("includes"); includes.add(newInclude(path1, pattern1)); includes.add(newInclude(path2, pattern2)); config.put(includes); DriftDefinition driftDef = new DriftDefinition(config); List<Filter> actual = driftDef.getIncludes(); List<Filter> expected = asList(new Filter(path1, pattern1), new Filter(path2, pattern2)); assertEquals(actual.size(), 2, "Expected to find two includes filters"); assertEquals(actual, expected, "Failed to get drift definition includes filters"); } @Test public void getExcludes() { String path1 = "lib"; String pattern1 = "*.jar"; String path2 = "conf"; String pattern2 = "*.xml"; Configuration config = new Configuration(); PropertyList excludes = new PropertyList("excludes"); excludes.add(newExclude(path1, pattern1)); excludes.add(newExclude(path2, pattern2)); config.put(excludes); DriftDefinition driftDef = new DriftDefinition(config); List<Filter> actual = driftDef.getExcludes(); List<Filter> expected = asList(new Filter(path1, pattern1), new Filter(path2, pattern2)); assertEquals(actual.size(), 2, "Expected to find two excludes filters"); assertEquals(actual, expected, "Failed to get drift definition excludes filters"); } private PropertyMap newInclude(String path, String pattern) { return new PropertyMap("include", new PropertySimple("path", path), new PropertySimple("pattern", pattern)); } private PropertyMap newExclude(String path, String pattern) { return new PropertyMap("exclude", new PropertySimple("path", path), new PropertySimple("pattern", pattern)); } }