/* * 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 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.enterprise.server.content.test; import java.util.Random; import javax.persistence.Query; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.content.Architecture; import org.rhq.core.domain.content.InstalledPackage; import org.rhq.core.domain.content.Package; import org.rhq.core.domain.content.PackageCategory; import org.rhq.core.domain.content.PackageType; import org.rhq.core.domain.content.PackageVersion; import org.rhq.core.domain.content.ProductVersionPackageVersion; import org.rhq.core.domain.content.Repo; import org.rhq.core.domain.content.RepoPackageVersion; import org.rhq.core.domain.content.ResourceRepo; import org.rhq.core.domain.content.composite.PackageVersionComposite; import org.rhq.core.domain.resource.ProductVersion; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.content.ContentUIManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.util.ResourceTreeHelper; /** * Specifically tests the logic to ensure the query to find what packages can be installed on a resource. * * @author Jason Dobies */ public class ContentUIManagerBeanEligiblePackagesTest extends AbstractEJB3Test { private static final boolean ENABLE_TESTS = true; private final Log log = LogFactory.getLog(this.getClass()); private ContentUIManagerLocal contentUIManager; private SubjectManagerLocal subjectManager; private Architecture architecture; private PackageType packageType1; private Package package1; private Package package2; private Package package3; private Package package4; private RepoPackageVersion repoPackageVersion1; private RepoPackageVersion repoPackageVersion2; private RepoPackageVersion repoPackageVersion3; private RepoPackageVersion repoPackageVersion4; private InstalledPackage installedPackage1; private Resource resource; private ResourceType resourceType; private Repo repo1; private Repo repo2; private ResourceRepo resourceRepo1; private ResourceRepo resourceRepo2; private ProductVersion productVersion1; private ProductVersion productVersion2; // Setup -------------------------------------------- @Override protected void beforeMethod() throws Exception { contentUIManager = LookupUtil.getContentUIManager(); subjectManager = LookupUtil.getSubjectManager(); setupTestEnvironment(); } @Override protected void afterMethod() throws Exception { tearDownTestEnvironment(); } // Test Cases -------------------------------------------- @Test(enabled = ENABLE_TESTS) public void testEligiblePackagesLogic() throws Exception { Subject overlord = subjectManager.getOverlord(); PageControl pageControl = new PageControl(0, 100); PageList<PackageVersionComposite> pageList = contentUIManager.getPackageVersionCompositesByFilter(overlord, resource.getId(), null, pageControl); assert pageList != null : "Null page list returned from query"; /* Expected results: - Package 1 - Included in the list; it has no product version thus is always applicable - Package 2 - Included in the list; it includes the resource's version in its product version list - Package 3 - Not included; it contains a product version list but not the resource's version - Package 4 - Not included; it has no product version but it is already installed on the resource */ for (PackageVersionComposite pvc : pageList.getValues()) { log.warn("Package: " + pvc.getPackageName()); } assert pageList.getTotalSize() == 2 : "Incorrect total size found. Found: " + pageList.getTotalSize(); } private void setupTestEnvironment() throws Exception { getTransactionManager().begin(); try { architecture = em.find(Architecture.class, 1); resourceType = new ResourceType("resourcetype-" + System.currentTimeMillis(), "TestPlugin", ResourceCategory.PLATFORM, null); em.persist(resourceType); // Create resource against which we'll be retrieving packages resource = new Resource("parent" + System.currentTimeMillis(), "name", resourceType); resource.setUuid("" + new Random().nextInt()); resource.setVersion("1.0"); em.persist(resource); // Product versions productVersion1 = new ProductVersion(); productVersion1.setVersion("1.0"); productVersion1.setResourceType(resourceType); em.persist(productVersion1); resource.setProductVersion(productVersion1); productVersion2 = new ProductVersion(); productVersion2.setVersion("2.0"); productVersion2.setResourceType(resourceType); em.persist(productVersion2); // Add package types to resource type packageType1 = new PackageType(); packageType1.setName("package1-" + System.currentTimeMillis()); packageType1.setDescription(""); packageType1.setCategory(PackageCategory.DEPLOYABLE); packageType1.setDisplayName("TestResourcePackage"); packageType1.setCreationData(true); packageType1.setResourceType(resourceType); em.persist(packageType1); resourceType.addPackageType(packageType1); // Package 1 - No product versions specified package1 = new Package("Package1", packageType1); PackageVersion packageVersion1 = new PackageVersion(package1, "1.0.0", architecture); package1.addVersion(packageVersion1); em.persist(package1); // Package 2 - Has list of product versions that contains the resource's version package2 = new Package("Package2", packageType1); PackageVersion packageVersion2 = new PackageVersion(package2, "1.0.0", architecture); ProductVersionPackageVersion pvpv1 = packageVersion2.addProductVersion(productVersion1); ProductVersionPackageVersion pvpv2 = packageVersion2.addProductVersion(productVersion2); package2.addVersion(packageVersion2); em.persist(package2); em.persist(pvpv1); em.persist(pvpv2); // Package 3 - Has list of product versions where the resource version is not included package3 = new Package("Package3", packageType1); PackageVersion packageVersion3 = new PackageVersion(package3, "1.0.0", architecture); ProductVersionPackageVersion pvpv3 = packageVersion3.addProductVersion(productVersion2); package3.addVersion(packageVersion3); em.persist(package3); em.persist(pvpv3); // Package 4 - No product version restriction, but already installed on the resource package4 = new Package("Package4", packageType1); PackageVersion packageVersion4 = new PackageVersion(package4, "1.0.0", architecture); package4.addVersion(packageVersion4); em.persist(package4); // Wire up the repo to the resource and add all of these packages to it repo1 = new Repo("repo-" + RandomStringUtils.randomNumeric(6)); em.persist(repo1); repoPackageVersion1 = repo1.addPackageVersion(packageVersion1); repoPackageVersion2 = repo1.addPackageVersion(packageVersion2); repoPackageVersion3 = repo1.addPackageVersion(packageVersion3); repoPackageVersion4 = repo1.addPackageVersion(packageVersion4); em.persist(repoPackageVersion1); em.persist(repoPackageVersion2); em.persist(repoPackageVersion3); em.persist(repoPackageVersion4); resourceRepo1 = repo1.addResource(resource); em.persist(resourceRepo1); // Subscribe the resource to a second repo to make sure the joins won't duplicate stuff repo2 = new Repo("test-" + RandomStringUtils.randomNumeric(6)); em.persist(repo2); resourceRepo2 = repo2.addResource(resource); em.persist(resourceRepo2); installedPackage1 = new InstalledPackage(); installedPackage1.setResource(resource); installedPackage1.setPackageVersion(packageVersion4); resource.addInstalledPackage(installedPackage1); getTransactionManager().commit(); } catch (Exception e) { e.printStackTrace(); getTransactionManager().rollback(); throw e; } } private void tearDownTestEnvironment() throws Exception { getTransactionManager().begin(); try { Query q = em.createNamedQuery(RepoPackageVersion.DELETE_BY_REPO_ID); q.setParameter("repoId", repo1.getId()); q.executeUpdate(); q = em.createNamedQuery(ResourceRepo.DELETE_BY_RESOURCE_ID); q.setParameter("resourceId", resource.getId()); q.executeUpdate(); getTransactionManager().commit(); } catch (Exception e) { e.printStackTrace(); getTransactionManager().rollback(); throw e; } getTransactionManager().begin(); try { resource = em.find(Resource.class, resource.getId()); for (InstalledPackage ip : resource.getInstalledPackages()) { em.remove(ip); } package1 = em.find(Package.class, package1.getId()); em.remove(package1); package2 = em.find(Package.class, package2.getId()); em.remove(package2); package3 = em.find(Package.class, package3.getId()); em.remove(package3); package4 = em.find(Package.class, package4.getId()); em.remove(package4); packageType1 = em.find(PackageType.class, packageType1.getId()); em.remove(packageType1); ResourceTreeHelper.deleteResource(em, resource); repo1 = em.find(Repo.class, repo1.getId()); em.remove(repo1); repo2 = em.find(Repo.class, repo2.getId()); em.remove(repo2); productVersion1 = em.find(ProductVersion.class, productVersion1.getId()); em.remove(productVersion1); productVersion2 = em.find(ProductVersion.class, productVersion2.getId()); em.remove(productVersion2); resourceType = em.find(ResourceType.class, resourceType.getId()); em.remove(resourceType); getTransactionManager().commit(); } catch (Exception e) { e.printStackTrace(); getTransactionManager().rollback(); throw e; } } }