/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.policy.js.compliance.hash; import static org.junit.Assert.*; import org.candlepin.model.Consumer; import org.candlepin.model.ConsumerInstalledProduct; import org.candlepin.model.ConsumerType; import org.candlepin.model.Entitlement; import org.candlepin.model.Owner; import org.candlepin.model.Pool; import org.candlepin.model.Product; import org.candlepin.policy.js.compliance.ComplianceReason; import org.candlepin.policy.js.compliance.ComplianceStatus; import org.candlepin.test.TestUtil; import org.junit.Before; import org.junit.Test; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class ComplianceStatusHasherTest { private ComplianceStatus status; private String initialHash; private Owner owner; @Before public void setUp() throws Exception { owner = new Owner("test-owner", "Test Owner"); Consumer consumer = createConsumer(owner); status = createInitialStatus(consumer); initialHash = generateHash(status, consumer); } @Test public void ensureSameHashWithNoChanges() { Consumer consumer = createConsumer(owner); assertEquals(initialHash, generateHash(createInitialStatus(consumer), consumer)); } @Test public void ensureDifferentHashWhenNonCompliantProductsChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); testStatus.getNonCompliantProducts().clear(); assertNotEquals(initialHash, generateHash(testStatus, consumer)); testStatus.addNonCompliantProduct("p1"); testStatus.addNonCompliantProduct("p2"); assertEquals(initialHash, generateHash(testStatus, consumer)); assertTrue(testStatus.getNonCompliantProducts().remove("p1")); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenCompliantProductCountChanges() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Set<Entitlement> ents = testStatus.getCompliantProducts().remove("p3"); assertFalse(testStatus.getCompliantProducts().containsKey("p3")); assertNotEquals(initialHash, generateHash(testStatus, consumer)); testStatus.getCompliantProducts().put("p3", ents); assertEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenCompliantProductEntitlementCountChanges() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Entitlement ent = createEntitlement(Calendar.getInstance(), owner, consumer, "test-ent"); HashSet<Entitlement> ents = new HashSet<Entitlement>(); ents.add(ent); testStatus.getCompliantProducts().put(ent.getPool().getProductId(), ents); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenPartiallyCompliantProductsChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Entitlement ent = createEntitlement(Calendar.getInstance(), owner, consumer, "test-ent"); HashSet<Entitlement> ents = new HashSet<Entitlement>(); ents.add(ent); testStatus.getPartiallyCompliantProducts().put(ent.getPool().getProductId(), ents); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenPartialStacksChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Entitlement ent = createEntitlement(Calendar.getInstance(), owner, consumer, "test-ent"); HashSet<Entitlement> ents = new HashSet<Entitlement>(); ents.add(ent); testStatus.getPartialStacks().put("p-stack-2", ents); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenReasonsChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); ComplianceReason reason = new ComplianceReason(); reason.setKey("TEST-REASON-KEY"); reason.setMessage("This is a test!"); testStatus.getReasons().add(reason); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenReasonKeyChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); ComplianceReason reason = testStatus.getReasons().iterator().next(); reason.setKey("FOOF"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenReasonAttributeChanges() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); ComplianceReason reason = testStatus.getReasons().iterator().next(); // Test new attribute map same values Map<String, String> newAttrs = new HashMap<String, String>(); newAttrs.putAll(reason.getAttributes()); reason.setAttributes(newAttrs); assertEquals(initialHash, generateHash(testStatus, consumer)); // Test new value newAttrs.put(reason.getKey() + "-attr", reason.getKey() + "-value"); assertEquals(initialHash, generateHash(testStatus, consumer)); newAttrs.put(reason.getKey() + "-attr", "new value"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); // Test new attribute. newAttrs.put("test-key", "test-value"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); // Test attribute count. newAttrs.clear(); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenConsumerFactsChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Map<String, String> initialConsumerFacts = consumer.getFacts(); String firstFactKey = initialConsumerFacts.keySet().iterator().next(); // Same facts, new map. consumer.setFacts(new HashMap<String, String>(initialConsumerFacts)); assertEquals(initialHash, generateHash(testStatus, consumer)); // Facts cleared consumer.getFacts().clear(); assertNotEquals(initialHash, generateHash(testStatus, consumer)); // Fact added consumer.setFacts(new HashMap<String, String>(initialConsumerFacts)); assertEquals(initialHash, generateHash(testStatus, consumer)); consumer.setFact("another", "fact"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); // Fact removed consumer.setFacts(new HashMap<String, String>(initialConsumerFacts)); assertEquals(initialHash, generateHash(testStatus, consumer)); consumer.getFacts().remove(firstFactKey); assertNotEquals(initialHash, generateHash(testStatus, consumer)); // Fact changed consumer.setFacts(new HashMap<String, String>(initialConsumerFacts)); assertEquals(initialHash, generateHash(testStatus, consumer)); consumer.setFact(firstFactKey, "Different Value"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void enssureDifferentHashWhenConsumerInstalledProductsChange() { Consumer consumer = createConsumer(owner); Product product = TestUtil.createProduct("Test Product"); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Set<ConsumerInstalledProduct> initialInstalled = consumer.getInstalledProducts(); consumer.setInstalledProducts(new HashSet<ConsumerInstalledProduct>(initialInstalled)); assertEquals(initialHash, generateHash(testStatus, consumer)); consumer.setInstalledProducts(new HashSet<ConsumerInstalledProduct>(initialInstalled)); assertEquals(initialHash, generateHash(testStatus, consumer)); ConsumerInstalledProduct installed = new ConsumerInstalledProduct(product.getUuid(), product.getName()); consumer.addInstalledProduct(installed); String updatedHash = generateHash(testStatus, consumer); assertNotEquals(initialHash, updatedHash); // Test arch change installed.setArch("test-arch"); assertNotEquals(updatedHash, generateHash(testStatus, consumer)); installed.setArch(null); assertEquals(updatedHash, generateHash(testStatus, consumer)); // Test version change installed.setVersion("1.2.3.4"); assertNotEquals(updatedHash, generateHash(testStatus, consumer)); installed.setVersion(null); assertEquals(updatedHash, generateHash(testStatus, consumer)); consumer.getInstalledProducts().remove(installed); assertEquals(initialHash, generateHash(testStatus, consumer)); consumer.getInstalledProducts().clear(); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenConsumerEntitlementCountsChange() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Set<Entitlement> initialEnts = consumer.getEntitlements(); consumer.setEntitlements(new HashSet<Entitlement>(initialEnts)); assertEquals(initialHash, generateHash(testStatus, consumer)); // Create and add an entitlement to the consumer. Entitlement ent = createEntitlement(Calendar.getInstance(), owner, consumer, "tp"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); consumer.removeEntitlement(ent); assertEquals(initialHash, generateHash(testStatus, consumer)); consumer.getEntitlements().clear(); assertNotEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenConsumerEntitlementChanges() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Entitlement ent = consumer.getEntitlements().iterator().next(); String id = ent.getId(); Integer quantity = ent.getQuantity(); // Check the ID ent.setId("somethhing_differerent"); assertNotEquals(initialHash, generateHash(testStatus, consumer)); ent.setId(id); assertEquals(initialHash, generateHash(testStatus, consumer)); // Check the quantity ent.setQuantity(112); assertNotEquals(initialHash, generateHash(testStatus, consumer)); ent.setQuantity(quantity); assertEquals(initialHash, generateHash(testStatus, consumer)); } @Test public void ensureDifferentHashWhenEntitlementPoolChanges() { Consumer consumer = createConsumer(owner); ComplianceStatus testStatus = createInitialStatus(consumer); assertEquals(initialHash, generateHash(testStatus, consumer)); Entitlement ent = consumer.getEntitlements().iterator().next(); Pool pool = ent.getPool(); String poolId = pool.getId(); Date poolStartDate = pool.getStartDate(); Date poolEndDate = pool.getEndDate(); } private Consumer createConsumer(Owner owner) { Consumer consumer = new Consumer("test-consumer", "test-consumer", owner, new ConsumerType(ConsumerType.ConsumerTypeEnum.SYSTEM)); consumer.setId("1"); consumer.setUuid("12345"); consumer.setFact("ram", "4"); consumer.setFact("cores", "2"); Product product1 = TestUtil.createProduct("installed-1"); Product product2 = TestUtil.createProduct("installed-2"); Set<ConsumerInstalledProduct> installedProducts = new HashSet<ConsumerInstalledProduct>(); installedProducts.add(new ConsumerInstalledProduct(product1)); installedProducts.add(new ConsumerInstalledProduct(product2)); consumer.setInstalledProducts(installedProducts); return consumer; } private ComplianceStatus createInitialStatus(Consumer consumer) { // Need to make sure that dates are exactly the same // as this method will be called more than once. Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2001); cal.set(Calendar.MONTH, 4); cal.set(Calendar.DATE, 12); cal.set(Calendar.HOUR, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); ComplianceStatus initialStatus = new ComplianceStatus(cal.getTime()); addMonths(cal, 4); initialStatus.addNonCompliantProduct("p1"); initialStatus.addNonCompliantProduct("p2"); initialStatus.addCompliantProduct("p3", createEntitlement(cal, owner, consumer, "p3")); initialStatus.addCompliantProduct("p4", createEntitlement(cal, owner, consumer, "p4")); initialStatus.addPartiallyCompliantProduct("p5", createEntitlement(cal, owner, consumer, "p5")); initialStatus.addPartialStack("p-stack", createEntitlement(cal, owner, consumer, "p6")); ComplianceReason reason1 = createReason("TEST-REASON-1"); initialStatus.getReasons().add(reason1); ComplianceReason reason2 = createReason("TEST-REASON-2"); initialStatus.getReasons().add(reason2); return initialStatus; } private ComplianceReason createReason(String key) { ComplianceReason reason = new ComplianceReason(); reason.setKey(key); reason.setMessage(key + ": This is a test!"); Map<String, String> attrs = new HashMap<String, String>(); attrs.put(key + "-attr", key + "-value"); reason.setAttributes(attrs); return reason; } private Entitlement createEntitlement(Calendar cal, Owner owner, Consumer consumer, String productId) { Product product = TestUtil.createProduct(productId, productId); Pool pool = TestUtil.createPool(owner, product); pool.setId(product.getId() + "pool"); pool.setUpdated(cal.getTime()); Entitlement ent = new Entitlement(); ent.setOwner(owner); ent.setPool(pool); ent.setOwner(owner); ent.setQuantity(2); ent.setCreated(cal.getTime()); ent.setUpdated(cal.getTime()); ent.setId(product.getId() + "ent"); consumer.addEntitlement(ent); return ent; } private void addMonths(Calendar cal, int numOfMonths) { cal.add(Calendar.MONTH, numOfMonths); } private String generateHash(ComplianceStatus status, Consumer consumer) { ComplianceStatusHasher hasher = new ComplianceStatusHasher(consumer, status); return hasher.hash(); } }