/**
* 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.model;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import org.candlepin.auth.ConsumerPrincipal;
import org.candlepin.auth.Principal;
import org.candlepin.common.config.Configuration;
import org.candlepin.model.ConsumerType.ConsumerTypeEnum;
import org.candlepin.resource.ConsumerResource;
import org.candlepin.test.DatabaseTestFixture;
import org.candlepin.test.TestUtil;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.Map;
import javax.inject.Inject;
import javax.persistence.PersistenceException;
public class ConsumerTest extends DatabaseTestFixture {
@Inject private ConsumerResource consumerResource;
@Inject private RoleCurator roleCurator;
@Inject private Configuration config;
private Owner owner;
private Product rhel;
private Product jboss;
private Consumer consumer;
private ConsumerType consumerType;
private static final String CONSUMER_TYPE_NAME = "test-consumer-type";
private static final String CONSUMER_NAME = "Test Consumer";
private static final String USER_NAME = "user33908";
@Before
public void setUpTestObjects() {
owner = this.createOwner("Example Corporation");
rhel = this.createProduct("rhel", "Red Hat Enterprise Linux", owner);
jboss = this.createProduct("jboss", "JBoss", owner);
consumerType = new ConsumerType(CONSUMER_TYPE_NAME);
consumerTypeCurator.create(consumerType);
consumer = new Consumer(CONSUMER_NAME, USER_NAME, owner, consumerType);
consumer.setFact("foo", "bar");
consumer.setFact("foo1", "bar1");
consumerCurator.create(consumer);
}
@Test(expected = PersistenceException.class)
public void testConsumerTypeRequired() {
Consumer newConsumer = new Consumer();
newConsumer.setName("cname");
newConsumer.setOwner(owner);
consumerCurator.create(newConsumer);
}
@Test(expected = PersistenceException.class)
public void testConsumerNameLengthCreate() {
String name = "";
for (int x = 0; x < 300; x++) {
name += "x";
}
Consumer newConsumer = new Consumer();
newConsumer.setName(name);
newConsumer.setOwner(owner);
consumerCurator.create(newConsumer);
}
@Test(expected = PersistenceException.class)
public void testConsumerNameLengthUpdate() {
String name = "";
for (int x = 0; x < 300; x++) {
name += "x";
}
Consumer newConsumer = new Consumer();
newConsumer.setName(name);
newConsumer.setOwner(owner);
consumerCurator.update(newConsumer);
}
@Test
public void testLookup() throws Exception {
Consumer lookedUp = consumerCurator.find(consumer.getId());
assertEquals(consumer.getId(), lookedUp.getId());
assertEquals(consumer.getName(), lookedUp.getName());
assertEquals(consumer.getType().getLabel(), lookedUp.getType().getLabel());
assertNotNull(consumer.getUuid());
}
@Test
public void testSetInitialization() throws Exception {
Consumer noFacts = new Consumer(CONSUMER_NAME, USER_NAME, owner, consumerType);
consumerCurator.create(noFacts);
noFacts = consumerCurator.find(noFacts.getId());
assertNotNull(noFacts.getFacts());
assertNotNull(noFacts.getInstalledProducts());
assertNotNull(noFacts.getGuestIds());
}
@Test
public void testInfo() {
Consumer lookedUp = consumerCurator.find(consumer.getId());
Map<String, String> metadata = lookedUp.getFacts();
assertEquals(2, metadata.keySet().size());
assertEquals("bar", metadata.get("foo"));
assertEquals("bar", lookedUp.getFacts().get("foo"));
assertEquals("bar1", metadata.get("foo1"));
assertEquals("bar1", lookedUp.getFacts().get("foo1"));
}
@Test
public void ensureUpdatedDateChangesOnUpdate() throws Exception {
Date beforeUpdateDate = consumer.getUpdated();
// Create a new consumer, can't re-use reference to the old:
Consumer newConsumer = new Consumer();
newConsumer.setUuid(consumer.getUuid());
newConsumer.setFact("FACT", "FACT_VALUE");
consumerResource.updateConsumer(consumer.getUuid(), newConsumer, mock(Principal.class));
Consumer lookedUp = consumerCurator.find(consumer.getId());
Date lookedUpDate = lookedUp.getUpdated();
assertEquals("FACT_VALUE", lookedUp.getFact("FACT"));
assertTrue("Last updated date was not changed.",
beforeUpdateDate.before(lookedUpDate));
}
@Test
public void testMetadataInfo() {
Consumer consumer2 = new Consumer("consumer2", USER_NAME, owner, consumerType);
consumer2.setFact("foo", "bar2");
consumerCurator.create(consumer2);
Consumer lookedUp = consumerCurator.find(consumer.getId());
Map<String, String> metadata = lookedUp.getFacts();
assertEquals(2, metadata.keySet().size());
assertEquals("bar", metadata.get("foo"));
assertEquals("bar", lookedUp.getFacts().get("foo"));
assertEquals("bar1", metadata.get("foo1"));
assertEquals("bar1", lookedUp.getFacts().get("foo1"));
Consumer lookedUp2 = consumerCurator.find(consumer2.getId());
metadata = lookedUp2.getFacts();
assertEquals(1, metadata.keySet().size());
assertEquals("bar2", metadata.get("foo"));
}
@Test
public void testModifyMetadata() {
consumer.setFact("foo", "notbar");
consumerCurator.merge(consumer);
Consumer lookedUp = consumerCurator.find(consumer.getId());
assertEquals("notbar", lookedUp.getFact("foo"));
}
@Test
public void testRemoveConsumedProducts() {
consumerCurator.delete(consumerCurator.find(consumer.getId()));
assertNull(consumerCurator.find(consumer.getId()));
}
@Test
public void testLookupByUuidNonExistent() {
consumerCurator.findByUuid("this is not a uuid!");
}
@Test
public void testLookupByUuid() {
Consumer consumer2 = new Consumer("consumer2", USER_NAME, owner, consumerType);
consumerCurator.create(consumer2);
Consumer lookedUp = consumerCurator.findByUuid(consumer2.getUuid());
assertEquals(lookedUp.getUuid(), consumer2.getUuid());
}
@Test
public void testAddEntitlements() {
Owner o = createOwner();
Product newProduct = this.createProduct(o);
Pool pool = createPool(o, newProduct, 1000L, TestUtil.createDate(2009, 11, 30),
TestUtil.createDate(2015, 11, 30));
this.getEntityManager().persist(pool.getOwner());
this.getEntityManager().persist(pool);
Entitlement e1 = createEntitlement(pool, consumer);
Entitlement e2 = createEntitlement(pool, consumer);
Entitlement e3 = createEntitlement(pool, consumer);
this.getEntityManager().persist(e1);
this.getEntityManager().persist(e2);
this.getEntityManager().persist(e3);
consumer.addEntitlement(e1);
consumer.addEntitlement(e2);
consumer.addEntitlement(e3);
consumerCurator.merge(consumer);
Consumer lookedUp = consumerCurator.find(consumer.getId());
assertEquals(3, lookedUp.getEntitlements().size());
}
private Entitlement createEntitlement(Pool pool, Consumer c) {
Entitlement e = new Entitlement(pool, c, 1);
return e;
}
@Test
public void testNullType() {
Consumer c = new Consumer("name", USER_NAME, owner, null);
assertNotNull(c);
}
@Test
public void canDeleteSelf() {
setupPrincipal(new ConsumerPrincipal(consumer));
consumerCurator.delete(consumer);
assertNull(consumerCurator.find(consumer.getId()));
}
@Test
public void factsEqual() {
Consumer first = new Consumer();
first.setFact("key1", "1");
first.setFact("key2", "two");
first.setFact("key3", "3");
Consumer second = new Consumer();
second.setFact("key1", "1");
second.setFact("key2", "two");
second.setFact("key3", "3");
assertTrue(first.factsAreEqual(second));
}
@Test
public void defaultFactsEqual() {
assertTrue(new Consumer().factsAreEqual(new Consumer()));
}
@Test
public void factsDifferentValues() {
Consumer first = new Consumer();
first.setFact("key1", "1");
first.setFact("key2", "two");
first.setFact("key3", "3");
Consumer second = new Consumer();
second.setFact("key1", "1");
second.setFact("key2", "2");
second.setFact("key3", "3");
assertFalse(first.factsAreEqual(second));
}
@Test
public void factsSecondMissing() {
Consumer first = new Consumer();
first.setFact("key1", "1");
first.setFact("key2", "two");
first.setFact("key3", "3");
Consumer second = new Consumer();
second.setFact("key1", "1");
assertFalse(first.factsAreEqual(second));
}
@Test
public void factsFirstMissing() {
Consumer first = new Consumer();
first.setFact("key1", "1");
first.setFact("key3", "3");
Consumer second = new Consumer();
second.setFact("key1", "1");
second.setFact("key2", "2");
second.setFact("key3", "3");
assertFalse(first.factsAreEqual(second));
}
@Test
public void factsEqualNull() {
Consumer first = new Consumer();
first.setFact("key1", "1");
first.setFact("key2", null);
Consumer second = new Consumer();
second.setFact("key1", "1");
second.setFact("key2", null);
assertTrue(first.factsAreEqual(second));
}
@Test
public void factsFirstNull() {
Consumer first = new Consumer();
first.setFact("key1", "1");
first.setFact("key2", null);
Consumer second = new Consumer();
second.setFact("key1", "1");
second.setFact("key2", "two");
assertFalse(first.factsAreEqual(second));
}
@Test
public void findbugsNullDereferenceNullFacts() {
Consumer first = new Consumer();
first.setFacts(null);
Consumer second = new Consumer();
second.setFact("key1", "1");
assertFalse(first.factsAreEqual(second));
}
@Test
public void findbugsSecondListIsNull() {
Consumer first = new Consumer();
first.setFact("key1", "1");
Consumer second = new Consumer();
second.setFacts(null);
assertFalse(first.factsAreEqual(second));
}
@Test
public void factsSecondNull() {
Consumer first = new Consumer();
first.setFact("key1", "1");
Consumer second = new Consumer();
second.setFact("key1", null);
assertFalse(first.factsAreEqual(second));
}
@Test
public void factsBothNull() {
Consumer first = new Consumer();
first.setFacts(null);
Consumer second = new Consumer();
second.setFacts(null);
assertTrue(first.factsAreEqual(second));
}
@Test
public void testLookupUsersConsumer() {
String newUsername = "newusername";
// Need to make sure another consumer already exists, different type:
Consumer existing = new Consumer("existing consumer", newUsername, owner,
consumerType);
consumerCurator.create(existing);
ConsumerType personType = new ConsumerType(ConsumerTypeEnum.PERSON);
consumerTypeCurator.create(personType);
User user = new User(newUsername, "password");
userCurator.create(user);
Role adminRole = createAdminRole(owner);
adminRole.addUser(user);
roleCurator.create(adminRole);
assertNull(consumerCurator.findByUser(user));
consumer = new Consumer(CONSUMER_NAME, newUsername, owner, personType);
consumerCurator.create(consumer);
assertEquals(consumer, consumerCurator.findByUser(user));
}
@Test
public void testInstalledProducts() throws Exception {
Consumer lookedUp = consumerCurator.find(consumer.getId());
lookedUp.addInstalledProduct(
new ConsumerInstalledProduct("someproduct", "someproductname")
);
lookedUp.addInstalledProduct(
new ConsumerInstalledProduct("someproduct2", "someproductname2")
);
consumerCurator.update(lookedUp);
lookedUp = consumerCurator.find(consumer.getId());
assertEquals(2, lookedUp.getInstalledProducts().size());
ConsumerInstalledProduct installed = lookedUp.getInstalledProducts().
iterator().next();
lookedUp.getInstalledProducts().remove(installed);
consumerCurator.update(lookedUp);
lookedUp = consumerCurator.find(consumer.getId());
assertEquals(1, lookedUp.getInstalledProducts().size());
}
@Test
public void testGuests() throws Exception {
Consumer lookedUp = consumerCurator.find(consumer.getId());
lookedUp.addGuestId(new GuestId("guest1"));
lookedUp.addGuestId(new GuestId("guest2"));
consumerCurator.update(lookedUp);
lookedUp = consumerCurator.find(consumer.getId());
assertEquals(2, lookedUp.getGuestIds().size());
GuestId installed = lookedUp.getGuestIds().
iterator().next();
lookedUp.getGuestIds().remove(installed);
consumerCurator.update(lookedUp);
lookedUp = consumerCurator.find(consumer.getId());
assertEquals(1, lookedUp.getGuestIds().size());
}
}