/**
* 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.test;
import org.candlepin.CandlepinCommonTestingModule;
import org.candlepin.CandlepinNonServletEnvironmentTestingModule;
import org.candlepin.TestingInterceptor;
import org.candlepin.auth.Access;
import org.candlepin.auth.Principal;
import org.candlepin.auth.UserPrincipal;
import org.candlepin.auth.permissions.OwnerPermission;
import org.candlepin.auth.permissions.Permission;
import org.candlepin.auth.permissions.PermissionFactory;
import org.candlepin.auth.permissions.PermissionFactory.PermissionType;
import org.candlepin.config.CandlepinCommonTestConfig;
import org.candlepin.controller.CandlepinPoolManager;
import org.candlepin.guice.CandlepinSingletonScope;
import org.candlepin.guice.TestPrincipalProviderSetter;
import org.candlepin.model.CertificateSerial;
import org.candlepin.model.CertificateSerialCurator;
import org.candlepin.model.Consumer;
import org.candlepin.model.ConsumerContentOverrideCurator;
import org.candlepin.model.ConsumerCurator;
import org.candlepin.model.ConsumerType;
import org.candlepin.model.ConsumerTypeCurator;
import org.candlepin.model.ContentCurator;
import org.candlepin.model.Entitlement;
import org.candlepin.model.EntitlementCertificate;
import org.candlepin.model.EntitlementCertificateCurator;
import org.candlepin.model.EntitlementCurator;
import org.candlepin.model.EnvironmentContentCurator;
import org.candlepin.model.EnvironmentCurator;
import org.candlepin.model.EventCurator;
import org.candlepin.model.Owner;
import org.candlepin.model.OwnerCurator;
import org.candlepin.model.PermissionBlueprint;
import org.candlepin.model.PermissionBlueprintCurator;
import org.candlepin.model.Pool;
import org.candlepin.model.PoolAttributeCurator;
import org.candlepin.model.PoolCurator;
import org.candlepin.model.Product;
import org.candlepin.model.ProductAttribute;
import org.candlepin.model.ProductAttributeCurator;
import org.candlepin.model.ProductCertificateCurator;
import org.candlepin.model.ProductCurator;
import org.candlepin.model.ProductPoolAttribute;
import org.candlepin.model.ProductPoolAttributeCurator;
import org.candlepin.model.ProvidedProduct;
import org.candlepin.model.Role;
import org.candlepin.model.RoleCurator;
import org.candlepin.model.RulesCurator;
import org.candlepin.model.SourceSubscription;
import org.candlepin.model.StatisticCurator;
import org.candlepin.model.Subscription;
import org.candlepin.model.SubscriptionCurator;
import org.candlepin.model.SubscriptionsCertificateCurator;
import org.candlepin.model.UeberCertificateGenerator;
import org.candlepin.model.UserCurator;
import org.candlepin.model.activationkeys.ActivationKey;
import org.candlepin.model.activationkeys.ActivationKeyContentOverrideCurator;
import org.candlepin.model.activationkeys.ActivationKeyCurator;
import org.candlepin.service.EntitlementCertServiceAdapter;
import org.candlepin.service.OwnerServiceAdapter;
import org.candlepin.service.ProductServiceAdapter;
import org.candlepin.service.SubscriptionServiceAdapter;
import org.candlepin.service.UniqueIdGenerator;
import org.candlepin.util.DateSource;
import org.candlepin.util.ServiceLevelValidator;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.persist.PersistFilter;
import com.google.inject.persist.UnitOfWork;
import com.google.inject.util.Modules;
import org.hibernate.cfg.beanvalidation.BeanValidationEventListener;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.internal.SessionFactoryImpl;
import org.junit.After;
import org.junit.Before;
import org.xnap.commons.i18n.I18n;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import javax.inject.Provider;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.servlet.http.HttpServletRequest;
/**
* Test fixture for test classes requiring access to the database.
*/
public class DatabaseTestFixture {
private static final String DEFAULT_CONTRACT = "SUB349923";
private static final String DEFAULT_ACCOUNT = "ACC123";
private static final String DEFAULT_ORDER = "ORD222";
protected EntityManagerFactory emf;
protected Injector injector;
protected OwnerCurator ownerCurator;
protected UserCurator userCurator;
protected ProductCurator productCurator;
protected ProductCertificateCurator productCertificateCurator;
protected ProductServiceAdapter productAdapter;
protected SubscriptionServiceAdapter subAdapter;
protected OwnerServiceAdapter ownerAdapter;
protected ConsumerCurator consumerCurator;
protected ConsumerTypeCurator consumerTypeCurator;
protected ConsumerContentOverrideCurator consumerContentOverrideCurator;
protected SubscriptionsCertificateCurator certificateCurator;
protected PoolCurator poolCurator;
protected PoolAttributeCurator poolAttributeCurator;
protected ProductPoolAttributeCurator productPoolAttributeCurator;
protected DateSourceForTesting dateSource;
protected EntitlementCurator entitlementCurator;
protected EnvironmentContentCurator envContentCurator;
protected ProductAttributeCurator attributeCurator;
protected RulesCurator rulesCurator;
protected EventCurator eventCurator;
protected SubscriptionCurator subCurator;
protected ActivationKeyCurator activationKeyCurator;
protected ContentCurator contentCurator;
protected UnitOfWork unitOfWork;
protected HttpServletRequest httpServletRequest;
protected EntitlementCertificateCurator entCertCurator;
protected CertificateSerialCurator certSerialCurator;
protected PermissionBlueprintCurator permissionCurator;
protected RoleCurator roleCurator;
protected EnvironmentCurator envCurator;
protected I18n i18n;
protected TestingInterceptor securityInterceptor;
protected EntitlementCertServiceAdapter entitlementCertService;
protected CandlepinPoolManager poolManager;
protected StatisticCurator statisticCurator;
protected UniqueIdGenerator uniqueIdGenerator;
protected UeberCertificateGenerator ueberCertGenerator;
protected CandlepinSingletonScope cpSingletonScope;
protected PermissionFactory permFactory;
protected ActivationKeyContentOverrideCurator activationKeyContentOverrideCurator;
protected ServiceLevelValidator serviceLevelValidator;
@Before
public void init() {
Module guiceOverrideModule = getGuiceOverrideModule();
CandlepinCommonTestConfig config = new CandlepinCommonTestConfig();
CandlepinCommonTestingModule testingModule = new CandlepinCommonTestingModule(config);
if (guiceOverrideModule == null) {
injector = Guice.createInjector(testingModule,
new CandlepinNonServletEnvironmentTestingModule());
}
else {
injector = Guice.createInjector(Modules.override(testingModule)
.with(guiceOverrideModule),
new CandlepinNonServletEnvironmentTestingModule());
}
insertValidationEventListeners(injector);
cpSingletonScope = injector.getInstance(CandlepinSingletonScope.class);
// Because all candlepin operations are running in the CandlepinSingletonScope
// we'll force the instance creations to be done inside the scope.
// Exit the scope to make sure that it is clean before starting the test.
cpSingletonScope.exit();
cpSingletonScope.enter();
injector.getInstance(EntityManagerFactory.class);
emf = injector.getProvider(EntityManagerFactory.class).get();
ownerCurator = injector.getInstance(OwnerCurator.class);
userCurator = injector.getInstance(UserCurator.class);
productCurator = injector.getInstance(ProductCurator.class);
productCertificateCurator = injector
.getInstance(ProductCertificateCurator.class);
consumerCurator = injector.getInstance(ConsumerCurator.class);
eventCurator = injector.getInstance(EventCurator.class);
permissionCurator = injector.getInstance(PermissionBlueprintCurator.class);
roleCurator = injector.getInstance(RoleCurator.class);
consumerTypeCurator = injector.getInstance(ConsumerTypeCurator.class);
consumerContentOverrideCurator = injector.getInstance(
ConsumerContentOverrideCurator.class);
activationKeyContentOverrideCurator = injector.getInstance(
ActivationKeyContentOverrideCurator.class);
certificateCurator = injector
.getInstance(SubscriptionsCertificateCurator.class);
poolCurator = injector.getInstance(PoolCurator.class);
poolAttributeCurator = injector.getInstance(PoolAttributeCurator.class);
productPoolAttributeCurator = injector
.getInstance(ProductPoolAttributeCurator.class);
entitlementCurator = injector.getInstance(EntitlementCurator.class);
attributeCurator = injector.getInstance(ProductAttributeCurator.class);
rulesCurator = injector.getInstance(RulesCurator.class);
subCurator = injector.getInstance(SubscriptionCurator.class);
activationKeyCurator = injector.getInstance(ActivationKeyCurator.class);
contentCurator = injector.getInstance(ContentCurator.class);
envCurator = injector.getInstance(EnvironmentCurator.class);
envContentCurator = injector.getInstance(EnvironmentContentCurator.class);
unitOfWork = injector.getInstance(UnitOfWork.class);
productAdapter = injector.getInstance(ProductServiceAdapter.class);
subAdapter = injector.getInstance(SubscriptionServiceAdapter.class);
ownerAdapter = injector.getInstance(OwnerServiceAdapter.class);
entCertCurator = injector
.getInstance(EntitlementCertificateCurator.class);
certSerialCurator = injector
.getInstance(CertificateSerialCurator.class);
entitlementCertService = injector
.getInstance(EntitlementCertServiceAdapter.class);
poolManager = injector.getInstance(CandlepinPoolManager.class);
statisticCurator = injector.getInstance(StatisticCurator.class);
i18n = injector.getInstance(I18n.class);
uniqueIdGenerator = injector.getInstance(UniqueIdGenerator.class);
ueberCertGenerator = injector.getInstance(UeberCertificateGenerator.class);
permFactory = injector.getInstance(PermissionFactory.class);
securityInterceptor = testingModule.securityInterceptor();
dateSource = (DateSourceForTesting) injector
.getInstance(DateSource.class);
dateSource.currentDate(TestDateUtil.date(2010, 1, 1));
serviceLevelValidator = injector.getInstance(ServiceLevelValidator.class);
}
@After
public void shutdown() {
// We are using a singleton for the principal in tests. Make sure we clear it out
// after every test. TestPrincipalProvider controls the default behavior.
TestPrincipalProviderSetter.get().setPrincipal(null);
try {
injector.getInstance(PersistFilter.class).destroy();
if (entityManager().isOpen()) {
entityManager().close();
}
if (emf.isOpen()) {
emf.close();
}
}
finally {
cpSingletonScope.exit();
}
}
protected Module getGuiceOverrideModule() {
return null;
}
protected EntityManager entityManager() {
return injector.getProvider(EntityManager.class).get();
}
/**
* Helper to open a new db transaction. Pretty simple for now, but may
* require additional logic and error handling down the road.
*/
protected void beginTransaction() {
entityManager().getTransaction().begin();
}
/**
* Helper to commit the current db transaction. Pretty simple for now, but
* may require additional logic and error handling down the road.
*/
protected void commitTransaction() {
entityManager().getTransaction().commit();
}
/**
* Create an entitlement pool and matching subscription.
*
* @return an entitlement pool and matching subscription.
*/
protected Pool createPoolAndSub(Owner owner, Product product,
Long quantity, Date startDate, Date endDate) {
Pool p = new Pool(owner, product.getId(), product.getName(),
new HashSet<ProvidedProduct>(), quantity, startDate, endDate,
DEFAULT_CONTRACT, DEFAULT_ACCOUNT, DEFAULT_ORDER);
Subscription sub = new Subscription(owner, product,
new HashSet<Product>(), quantity, startDate, endDate,
TestUtil.createDate(2010, 2, 12));
subCurator.create(sub);
p.setSourceSubscription(new SourceSubscription(sub.getId(), "master"));
for (ProductAttribute pa : product.getAttributes()) {
p.addProductAttribute(new ProductPoolAttribute(pa.getName(),
pa.getValue(), product.getId()));
}
return poolCurator.create(p);
}
protected Owner createOwner() {
Owner o = new Owner("Test Owner " + TestUtil.randomInt());
ownerCurator.create(o);
return o;
}
protected Consumer createConsumer(Owner owner) {
ConsumerType type = new ConsumerType("test-consumer-type-" +
TestUtil.randomInt());
consumerTypeCurator.create(type);
Consumer c = new Consumer("test-consumer", "test-user", owner, type);
consumerCurator.create(c);
return c;
}
protected Subscription createSubscription() {
Product p = TestUtil.createProduct();
productCurator.create(p);
Subscription sub = new Subscription(createOwner(),
p, new HashSet<Product>(),
1000L,
TestUtil.createDate(2000, 1, 1),
TestUtil.createDate(2010, 1, 1),
TestUtil.createDate(2000, 1, 1));
subCurator.create(sub);
return sub;
}
protected ActivationKey createActivationKey(Owner owner) {
return TestUtil.createActivationKey(owner, null);
}
protected Entitlement createEntitlement(Owner owner, Consumer consumer,
Pool pool, EntitlementCertificate cert) {
return TestUtil.createEntitlement(owner, consumer, pool, cert);
}
protected EntitlementCertificate createEntitlementCertificate(String key,
String cert) {
EntitlementCertificate toReturn = new EntitlementCertificate();
CertificateSerial certSerial = new CertificateSerial(new Date());
certSerialCurator.create(certSerial);
toReturn.setKeyAsBytes(key.getBytes());
toReturn.setCertAsBytes(cert.getBytes());
toReturn.setSerial(certSerial);
return toReturn;
}
protected Principal setupPrincipal(Owner owner, Access role) {
return setupPrincipal("someuser", owner, role);
}
protected Principal setupPrincipal(String username, Owner owner, Access verb) {
OwnerPermission p = new OwnerPermission(owner, verb);
// Only need a detached owner permission here:
Principal ownerAdmin = new UserPrincipal(username, Arrays.asList(new Permission[] {
p}), false);
setupPrincipal(ownerAdmin);
return ownerAdmin;
}
protected Principal setupAdminPrincipal(String username) {
UserPrincipal principal = new UserPrincipal(username, null, true);
setupPrincipal(principal);
return principal;
}
protected Principal setupPrincipal(Principal p) {
TestPrincipalProviderSetter.get().setPrincipal(p);
return p;
}
public Role createAdminRole(Owner owner) {
PermissionBlueprint p = new PermissionBlueprint(PermissionType.OWNER, owner,
Access.ALL);
Role role = new Role("testrole" + TestUtil.randomInt());
role.addPermission(p);
return role;
}
/**
* There's no way to really get Guice to perform injections on stuff that
* the JpaPersistModule is creating, so we resort to grabbing the EntityManagerFactory
* after the fact and adding the Validation EventListener ourselves.
* @param inj
*/
private void insertValidationEventListeners(Injector inj) {
Provider<EntityManagerFactory> emfProvider =
inj.getProvider(EntityManagerFactory.class);
HibernateEntityManagerFactory hibernateEntityManagerFactory =
(HibernateEntityManagerFactory) emfProvider.get();
SessionFactoryImpl sessionFactoryImpl =
(SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
EventListenerRegistry registry =
sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);
Provider<BeanValidationEventListener> listenerProvider =
inj.getProvider(BeanValidationEventListener.class);
registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(listenerProvider.get());
registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(listenerProvider.get());
registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener(listenerProvider.get());
}
}