/*
* RHQ Management Platform
* Copyright (C) 2005-2010 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.bundle.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.testng.annotations.Test;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.BundleVersionRepo;
import org.rhq.core.domain.bundle.BundleVersionRepoPK;
import org.rhq.core.domain.content.PackageCategory;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.test.AbstractEJB3Test;
@Test
@SuppressWarnings("unchecked")
public class BundleTest extends AbstractEJB3Test {
private static final boolean ENABLED = true;
@Test(enabled = ENABLED, groups = "integration.ejb3")
public void testBundleVersionRepo() throws Throwable {
getTransactionManager().begin();
EntityManager em = getEntityManager();
try {
int id;
String name = "BundleTest-testBundleVersionRepo";
String recipe = "action/script/recipe is here";
Repo repo1 = new Repo(name + "-Repo1");
Repo repo2 = new Repo(name + "-Repo2");
em.persist(repo1);
em.persist(repo2);
assert repo1.getId() > 0;
assert repo2.getId() > 0;
Query q = em.createNamedQuery(BundleVersionRepo.QUERY_FIND_BY_REPO_ID_NO_FETCH);
q.setParameter("id", repo1.getId());
assert q.getResultList().size() == 0 : "should not have repo1 mapping in the db yet";
q.setParameter("id", repo2.getId());
assert q.getResultList().size() == 0 : "should not have repo2 mapping in the db yet";
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
Bundle bundle = createBundle(em, name + "-Bundle", bundleType);
BundleVersion bundleVersion = new BundleVersion(name, "1.0.0.BETA", bundle, recipe);
bundleVersion.setVersionOrder(0);
em.persist(bundleVersion);
id = bundleVersion.getId();
assert id > 0;
assert bundleVersion.getBundle().getId() != 0 : "bundle should have been cascade persisted too";
assert bundleVersion.getBundle().getBundleType().getId() != 0 : "bundleType should have been cascade persisted too";
BundleVersionRepo bvr1 = new BundleVersionRepo(bundleVersion, repo1);
BundleVersionRepo bvr2 = new BundleVersionRepo(bundleVersion, repo2);
em.persist(bvr1);
em.persist(bvr2);
q = em.createNamedQuery(BundleVersionRepo.QUERY_FIND_BY_REPO_ID_NO_FETCH);
q.setParameter("id", repo1.getId());
assert q.getResultList().size() == 1;
assert ((BundleVersionRepo) q.getSingleResult()).getBundleVersionRepoPK().getBundleVersion()
.equals(bundleVersion);
assert ((BundleVersionRepo) q.getSingleResult()).getBundleVersionRepoPK().getRepo().equals(repo1);
q.setParameter("id", repo2.getId());
assert q.getResultList().size() == 1;
assert ((BundleVersionRepo) q.getSingleResult()).getBundleVersionRepoPK().getBundleVersion()
.equals(bundleVersion);
assert ((BundleVersionRepo) q.getSingleResult()).getBundleVersionRepoPK().getRepo().equals(repo2);
q = em.createNamedQuery(BundleVersionRepo.QUERY_FIND_BY_BUNDLE_VERSION_ID_NO_FETCH);
q.setParameter("id", bundleVersion.getId());
List<BundleVersionRepo> resultList = q.getResultList();
assert resultList.size() == 2;
BundleVersionRepoPK pk1 = new BundleVersionRepoPK(bundleVersion, repo1);
BundleVersionRepoPK pk2 = new BundleVersionRepoPK(bundleVersion, repo2);
if (resultList.get(0).getBundleVersionRepoPK().getRepo().equals(repo1)) {
assert bvr1.equals(resultList.get(0));
assert bvr2.equals(resultList.get(1));
assert pk1.equals(resultList.get(0).getBundleVersionRepoPK());
assert pk2.equals(resultList.get(1).getBundleVersionRepoPK());
} else {
assert bvr1.equals(resultList.get(1));
assert bvr2.equals(resultList.get(0));
assert pk1.equals(resultList.get(1).getBundleVersionRepoPK());
assert pk2.equals(resultList.get(0).getBundleVersionRepoPK());
}
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
getTransactionManager().rollback();
}
}
@Test(enabled = ENABLED, groups = "integration.ejb3")
public void testBundleVersion() throws Throwable {
getTransactionManager().begin();
EntityManager em = getEntityManager();
try {
int id;
String name = "BundleTest-testBundleVersion";
String recipe = "action/script/recipe is here";
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
Bundle bundle = createBundle(em, name + "-Bundle", bundleType);
id = bundle.getId();
assert id > 0;
assert bundle.getBundleType().getId() != 0 : "bundleType should have been cascade persisted too";
BundleVersion bv = new BundleVersion(name, "1.0.0.BETA", bundle, recipe);
bv.setVersionOrder(777);
Query q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", bv.getName());
assert q.getResultList().size() == 0; // not in the db yet
em.persist(bv);
id = bv.getId();
assert id > 0;
q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", bv.getName());
assert q.getResultList().size() == 1;
assert ((BundleVersion) q.getSingleResult()).getName().equals(bv.getName());
BundleVersion bvFind = em.find(BundleVersion.class, id);
assert bvFind != null;
assert bvFind.getId() == bv.getId();
assert bvFind.getName().equals(bv.getName());
assert bvFind.getVersion().equals(bv.getVersion());
assert bvFind.getVersionOrder() == bv.getVersionOrder();
assert bvFind.getRecipe().equals(bv.getRecipe());
assert bvFind.getBundle().equals(bv.getBundle());
assert bvFind.equals(bv);
assert bvFind.hashCode() == bv.hashCode();
// clean up - delete our test entity
em.clear();
q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", bv.getName());
BundleVersion doomed = (BundleVersion) q.getSingleResult();
doomed = em.getReference(BundleVersion.class, doomed.getId());
em.remove(doomed);
assert q.getResultList().size() == 0 : "didn't remove the entity";
em.clear();
// make sure we didn't delete the bundle - it should not be cascade deleted
q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", bundle.getName());
assert q.getResultList().size() == 1;
bundle = (Bundle) q.getSingleResult();
bundleType = bundle.getBundleType();
Repo repo = bundle.getRepo();
em.remove(bundle);
em.remove(repo);
deleteResourceType(em, bundleType.getResourceType());
assert q.getResultList().size() == 0 : "didn't clean up test bundle";
assert em.find(BundleType.class, bundleType.getId()) == null : "didn't clean up bundle type";
em.clear();
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
getTransactionManager().rollback();
}
}
@Test(enabled = ENABLED, groups = "integration.ejb3")
public void testMultipleBundleVersions() throws Throwable {
getTransactionManager().begin();
EntityManager em = getEntityManager();
try {
int id;
String name = "BundleTest-testMultipleBundleVersions";
String recipe = "action/script/recipe is here";
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
Bundle bundle = createBundle(em, name + "-Bundle", bundleType);
id = bundle.getId();
assert id > 0;
assert bundle.getBundleType().getId() != 0 : "bundleType should have been cascade persisted too";
// make sure these queries can return empty lists
Query q = em.createNamedQuery(BundleVersion.QUERY_FIND_LATEST_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
assert q.getResultList().size() == 0;
q = em.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
assert q.getResultList().size() == 0;
q = em.createNamedQuery(BundleVersion.UPDATE_VERSION_ORDER_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
q.setParameter("versionOrder", 0);
assert q.executeUpdate() == 0 : "should not have updated anything";
BundleVersion bv = new BundleVersion(name, "1.0", bundle, recipe);
bv.setVersionOrder(0);
q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 0; // not in the db yet
em.persist(bv);
id = bv.getId();
assert id > 0;
BundleVersion bv2 = new BundleVersion(name, "2.0", bundle, recipe);
bv2.setVersionOrder(1);
q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 1;
em.persist(bv2);
id = bv2.getId();
assert id > 0;
q = em.createNamedQuery(BundleVersion.QUERY_FIND_LATEST_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
assert q.getResultList().size() == 1;
assert ((BundleVersion) q.getSingleResult()).getVersion().equals(bv2.getVersion());
q = em.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
List<Object[]> versionsArrays = q.getResultList(); // returns in DESC sort order!
assert versionsArrays.size() == 2;
assert ((String) versionsArrays.get(0)[0]).equals(bv2.getVersion());
assert ((Number) versionsArrays.get(0)[1]).intValue() == bv2.getVersionOrder();
assert ((String) versionsArrays.get(1)[0]).equals(bv.getVersion());
assert ((Number) versionsArrays.get(1)[1]).intValue() == bv.getVersionOrder();
// increment all version orders, starting at order #1
q = em.createNamedQuery(BundleVersion.UPDATE_VERSION_ORDER_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
q.setParameter("versionOrder", 1);
assert q.executeUpdate() == 1 : "should have auto-incremented version order in one row";
em.flush();
em.clear();
bv = em.find(BundleVersion.class, bv.getId());
assert bv.getVersionOrder() == 0 : "should not have incremented version order";
bv2 = em.find(BundleVersion.class, bv2.getId());
assert bv2.getVersionOrder() == 2 : "didn't increment version order";
BundleVersion bv3 = new BundleVersion(name, "1.5", bundle, recipe);
bv3.setVersionOrder(1);
q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 2;
em.persist(bv3);
id = bv3.getId();
assert id > 0;
q = em.createNamedQuery(BundleVersion.QUERY_FIND_LATEST_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
assert q.getResultList().size() == 1;
assert ((BundleVersion) q.getSingleResult()).getVersion().equals(bv2.getVersion());
q = em.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
versionsArrays = q.getResultList(); // returns in DESC sort order!
assert versionsArrays.size() == 3;
assert ((String) versionsArrays.get(0)[0]).equals(bv2.getVersion()); // 2.0
assert ((Number) versionsArrays.get(0)[1]).intValue() == bv2.getVersionOrder();
assert ((String) versionsArrays.get(1)[0]).equals(bv3.getVersion()); // 1.5
assert ((Number) versionsArrays.get(1)[1]).intValue() == bv3.getVersionOrder();
assert ((String) versionsArrays.get(2)[0]).equals(bv.getVersion()); // 1.0
assert ((Number) versionsArrays.get(2)[1]).intValue() == bv.getVersionOrder();
// increment all version orders, starting at order #0 - makes sure we can update >1 rows
q = em.createNamedQuery(BundleVersion.UPDATE_VERSION_ORDER_BY_BUNDLE_ID);
q.setParameter("bundleId", bundle.getId());
q.setParameter("versionOrder", 0);
assert q.executeUpdate() == 3 : "should have auto-incremented version orders";
em.flush();
em.clear();
bv = em.find(BundleVersion.class, bv.getId());
assert bv.getVersionOrder() == 1 : "didn't increment version order: " + bv.getVersionOrder();
bv2 = em.find(BundleVersion.class, bv2.getId());
assert bv2.getVersionOrder() == 3 : "didn't increment version order: " + bv2.getVersionOrder();
bv3 = em.find(BundleVersion.class, bv3.getId());
assert bv3.getVersionOrder() == 2 : "didn't increment version order: " + bv3.getVersionOrder();
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
getTransactionManager().rollback();
}
}
@Test(enabled = ENABLED, groups = "integration.ejb3")
public void testBundle() throws Throwable {
getTransactionManager().begin();
EntityManager em = getEntityManager();
try {
int id;
String name = "BundleTest-testBundle-Bundle";
Query q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 0; // not in the db yet
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
Bundle b = createBundle(em, name, bundleType);
id = b.getId();
assert id > 0;
assert b.getBundleType().getId() != 0 : "bundleType should have been persisted independently";
assert b.getRepo().getId() != 0 : "bundle's repo should have been cascade persisted with the bundle";
assert b.getName().equals(b.getRepo().getName()) : "bundle's repo should have same name as bundle";
q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 1;
assert ((Bundle) q.getSingleResult()).getName().equals(b.getName());
Bundle bFind = em.find(Bundle.class, id);
assert bFind != null;
assert bFind.getId() == b.getId();
assert bFind.getName().equals(b.getName());
assert bFind.getBundleType().equals(b.getBundleType());
assert bFind.equals(b);
assert bFind.hashCode() == b.hashCode();
// clean up - delete our test entity
em.clear();
q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", b.getName());
Bundle doomed = (Bundle) q.getSingleResult();
doomed = em.getReference(Bundle.class, doomed.getId());
em.remove(doomed);
assert q.getResultList().size() == 0 : "didn't remove the entity";
em.clear();
// make sure we didn't delete the bundle type - it should not be cascade deleted
q = em.createNamedQuery(BundleType.QUERY_FIND_BY_NAME);
q.setParameter("name", bFind.getBundleType().getName());
assert q.getResultList().size() == 1;
BundleType bt = (BundleType) q.getSingleResult();
em.remove(bt);
assert q.getResultList().size() == 0 : "didn't clean up test bundle type";
deleteResourceType(em, bundleType.getResourceType());
em.clear();
// make sure we didn't cascade delete the repo, it must also be deleted manually
q = em.createNamedQuery(Repo.QUERY_FIND_BY_NAME);
q.setParameter("name", bFind.getRepo().getName());
assert q.getResultList().size() == 1 : "didn't clean up test repo";
em.clear();
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
getTransactionManager().rollback();
}
}
@Test(enabled = ENABLED, groups = "integration.ejb3")
public void testBundleType() throws Throwable {
getTransactionManager().begin();
EntityManager em = getEntityManager();
try {
int id;
String name = "BundleTest-testBundleType";
Query q = em.createNamedQuery(BundleType.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 0; // not in the db yet
BundleType bt = createBundleType(em, name, createResourceType(em));
id = bt.getId();
assert id > 0;
q = em.createNamedQuery(BundleType.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 1;
assert ((BundleType) q.getSingleResult()).getName().equals(bt.getName());
BundleType btFind = em.find(BundleType.class, id);
assert btFind != null;
assert btFind.getId() == bt.getId();
assert btFind.getName().equals(bt.getName());
assert btFind.equals(bt);
assert btFind.hashCode() == bt.hashCode();
// clean up - delete our test entity
em.clear();
q = em.createNamedQuery(BundleType.QUERY_FIND_BY_NAME);
q.setParameter("name", bt.getName());
BundleType doomed = (BundleType) q.getSingleResult();
doomed = em.getReference(BundleType.class, doomed.getId());
em.remove(doomed);
assert q.getResultList().size() == 0 : "didn't remove the entity";
deleteResourceType(em, bt.getResourceType());
em.clear();
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
getTransactionManager().rollback();
}
}
private ResourceType createResourceType(EntityManager em) {
ResourceType rt = new ResourceType("BundleTest", "BundleTestPlugin", ResourceCategory.PLATFORM, null);
em.persist(rt);
return rt;
}
private BundleType createBundleType(EntityManager em, String name, ResourceType rt) throws Exception {
BundleType bt = new BundleType(name, rt);
em.persist(bt);
return bt;
}
private Bundle createBundle(EntityManager em, String name, BundleType bt) throws Exception {
// implicit Bundle'sRepo
Repo repo = new Repo(name);
repo.setCandidate(false);
repo.setSyncSchedule(null);
em.persist(repo);
// Bundle's packageType
PackageType pt = new PackageType(name, bt.getResourceType());
pt.setCategory(PackageCategory.BUNDLE);
Bundle bundle = new Bundle(name, bt, repo, pt);
em.persist(bundle);
return bundle;
}
private ResourceType deleteResourceType(EntityManager em, ResourceType rt) {
rt = em.find(ResourceType.class, rt.getId());
em.remove(rt);
return rt;
}
}