/* * 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, 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.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.persistence.EntityManager; import javax.persistence.Query; import org.rhq.core.domain.alert.AlertCondition; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.content.ContentSource; import org.rhq.core.domain.content.ContentSourceType; import org.rhq.core.domain.content.InstalledPackageHistory; import org.rhq.core.domain.content.PackageBits; import org.rhq.core.domain.content.PackageVersion; import org.rhq.core.domain.content.Repo; import org.rhq.core.domain.measurement.MeasurementBaseline; import org.rhq.core.domain.measurement.MeasurementOOB; import org.rhq.core.domain.measurement.NumericType; import org.rhq.core.domain.resource.CreateResourceHistory; import org.rhq.core.domain.resource.DeleteResourceHistory; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.shared.TransactionCallback; import org.rhq.core.util.exception.ThrowableUtil; import org.testng.annotations.Test; /** * Use this to explicitly test any of our named queries with any set of parameters. Useful to make sure these run on * both postgres and oracle, specifically those that try to do select distinct queries while retrieve LOB columns. */ @Test(groups = "integration.ejb3") public class QueriesTest extends AbstractEJB3Test { private Map<String, Map<String, Object>> queries; // here just so we dont have to pass it to the add() public void testQueries() throws Exception { queries = new HashMap<String, Map<String, Object>>(); ////////////////////////////////////////// // ADD YOUR QUERIES WITH THEIR PARAMS HERE add(Configuration.QUERY_GET_PLUGIN_CONFIG_MAP_BY_GROUP_ID, new Object[] { "resourceGroupId", 1 }); add(Configuration.QUERY_GET_RESOURCE_CONFIG_MAP_BY_GROUP_ID, new Object[] { "resourceGroupId", 1 }); add(PackageVersion.QUERY_FIND_BY_REPO_ID, new Object[] { "repoId", 1 }); add(PackageVersion.QUERY_FIND_METADATA_BY_RESOURCE_ID, new Object[] { "resourceId", 1 }); add(PackageVersion.QUERY_FIND_BY_REPO_ID_WITH_PACKAGE, new Object[] { "repoId", 1 }); add(MeasurementOOB.COUNT_FOR_DATE, new Object[] { "timestamp", 1L }); add(Repo.QUERY_FIND_AVAILABLE_REPO_COMPOSITES_BY_RESOURCE_ID_ADMIN, new Object[] { "resourceId", 1 }); add(PackageBits.QUERY_PACKAGE_BITS_LOADED_STATUS_PACKAGE_VERSION_ID, new Object[] { "id", 1 }); add(CreateResourceHistory.QUERY_FIND_BY_PARENT_RESOURCE_ID, new Object[] { "id", 1, "startTime", null, "endTime", null }); add(DeleteResourceHistory.QUERY_FIND_BY_PARENT_RESOURCE_ID, new Object[] { "id", 1, "startTime", null, "endTime", null }); add(ContentSource.QUERY_FIND_ALL_WITH_CONFIG, new Object[] {}); add(InstalledPackageHistory.QUERY_FIND_BY_CSR_ID_AND_PKG_VER_ID, new Object[] { "contentServiceRequestId", 1, "packageVersionId", 1 }); add(PackageVersion.QUERY_GET_PKG_BITS_LENGTH_BY_PKG_DETAILS_AND_RES_ID, new Object[] { "packageName", "foo", "packageTypeName", "bar", "resourceId", 1, "architectureName", "blah", "version", "ver" }); add(MeasurementBaseline.QUERY_FIND_BY_COMPUTE_TIME, new Object[] { "computeTime", 1L, "numericType", NumericType.DYNAMIC }); Object a[] = new Object[]{ "agentId", null }; Object ac[] = new Object[]{ "agentId", null, "category", null }; add(AlertCondition.QUERY_BY_CATEGORY_AVAILABILITY, ac); add(AlertCondition.QUERY_BY_CATEGORY_BASELINE, a); add(AlertCondition.QUERY_BY_CATEGORY_CHANGE, a); add(AlertCondition.QUERY_BY_CATEGORY_CONTROL, a); add(AlertCondition.QUERY_BY_CATEGORY_COUNT_BASELINE, a); add(AlertCondition.QUERY_BY_CATEGORY_COUNT_PARAMETERIZED, ac); add(AlertCondition.QUERY_BY_CATEGORY_DRIFT, a); add(AlertCondition.QUERY_BY_CATEGORY_EVENT, a); add(AlertCondition.QUERY_BY_CATEGORY_RANGE, a); add(AlertCondition.QUERY_BY_CATEGORY_RESOURCE_CONFIG, a); add(AlertCondition.QUERY_BY_CATEGORY_THRESHOLD, a); add(AlertCondition.QUERY_BY_CATEGORY_TRAIT, a); // //////////////////////////////////////////// Map<String, Throwable> errors = new TreeMap<String, Throwable>(); // tree map so I sort output by query name for (Map.Entry<String, Map<String, Object>> entry : queries.entrySet()) { getTransactionManager().begin(); Query q = getEntityManager().createNamedQuery(entry.getKey()); for (Map.Entry<String, Object> param : entry.getValue().entrySet()) { q.setParameter(param.getKey(), param.getValue()); } try { assert null != q.getResultList(); } catch (Throwable t) { errors.put(entry.getKey(), t); } finally { getTransactionManager().rollback(); } } if (errors.size() > 0) { System.out.println("---" + errors.size() + " OUT OF " + queries.size() + " QUERIES FAILED---"); System.out.println("---" + errors.size() + " QUERIES THAT FAILED (start)---"); int i = 1; for (Map.Entry<String, Throwable> entry : errors.entrySet()) { System.out.println(); System.out.println("QUERY FAILURE #" + i++); System.out.println(entry.getKey() + " --> " + ThrowableUtil.getAllMessages(entry.getValue())); } System.out.println("---" + errors.size() + " QUERIES THAT FAILED (end)---"); System.out.println("---" + errors.size() + " OUT OF " + queries.size() + " QUERIES FAILED---"); assert false : "See stdout for the list of " + errors.size() + " queries that failed"; } } private void add(String queryName, Object[] params) { Map<String, Object> paramsMap = new HashMap<String, Object>(); for (int i = 0; i < params.length; i += 2) { paramsMap.put(params[i].toString(), params[i + 1]); } queries.put(queryName, paramsMap); } public void testAsyncUninventory() throws Exception { executeInTransaction(new TransactionCallback() { public void execute() throws Exception { EntityManager entityManager = getEntityManager(); Query q = entityManager.createNamedQuery(Resource.QUERY_MARK_RESOURCES_FOR_ASYNC_DELETION_QUICK); List<Integer> ids = new ArrayList<Integer>(); ids.add(1); q.setParameter("resourceIds", ids); q.setParameter("status", InventoryStatus.UNINVENTORIED); q.executeUpdate(); } }); } public void testLongVarChar() throws Exception { executeInTransaction(new TransactionCallback() { public void execute() throws Exception { EntityManager entityManager = getEntityManager(); // I just want to see this tested even though I haven't seen this fail on oracle or postgres ever ContentSourceType cst = new ContentSourceType("testLongVarCharCST"); entityManager.persist(cst); ContentSource cs = new ContentSource("testLongVarCharCS", cst); cs.setLoadErrorMessage("longvarchar column here"); entityManager.persist(cs); Query q = entityManager.createNamedQuery(ContentSource.QUERY_FIND_BY_ID_WITH_CONFIG); ContentSource result = (ContentSource) q.setParameter("id", cs.getId()).getSingleResult(); assert result != null; assert "longvarchar column here".equals(result.getLoadErrorMessage()); } }); } }