/* * 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.core.domain.configuration.test; import java.util.ArrayList; import java.util.HashMap; import javax.persistence.EntityManager; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.Property; 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.test.AbstractEJB3Test; /** * Tests the ability to compare configurations with one another. * * @author John Mazzitelli */ @Test(groups = "integration.ejb3") public class ConfigurationCompareTest extends AbstractEJB3Test { public void testNullCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); c2.getProperties().clear(); assert c1.equals(c1); // matches itself assert c1.equals(c2); // null config matches an empty config assert c2.equals(c1); c1.put(new PropertySimple("one", null)); c2.put(new PropertySimple("one", null)); assert c1.equals(c2); // null property matches a null property assert c2.equals(c1); PropertyList list1 = new PropertyList("listA"); list1.setList(new ArrayList<Property>()); c1.put(list1); PropertyList list2 = new PropertyList("listA"); list2.setList(null); c2.put(list2); assert c1.equals(c2); // empty list is the same as a null list assert c2.equals(c1); list1.add(new PropertySimple("x", "y")); assert !c1.equals(c2); assert !c2.equals(c1); list2.add(new PropertySimple("x", "y")); assert c1.equals(c2); assert c2.equals(c1); PropertyMap map1 = new PropertyMap("mapB"); map1.setMap(new HashMap<String, Property>()); c1.put(map1); PropertyMap map2 = new PropertyMap("mapB"); map1.setMap(null); c2.put(map2); assert c1.equals(c2); // empty map is the same as a null map assert c2.equals(c1); map1.put(new PropertySimple("m", "n")); assert !c1.equals(c2); assert !c2.equals(c1); map2.put(new PropertySimple("m", "n")); assert c1.equals(c2); assert c2.equals(c1); map1.put(list1); map2.put(list2); assert c1.equals(c2); // innerList is empty, so its same as a null assert c2.equals(c1); list1.add(new PropertySimple("x", "z")); assert !c1.equals(c2); assert !c2.equals(c1); } @Test(groups = "integration.ejb3") public void testPersistedNullCompare() throws Exception { getTransactionManager().begin(); EntityManager em = getEntityManager(); try { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); em.persist(c2); c2.getProperties().clear(); em.flush(); em.refresh(c2); assert c1.equals(c1); // matches itself assert c1.equals(c2); // null config matches an empty config assert c2.equals(c1); c1.put(new PropertySimple("one", null)); c2.put(new PropertySimple("one", null)); assert c1.equals(c2); // null property matches a null property assert c2.equals(c1); PropertyList list1 = new PropertyList("listA"); list1.setList(new ArrayList<Property>()); c1.put(list1); PropertyList list2 = new PropertyList("listA"); list2.setList(null); c2.put(list2); em.flush(); em.refresh(c2); assert c1.equals(c2); // empty list is the same as a null list assert c2.equals(c1); list1.add(new PropertySimple("x", "y")); assert !c1.equals(c2); assert !c2.equals(c1); list2.add(new PropertySimple("x", "y")); em.flush(); em.refresh(c2); assert c1.equals(c2); assert c2.equals(c1); PropertyMap map1 = new PropertyMap("mapB"); map1.setMap(new HashMap<String, Property>()); c1.put(map1); PropertyMap map2 = new PropertyMap("mapB"); map1.setMap(null); c2.put(map2); em.flush(); em.refresh(c2); assert c1.equals(c2); // empty map is the same as a null map assert c2.equals(c1); map1.put(new PropertySimple("m", "n")); assert !c1.equals(c2); assert !c2.equals(c1); map2.put(new PropertySimple("m", "n")); em.flush(); em.refresh(c2); assert c1.equals(c2); assert c2.equals(c1); map1.put(list1); map2.put(list2); em.flush(); em.refresh(c2); assert c1.equals(c2); // innerList is empty, so its same as a null assert c2.equals(c1); list1.add(new PropertySimple("x", "z")); assert !c1.equals(c2); assert !c2.equals(c1); list2.add(new PropertySimple("x", "z")); em.flush(); em.refresh(c2); assert c1.equals(c2); assert c2.equals(c1); c1.put(new PropertySimple("n1", "")); c2.put(new PropertySimple("n1", "")); em.flush(); em.refresh(c2); assert c1.equals(c2); assert c2.equals(c1); c1.put(new PropertySimple("n1", null)); c2.put(new PropertySimple("n1", null)); em.flush(); em.refresh(c2); assert c1.equals(c2); assert c2.equals(c1); } finally { getTransactionManager().rollback(); } } @Test(groups = "integration.ejb3") public void testSimpleCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); assert c1.equals(c1); // can compare itself assert c1.equals(c2); assert c2.equals(c1); c1.put(new PropertySimple("one", "111")); assert c1.equals(c1); // can compare itself assert !c1.equals(c2); assert !c2.equals(c1); c2.put(new PropertySimple("two", "222")); assert !c1.equals(c2); assert !c2.equals(c1); c2.put(new PropertySimple("one", "111")); c1.put(new PropertySimple("two", "222")); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert c1.equals(c2); assert c2.equals(c1); } public void testMapCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); c1.put(new PropertyMap("mapA", new Property[] { new PropertySimple("uno", "111") })); c2.put(new PropertyMap("mapA", new Property[] { new PropertySimple("dos", "222") })); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert !c1.equals(c2); assert !c2.equals(c1); c1.getMap("mapA").put(new PropertySimple("dos", "222")); c2.getMap("mapA").put(new PropertySimple("uno", "111")); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert c1.equals(c2); assert c2.equals(c1); } public void testMapInMapCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); PropertyMap mapInner1 = new PropertyMap("inner", new Property[] { new PropertySimple("uno", 111) }); PropertyMap mapInner2 = new PropertyMap("inner", new Property[] { new PropertySimple("uno", 111) }); PropertyMap mapOuter1 = new PropertyMap("outer", new Property[] { mapInner1 }); PropertyMap mapOuter2 = new PropertyMap("outer", new Property[] { mapInner2 }); c1.put(mapOuter1); c2.put(mapOuter2); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert c1.equals(c2); assert c2.equals(c1); c1.getMap("outer").getMap("inner").put(new PropertySimple("foo", "bar")); assert c1.equals(c1); // can compare itself assert !c1.equals(c2); assert !c2.equals(c1); } public void testListCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); c1.put(new PropertyList("listA", new Property[] { new PropertySimple("foo", "111") })); c2.put(new PropertyList("listA", new Property[] { new PropertySimple("foo", "111") })); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert c1.equals(c2); assert c2.equals(c1); c2.getList("listA").add(new PropertySimple("foo", "222")); assert c2.equals(c2); // can compare itself assert !c1.equals(c2); assert !c2.equals(c1); } public void testListInListCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); PropertyList listInner1 = new PropertyList("inner", new Property[] { new PropertySimple("uno", 111) }); PropertyList listInner2 = new PropertyList("inner", new Property[] { new PropertySimple("uno", 111) }); PropertyList listOuter1 = new PropertyList("outer", new Property[] { listInner1 }); PropertyList listOuter2 = new PropertyList("outer", new Property[] { listInner2 }); c1.put(listOuter1); c2.put(listOuter2); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert c1.equals(c2); assert c2.equals(c1); ((PropertyList) (c1.getList("outer").getList().get(0))).add(new PropertySimple("uno", 222)); assert c1.equals(c1); // can compare itself assert !c1.equals(c2); assert !c2.equals(c1); } public void testMapAndListCompare() { Configuration c1 = new Configuration(); Configuration c2 = new Configuration(); PropertyList listInner1 = new PropertyList("inner", new Property[] { new PropertySimple("uno", 111) }); PropertyList listInner2 = new PropertyList("inner", new Property[] { new PropertySimple("uno", 111) }); PropertyMap mapOuter1 = new PropertyMap("outer", new Property[] { listInner1, new PropertySimple("hello", "world!") }); PropertyMap mapOuter2 = new PropertyMap("outer", new Property[] { listInner2, new PropertySimple("hello", "world!") }); c1.put(mapOuter1); c2.put(mapOuter2); assert c1.equals(c1); // can compare itself assert c2.equals(c2); // can compare itself assert c1.equals(c2); assert c2.equals(c1); c1.getMap("outer").getList("inner").add(new PropertySimple("uno", "bar")); assert c1.equals(c1); // can compare itself assert !c1.equals(c2); assert !c2.equals(c1); } }