/* * RHQ Management Platform * Copyright (C) 2005-2014 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.enterprise.server.cloud; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.cloud.Server; import org.rhq.core.domain.cloud.Server.OperationMode; import org.rhq.core.domain.criteria.ServerCriteria; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.test.TestConstants; import org.rhq.enterprise.server.test.TransactionCallback; import org.rhq.enterprise.server.util.CriteriaQuery; import org.rhq.enterprise.server.util.CriteriaQueryExecutor; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.util.ServerFactory; /** * @author Jirka Kremser */ @Test public class TopologyManagerBeanTest extends AbstractEJB3Test { private TopologyManagerLocal topologyManager; private Subject overlord; @Override protected void beforeMethod() throws Exception { topologyManager = LookupUtil.getTopologyManager(); overlord = LookupUtil.getSubjectManager().getOverlord(); } @Test(groups = "integration.ejb3") public void testParsingCriteriaQueryResults1() throws Exception { final int serverCount = 208; executeInTransaction(new TransactionCallback() { public void execute() throws Exception { // verify that all server objects are actually parsed. final Set<String> serverNames = new HashSet<String>(serverCount); serverNames.add(TestConstants.RHQ_TEST_SERVER_NAME); final String prefix = "server"; for (int i = 0; i < serverCount - 1; i++) { String name = prefix + String.format(" %03d", i + 1); Server server = ServerFactory.newInstance(); server.setName(name); server.setOperationMode(OperationMode.NORMAL); server.setAddress("address" + i); server.setPort(7080 + i); server.setSecurePort(7443 + i); em.persist(server); serverNames.add(name); em.flush(); } em.flush(); assertTrue("The number of created servers should be " + serverCount + ". Was: " + serverNames.size(), serverCount == serverNames.size()); // query the results and delete the servers final int pageSize = 42; ServerCriteria criteria = new ServerCriteria(); criteria.addFilterName(prefix); criteria.addSortName(PageOrdering.DESC); // use DESC just to make sure sorting on name is different than insert order criteria.setPaging(0, pageSize); // iterate over the results with CriteriaQuery CriteriaQueryExecutor<Server, ServerCriteria> queryExecutor = new CriteriaQueryExecutor<Server, ServerCriteria>() { @Override public PageList<Server> execute(ServerCriteria criteria) { return topologyManager.findServersByCriteria(overlord, criteria); } }; // initiate first/(total depending on page size) request. CriteriaQuery<Server, ServerCriteria> servers = new CriteriaQuery<Server, ServerCriteria>(criteria, queryExecutor); String prevName = null; // iterate over the entire result set efficiently int actualCount = 0; for (Server s : servers) { assert null == prevName || s.getName().compareTo(prevName) < 0 || s.getName().equals(TestConstants.RHQ_TEST_SERVER_NAME) : "Results should be sorted by name DESC, something is out of order"; prevName = s.getName(); actualCount++; serverNames.remove(s.getName()); } // test that entire list parsed spanning multiple pages assertTrue("Expected resourceNames to be empty. Still " + serverNames.size() + " name(s).", serverNames.size() == 0); assertTrue("Expected " + serverCount + " to be parsed, but there were parsed " + actualCount + " servers", actualCount == serverCount); } }); } @Test(groups = "integration.ejb3") public void testParsingCriteriaQueryResults2() throws Exception { final int serverCount = 307; executeInTransaction(new TransactionCallback() { public void execute() throws Exception { // verify that all server objects are actually parsed. final Set<String> serverNames = new HashSet<String>(serverCount); serverNames.add(TestConstants.RHQ_TEST_SERVER_NAME); final String prefix = "server"; int shouldBeFoundCount = 1; for (int i = 0; i < serverCount - 1; i++) { String name = prefix + String.format(" %03d", i + 1); Server server = ServerFactory.newInstance(); server.setName(name); switch (i % 5) { case 0: case 1: server.setOperationMode(OperationMode.NORMAL); break; case 2: server.setOperationMode(OperationMode.MAINTENANCE); shouldBeFoundCount++; serverNames.add(name); break; case 3: server.setOperationMode(OperationMode.DOWN); shouldBeFoundCount++; serverNames.add(name); break; case 4: server.setOperationMode(OperationMode.INSTALLED); shouldBeFoundCount++; serverNames.add(name); break; } server.setAddress("address" + i); server.setPort(7080 + i); server.setSecurePort(7443 + i); em.persist(server); em.flush(); } em.flush(); // query the results and delete the servers final int pageSize = 24; ServerCriteria criteria = new ServerCriteria(); criteria.addFilterName(prefix); criteria.addFilterOperationMode(OperationMode.MAINTENANCE, OperationMode.DOWN, OperationMode.INSTALLED); criteria.addSortName(PageOrdering.DESC); // use DESC just to make sure sorting on name is different than insert order criteria.setPaging(0, pageSize); // iterate over the results with CriteriaQuery CriteriaQueryExecutor<Server, ServerCriteria> queryExecutor = new CriteriaQueryExecutor<Server, ServerCriteria>() { @Override public PageList<Server> execute(ServerCriteria criteria) { return topologyManager.findServersByCriteria(overlord, criteria); } }; // initiate first/(total depending on page size) request. CriteriaQuery<Server, ServerCriteria> servers = new CriteriaQuery<Server, ServerCriteria>(criteria, queryExecutor); String prevName = null; // iterate over the entire result set efficiently int actualCount = 0; for (Server s : servers) { assert null == prevName || s.getName().compareTo(prevName) < 0 || s.getName().equals(TestConstants.RHQ_TEST_SERVER_NAME) : "Results should be sorted by name DESC, something is out of order"; prevName = s.getName(); actualCount++; if (!serverNames.contains(prevName)) { fail("Following server entity shouldn't be here: " + s); } serverNames.remove(s.getName()); } // test that entire list parsed spanning multiple pages assertTrue("Expected resourceNames to be empty. Still " + serverNames.size() + " name(s).", serverNames.size() == 0); assertTrue("Expected " + shouldBeFoundCount + " to be parsed, but there were parsed " + actualCount + " servers", actualCount == shouldBeFoundCount); } }); } @Test(groups = "integration.ejb3") public void testParsingCriteriaQueryResultsStrict() throws Exception { final int serverCount = 10; executeInTransaction(new TransactionCallback() { public void execute() throws Exception { // verify that all server objects are actually parsed. final Set<String> serverNames = new HashSet<String>(serverCount); final String namePrefix = "server"; final String addressPrefix = "address"; int shouldBeFoundCount = 1; serverNames.add(namePrefix + " 007"); for (int i = 0; i < serverCount; i++) { String name = namePrefix + String.format(" %03d", i + 1); Server server = ServerFactory.newInstance(); server.setName(name); server.setOperationMode(OperationMode.NORMAL); server.setAddress(addressPrefix + i); server.setPort(7080); server.setSecurePort(7443); em.persist(server); em.flush(); } em.flush(); // query the results and delete the servers final int pageSize = 2; final int startPage = 0; ServerCriteria criteria = new ServerCriteria(); criteria.addFilterName(namePrefix + " 007"); criteria.setStrict(true); criteria.setPaging(startPage, pageSize); // iterate over the results with CriteriaQuery CriteriaQueryExecutor<Server, ServerCriteria> queryExecutor = new CriteriaQueryExecutor<Server, ServerCriteria>() { @Override public PageList<Server> execute(ServerCriteria criteria) { return topologyManager.findServersByCriteria(overlord, criteria); } }; // initiate first/(total depending on page size) request. CriteriaQuery<Server, ServerCriteria> servers = new CriteriaQuery<Server, ServerCriteria>(criteria, queryExecutor); String prevName = null; // iterate over the entire result set efficiently int actualCount = 0; for (Server s : servers) { assert null == prevName || s.getName().compareTo(prevName) < 0 : "Results should be sorted by name DESC, something is out of order"; prevName = s.getName(); actualCount++; serverNames.remove(s.getName()); } // test that entire list parsed spanning multiple pages assertTrue("Expected resourceNames to be empty. Still " + serverNames.size() + " name(s).", serverNames.size() == 0); assertTrue("Expected " + shouldBeFoundCount + " to be parsed, but there were parsed " + actualCount + " servers", actualCount == shouldBeFoundCount); } }); } @Test(groups = "integration.ejb3") public void testParsingAllCriteriaQueryResults1() throws Exception { int startPage = 0; int pageSize = 3; int serverCount = 605; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults2() throws Exception { int startPage = 1; int pageSize = 3; int serverCount = 605; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults3() throws Exception { int startPage = 2; int pageSize = 3; int serverCount = 609; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults4() throws Exception { int startPage = 3; int pageSize = 7; int serverCount = 800; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults5() throws Exception { int startPage = 4; int pageSize = 2; int serverCount = 444; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults6() throws Exception { int startPage = 5; int pageSize = 3; int serverCount = 605; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults7() throws Exception { int startPage = 1; int pageSize = 5; int serverCount = 934; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults8() throws Exception { int startPage = 4; int pageSize = 7; int serverCount = 1234; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults9() throws Exception { int startPage = 2; int pageSize = 1; int serverCount = 109; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3", enabled = true) public void testParsingAllCriteriaQueryResults10() throws Exception { int startPage = 0; int pageSize = 11; int serverCount = 999; testParsingHelperStartingPageEqualTo(startPage, pageSize, serverCount); } @Test(groups = "integration.ejb3") public void testFindNonExistentServer() throws Exception { final int serverCount = 5; executeInTransaction(new TransactionCallback() { public void execute() throws Exception { final String namePrefix = "server"; final String addressPrefix = "address"; for (int i = 0; i < serverCount; i++) { String name = namePrefix + String.format(" %03d", i + 1); Server server = ServerFactory.newInstance(); server.setName(name); server.setOperationMode(OperationMode.NORMAL); server.setAddress(addressPrefix + i); server.setPort(7080); server.setSecurePort(7443); em.persist(server); em.flush(); } em.flush(); ServerCriteria criteria = new ServerCriteria(); criteria.addFilterName("very unlikely name of a server"); criteria.setStrict(true); PageList<Server> servers = topologyManager.findServersByCriteria(overlord, criteria); assertNotNull("The result of topologyManager.findServersByCriteria() is null", servers); assertTrue("Some servers have been found, even if they shouldn't", servers.isEmpty()); criteria = new ServerCriteria(); criteria.addFilterSecurePort(1000); servers = topologyManager.findServersByCriteria(overlord, criteria); assertNotNull("The result of topologyManager.findServersByCriteria() is null", servers); assertTrue("Some servers have been found, even if they shouldn't", servers.isEmpty()); criteria = new ServerCriteria(); criteria.addFilterAffinityGroupId(Integer.MAX_VALUE / 2); servers = topologyManager.findServersByCriteria(overlord, criteria); assertNotNull("The result of topologyManager.findServersByCriteria() is null", servers); assertTrue("Some servers have been found, even if they shouldn't", servers.isEmpty()); } }); } private void testParsingHelperStartingPageEqualTo(final int startPage, final int pageSize, final int serverCount) throws Exception { executeInTransaction(new TransactionCallback() { public void execute() throws Exception { // verify that all server objects are actually parsed. final Set<String> serverNames = new TreeSet<String>(); final String namePrefix = "server"; final String addressPrefix = "address"; int shouldBeFoundCount = 0; int shouldBeSkipped = pageSize * startPage; for (int i = 0; i < serverCount; i++) { String name = namePrefix + String.format(" %03d", i + 1); Server server = ServerFactory.newInstance(); server.setName(name); switch (i % 2) { case 0: server.setOperationMode(OperationMode.NORMAL); break; case 1: server.setOperationMode(OperationMode.MAINTENANCE); if (i % 20 == 9) { shouldBeFoundCount++; serverNames.add(name); } break; } server.setAddress(addressPrefix + i); server.setPort(7080 + (i % 20)); server.setSecurePort(7443 + (i % 20)); em.persist(server); em.flush(); } em.flush(); if (shouldBeSkipped > 0) { // delete the members to be skipped because of the start page String[] serverNamesArray = serverNames.toArray(new String[serverNames.size()]); for (int i = 0; i < shouldBeSkipped; i++) { serverNames.remove(serverNamesArray[serverNamesArray.length - i - 1]); } shouldBeFoundCount -= shouldBeSkipped; } // query the results and delete the servers ServerCriteria criteria = new ServerCriteria(); criteria.addFilterOperationMode(OperationMode.MAINTENANCE); criteria.addFilterPort(7089); criteria.addFilterSecurePort(7452); criteria.addFilterName(namePrefix); criteria.addFilterAddress(addressPrefix); criteria.addSortName(PageOrdering.DESC); // use DESC just to make sure sorting on name is different than insert order criteria.setPaging(startPage, pageSize); // iterate over the results with CriteriaQuery CriteriaQueryExecutor<Server, ServerCriteria> queryExecutor = new CriteriaQueryExecutor<Server, ServerCriteria>() { @Override public PageList<Server> execute(ServerCriteria criteria) { return topologyManager.findServersByCriteria(overlord, criteria); } }; // initiate first/(total depending on page size) request. CriteriaQuery<Server, ServerCriteria> servers = new CriteriaQuery<Server, ServerCriteria>(criteria, queryExecutor); String prevName = null; // iterate over the entire result set efficiently int actualCount = 0; for (Server s : servers) { assert null == prevName || s.getName().compareTo(prevName) < 0 : "Results should be sorted by name DESC, something is out of order"; prevName = s.getName(); actualCount++; serverNames.remove(s.getName()); } // test that entire list parsed spanning multiple pages assertTrue("Expected resourceNames to be empty. Still " + serverNames.size() + " name(s).", serverNames.size() == 0); assertTrue("Expected " + shouldBeFoundCount + " to be parsed, but there were parsed " + actualCount + " servers", actualCount == shouldBeFoundCount); } }); } }