/* * RHQ Management Platform * Copyright (C) 2005-2012 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.resource.test; import java.io.InputStream; import java.net.URL; import java.util.List; import java.util.Random; import java.util.Set; import java.util.UUID; import javax.ejb.EJBException; import org.testng.annotations.Test; import org.rhq.core.clientapi.agent.PluginContainerException; import org.rhq.core.clientapi.agent.inventory.CreateResourceRequest; import org.rhq.core.clientapi.agent.inventory.CreateResourceResponse; import org.rhq.core.clientapi.agent.inventory.DeleteResourceRequest; import org.rhq.core.clientapi.agent.inventory.DeleteResourceResponse; import org.rhq.core.clientapi.agent.inventory.ResourceFactoryAgentService; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.content.PackageCategory; import org.rhq.core.domain.content.PackageType; import org.rhq.core.domain.resource.CreateDeletePolicy; import org.rhq.core.domain.resource.CreateResourceHistory; import org.rhq.core.domain.resource.CreateResourceStatus; import org.rhq.core.domain.resource.DeleteResourceHistory; import org.rhq.core.domain.resource.DeleteResourceStatus; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceCreationDataType; 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.discovery.DiscoveryBossLocal; import org.rhq.enterprise.server.resource.ResourceFactoryManagerLocal; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.test.StandardServerPluginService; import org.rhq.enterprise.server.test.TestServerCommunicationsService; import org.rhq.enterprise.server.util.LookupUtil; /** * A unit test for {@link org.rhq.enterprise.server.resource.ResourceFactoryManagerBean}. * * @author Jason Dobies */ public class ResourceFactoryManagerBeanTest extends AbstractEJB3Test { private static final String TEST_PLUGIN_NAME = "TestPlugin"; // Attributes -------------------------------------------- private ResourceFactoryManagerLocal resourceFactoryManager; private ResourceManagerLocal resourceManager; private DiscoveryBossLocal discoveryBoss; private Subject overlord; private MockResourceFactoryAgentService mockAgentService = new MockResourceFactoryAgentService(); // Populated during setupResourceEnvironment private Resource parentResource; private ResourceType parentResourceType; private ResourceType contentBackedChildResourceType; private ResourceType configBackedChildResourceType1; private ResourceType configBackedChildResourceType2; private PackageType packageType; // Setup -------------------------------------------- @Override protected void beforeMethod() throws Exception { resourceFactoryManager = LookupUtil.getResourceFactoryManager(); resourceManager = LookupUtil.getResourceManager(); discoveryBoss = LookupUtil.getDiscoveryBoss(); overlord = LookupUtil.getSubjectManager().getOverlord(); prepareScheduler(); TestServerCommunicationsService agentServiceContainer = prepareForTestAgents(); agentServiceContainer.resourceFactoryService = mockAgentService; //the server plugins are in play when package types are involved StandardServerPluginService serverPluginService = new StandardServerPluginService(getTempDir()); prepareCustomServerPluginService(serverPluginService); serverPluginService.startMasterPluginContainer(); setupResourceEnvironment(); } @Override protected void afterMethod() throws Exception { unprepareForTestAgents(); unprepareScheduler(); unprepareServerPluginService(); teardownResourceEnvironment(); } // Test Cases -------------------------------------------- @Test public void createResourceViaConfiguration() throws Exception { // Setup mockAgentService.setCreateReturnStatus(CreateResourceStatus.SUCCESS); // Assemble call parameters Subject overlord = LookupUtil.getSubjectManager().getOverlord(); Configuration resourceConfiguration = new Configuration(); resourceConfiguration.put(new PropertySimple("property1", "value1")); // Test resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType1.getId(), "newResource", null, resourceConfiguration); // Verify try { getTransactionManager().begin(); Resource parent = em.find(Resource.class, parentResource.getId()); List<CreateResourceHistory> historyList = parent.getCreateChildResourceRequests(); assert historyList.size() == 1 : "Incorrect number of children found. Expected: 1, Found: " + historyList.size(); CreateResourceHistory historyItem = historyList.get(0); assert historyItem.getStatus() == CreateResourceStatus.SUCCESS : "Incorrect status for history item. Expected: Success, Found: " + historyItem.getStatus(); assert historyItem.getNewResourceKey().equals("mockResourceKey") : "Incorrect resource key for history item. Expected: mockResourceKey, Found: " + historyItem.getNewResourceKey(); assert historyItem.getErrorMessage() == null : "Error message found for successful call"; assert historyItem.getConfiguration() != null : "Null configuration found for history item"; } finally { getTransactionManager().rollback(); } } @Test public void createResourceViaConfigurationFailure() throws Exception { // Setup mockAgentService.setCreateReturnStatus(CreateResourceStatus.FAILURE); // Assemble call parameters Subject overlord = LookupUtil.getSubjectManager().getOverlord(); Configuration resourceConfiguration = new Configuration(); resourceConfiguration.put(new PropertySimple("property1", "value1")); // Test resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType1.getId(), "newResource", null, resourceConfiguration); // Verify try { getTransactionManager().begin(); Resource parent = em.find(Resource.class, parentResource.getId()); List<CreateResourceHistory> historyList = parent.getCreateChildResourceRequests(); assert historyList.size() == 1 : "Incorrect number of children found. Expected: 1, Found: " + historyList.size(); CreateResourceHistory historyItem = historyList.get(0); assert historyItem.getStatus() == CreateResourceStatus.FAILURE : "Incorrect status for history item. Expected: Failure, Found: " + historyItem.getStatus(); assert historyItem.getErrorMessage().equals("errorMessage") : "Incorrect error message for history item. Expected: errorMessage, Found: " + historyItem.getErrorMessage(); } finally { getTransactionManager().rollback(); } } @Test public void createSingletonResourceViaConfiguration() throws Exception { // Setup mockAgentService.setCreateReturnStatus(CreateResourceStatus.SUCCESS); // Assemble call parameters Subject overlord = LookupUtil.getSubjectManager().getOverlord(); Configuration resourceConfiguration = new Configuration(); resourceConfiguration.put(new PropertySimple("property1", "value1")); // Test CreateResourceHistory history1 = resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType2.getId(), "newResource", null, resourceConfiguration); // Verify try { getTransactionManager().begin(); Resource parent = em.find(Resource.class, parentResource.getId()); List<CreateResourceHistory> historyList = parent.getCreateChildResourceRequests(); assert historyList.size() == 1 : "Incorrect number of children found. Expected: 1, Found: " + historyList.size(); CreateResourceHistory historyItem = historyList.get(0); assert historyItem.getStatus() == CreateResourceStatus.SUCCESS : "Incorrect status for history item. Expected: Success, Found: " + historyItem.getStatus(); assert historyItem.getNewResourceKey().equals("mockResourceKey") : "Incorrect resource key for history item. Expected: mockResourceKey, Found: " + historyItem.getNewResourceKey(); assert historyItem.getErrorMessage() == null : "Error message found for successful call"; assert historyItem.getConfiguration() != null : "Null configuration found for history item"; } finally { getTransactionManager().rollback(); } // Invoke the same callbacks the plugin container would to actually commit the new Resource to inventory. resourceFactoryManager.completeCreateResource(new CreateResourceResponse(history1.getId(), "newResource", "key", CreateResourceStatus.SUCCESS, null, new Configuration())); Resource resource = new Resource(1000000); resource.setUuid(UUID.randomUUID().toString()); resource.setResourceType(configBackedChildResourceType2); long randomLong = UUID.randomUUID().getLeastSignificantBits(); resource.setResourceKey(String.valueOf("key-" + randomLong)); resource.setName("name-" + randomLong); resource.setParentResource(parentResource); discoveryBoss.addResource(resource, overlord.getId()); // Now try to create another Resource of the same singleton type - this should fail. try { CreateResourceHistory history2 = resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType2.getId(), "newResource2", null, resourceConfiguration); fail("Creating a singleton that already existed succeeded: " + history2); } catch (EJBException e) { assertEquals(String.valueOf(e.getCause()), RuntimeException.class, e.getCause().getClass()); assertTrue(String.valueOf(e.getCause()), e.getCause().getMessage().contains("singleton")); } } @Test public void createSingletonResourceViaPackage() throws Exception { // Setup mockAgentService.setCreateReturnStatus(CreateResourceStatus.SUCCESS); // Assemble call parameters Subject overlord = LookupUtil.getSubjectManager().getOverlord(); String packageName = "testDataResourcePackage"; String packageVersion = "1.0.0"; int architectureId = 1; // easier than loading a specific architecture from the DB, just use the first one Configuration deploymentTimeConfiguration = new Configuration(); deploymentTimeConfiguration.put(new PropertySimple("testProperty", "testValue")); // This file should be in the classpath, so use it for the artifact content URL contentResource = this.getClass().getClassLoader().getResource("test-scheduler.properties"); assert contentResource != null : "Could not load test-scheduler.properties as package content"; InputStream packageInputStream = contentResource.openStream(); // Test CreateResourceHistory history1 = resourceFactoryManager.createResource(overlord, parentResource.getId(), contentBackedChildResourceType.getId(), "newResource", null, packageName, packageVersion, architectureId, deploymentTimeConfiguration, packageInputStream); // Verify try { getTransactionManager().begin(); Resource parent = em.find(Resource.class, parentResource.getId()); List<CreateResourceHistory> historyList = parent.getCreateChildResourceRequests(); assert historyList.size() == 1 : "Incorrect number of children found. Expected: 1, Found: " + historyList.size(); CreateResourceHistory historyItem = historyList.get(0); assert historyItem.getStatus() == CreateResourceStatus.SUCCESS : "Incorrect status for history item. Expected: Success, Found: " + historyItem.getStatus(); assert historyItem.getNewResourceKey().equals("mockResourceKey") : "Incorrect resource key for history item. Expected: mockResourceKey, Found: " + historyItem.getNewResourceKey(); assert historyItem.getErrorMessage() == null : "Error message found for successful call"; } finally { getTransactionManager().rollback(); } // Invoke the same callbacks the plugin container would to actually commit the new Resource to inventory. resourceFactoryManager.completeCreateResource(new CreateResourceResponse(history1.getId(), "newResource", "key", CreateResourceStatus.SUCCESS, null, new Configuration())); Resource resource = new Resource(2000000); resource.setUuid(UUID.randomUUID().toString()); resource.setResourceType(contentBackedChildResourceType); long randomLong = UUID.randomUUID().getLeastSignificantBits(); resource.setResourceKey(String.valueOf("key-" + randomLong)); resource.setName("name-" + randomLong); resource.setParentResource(parentResource); discoveryBoss.addResource(resource, overlord.getId()); // Now try to create another Resource of the same singleton type - this should fail. try { CreateResourceHistory history2 = resourceFactoryManager.createResource(overlord, parentResource.getId(), contentBackedChildResourceType.getId(), "newResource2", null, packageName, packageVersion, architectureId, deploymentTimeConfiguration, packageInputStream); fail("Creating a singleton that already existed succeeded: " + history2); } catch (EJBException e) { assertEquals(String.valueOf(e.getCause()), RuntimeException.class, e.getCause().getClass()); assertTrue(String.valueOf(e.getCause()), e.getCause().getMessage().contains("singleton")); } } @Test public void deleteResource() throws Exception { // Setup mockAgentService.setDeleteReturnStatus(DeleteResourceStatus.SUCCESS); Resource deleteMe = addResourceToParent(); assert deleteMe != null : "Child resource to be deleted was not correctly added in the first place"; // Assemble call parameters Subject overlord = LookupUtil.getSubjectManager().getOverlord(); // Test resourceFactoryManager.deleteResource(overlord, deleteMe.getId()); // Verify try { getTransactionManager().begin(); Resource parent = em.find(Resource.class, parentResource.getId()); Set<Resource> childResources = parent.getChildResources(); assert childResources.size() == 0 : "Child resource not deleted"; } finally { getTransactionManager().rollback(); } } @Test public void deleteResourceFailure() throws Exception { // Setup mockAgentService.setDeleteReturnStatus(DeleteResourceStatus.FAILURE); Resource deleteMe = addResourceToParent(); assert deleteMe != null : "Child resource to be deleted was not correctly added in the first place"; // Assemble call parameters Subject overlord = LookupUtil.getSubjectManager().getOverlord(); // Test resourceFactoryManager.deleteResource(overlord, deleteMe.getId()); try { getTransactionManager().begin(); Resource parent = em.find(Resource.class, parentResource.getId()); Set<Resource> childResources = parent.getChildResources(); assert childResources.size() == 1 : "Child resource not found on the parent"; Resource deletedResource = childResources.iterator().next(); assert deletedResource.getInventoryStatus() == InventoryStatus.COMMITTED : "Inventory status for deleted resource was incorrect. Expected: Committed, Found: " + deletedResource.getInventoryStatus(); } finally { getTransactionManager().rollback(); } } @Test public void createHistory() { // Setup Subject overlord = LookupUtil.getSubjectManager().getOverlord(); // Have to call getMap() on the configuration instances to trigger lazy instantiation of the properties map Configuration resourceConfiguration; resourceConfiguration = new Configuration(); resourceConfiguration.getMap(); resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType1.getId(), "resource1", (Configuration) null, resourceConfiguration); resourceConfiguration = new Configuration(); resourceConfiguration.getMap(); resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType1.getId(), "resource2", (Configuration) null, resourceConfiguration); resourceConfiguration = new Configuration(); resourceConfiguration.getMap(); resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType1.getId(), "resource3", (Configuration) null, resourceConfiguration); // Verify int numRequestsInHistory = resourceFactoryManager.getCreateChildResourceHistoryCount(parentResource.getId(), null, null); assert numRequestsInHistory == 3 : "Incorrect history count. Expected: 3, Found: " + numRequestsInHistory; PageControl pageControl = new PageControl(0, 10000); pageControl.initDefaultOrderingField("createdResourceName"); PageList<CreateResourceHistory> historyList = resourceFactoryManager.findCreateChildResourceHistory(overlord, parentResource.getId(), null, null, pageControl); assert historyList.getTotalSize() == 3 : "Incorrect number of entries in page list. Expected: 3, Found: " + historyList.getTotalSize(); assert historyList.get(0).getCreatedResourceName().equals("resource1") : "History entry 1 is invalid"; assert historyList.get(1).getCreatedResourceName().equals("resource2") : "History entry 2 is invalid"; assert historyList.get(2).getCreatedResourceName().equals("resource3") : "History entry 3 is invalid"; } @Test public void deleteHistory() throws Exception { // Setup Subject overlord = LookupUtil.getSubjectManager().getOverlord(); Resource resource1 = addResourceToParent(); Resource resource2 = addResourceToParent(); Resource resource3 = addResourceToParent(); // Delete each one, which should add a history item resourceFactoryManager.deleteResource(overlord, resource1.getId()); resourceFactoryManager.deleteResource(overlord, resource2.getId()); resourceFactoryManager.deleteResource(overlord, resource3.getId()); // Verify int numRequestsInHistory = resourceFactoryManager.getDeleteChildResourceHistoryCount(parentResource.getId(), null, null); assert numRequestsInHistory == 3 : "Incorrect history count. Expected: 3, Found: " + numRequestsInHistory; PageControl pageControl = new PageControl(0, 10000); pageControl.initDefaultOrderingField("drh.id"); PageList<DeleteResourceHistory> historyList = resourceFactoryManager.findDeleteChildResourceHistory(overlord, parentResource.getId(), null, null, pageControl); assert historyList.getTotalSize() == 3 : "Incorrect number of entries in page list. Expected: 3, Found: " + historyList.getTotalSize(); assert historyList.get(0).getResourceKey().equals(resource1.getResourceKey()) : "History entry 1 is invalid"; assert historyList.get(1).getResourceKey().equals(resource2.getResourceKey()) : "History entry 2 is invalid"; assert historyList.get(2).getResourceKey().equals(resource3.getResourceKey()) : "History entry 3 is invalid"; } @Test public void getHistoryItem() throws Exception { // Setup Subject overlord = LookupUtil.getSubjectManager().getOverlord(); Configuration resourceConfiguration = new Configuration(); resourceConfiguration.getMap(); resourceFactoryManager.createResource(overlord, parentResource.getId(), configBackedChildResourceType1.getId(), "NewResource", null, resourceConfiguration); PageList<CreateResourceHistory> historyList = resourceFactoryManager.findCreateChildResourceHistory(overlord, parentResource.getId(), null, null, new PageControl(0, 1000)); int historyItemId = historyList.get(0).getId(); // Test CreateResourceHistory historyItem = resourceFactoryManager.getCreateHistoryItem(historyItemId); // Verify assert historyItem != null : "Null history item returned from call"; assert historyItem.getCreatedResourceName().equals("NewResource"); } // Private -------------------------------------------- /** * Creates a test resource in the database for testing purposes. * * @return persisted but detached resource * * @throws Exception if anything goes wrong */ private void setupResourceEnvironment() throws Exception { getTransactionManager().begin(); try { // Create parent resource type parentResourceType = new ResourceType("platform-" + System.currentTimeMillis(), TEST_PLUGIN_NAME, ResourceCategory.PLATFORM, null); em.persist(parentResourceType); // Create child resource type to parent. Artifact type lives under this resource type. contentBackedChildResourceType = new ResourceType("service-" + System.currentTimeMillis(), TEST_PLUGIN_NAME, ResourceCategory.SERVICE, parentResourceType); contentBackedChildResourceType.setCreateDeletePolicy(CreateDeletePolicy.BOTH); contentBackedChildResourceType.setCreationDataType(ResourceCreationDataType.CONTENT); contentBackedChildResourceType.setSingleton(true); em.persist(contentBackedChildResourceType); // Create artifact type under child resource type that is marked as the creation artifact type packageType = new PackageType(); packageType.setName("artifact-" + System.currentTimeMillis()); packageType.setDescription(""); packageType.setCategory(PackageCategory.DEPLOYABLE); packageType.setDisplayName("TestResourceArtifact"); packageType.setCreationData(true); packageType.setResourceType(contentBackedChildResourceType); em.persist(packageType); // Link artifact type and child resource type contentBackedChildResourceType.addPackageType(packageType); configBackedChildResourceType1 = new ResourceType("service1-" + System.currentTimeMillis(), TEST_PLUGIN_NAME, ResourceCategory.SERVICE, parentResourceType); configBackedChildResourceType1.setCreateDeletePolicy(CreateDeletePolicy.BOTH); configBackedChildResourceType1.setCreationDataType(ResourceCreationDataType.CONFIGURATION); em.persist(configBackedChildResourceType1); configBackedChildResourceType2 = new ResourceType("service2-" + System.currentTimeMillis(), TEST_PLUGIN_NAME, ResourceCategory.SERVICE, parentResourceType); configBackedChildResourceType2.setCreateDeletePolicy(CreateDeletePolicy.BOTH); configBackedChildResourceType2.setCreationDataType(ResourceCreationDataType.CONFIGURATION); configBackedChildResourceType2.setSingleton(true); em.persist(configBackedChildResourceType2); // Create parent resource off of which to hang created resources parentResource = new Resource("parent" + System.currentTimeMillis(), "name", parentResourceType); parentResource.setUuid("" + new Random().nextInt()); em.persist(parentResource); } catch (Exception e) { System.out.println(e); getTransactionManager().rollback(); throw e; } getTransactionManager().commit(); } /** * Deletes a previously persisted resource from the database. * * @throws Exception if anything goes wrong */ private void teardownResourceEnvironment() throws Exception { if (parentResource != null) { resourceManager.uninventoryResource(overlord, parentResource.getId()); List<Integer> deletedIds = resourceManager.findResourcesMarkedForAsyncDeletion(overlord); for (Integer deletedResourceId : deletedIds) { resourceManager.uninventoryResourceAsyncWork(overlord, deletedResourceId); } getTransactionManager().begin(); try { // Remove the children first. ResourceType deleteMeType = em.find(ResourceType.class, contentBackedChildResourceType.getId()); em.remove(deleteMeType); deleteMeType = em.find(ResourceType.class, configBackedChildResourceType1.getId()); em.remove(deleteMeType); deleteMeType = em.find(ResourceType.class, configBackedChildResourceType2.getId()); em.remove(deleteMeType); deleteMeType = em.find(ResourceType.class, parentResourceType.getId()); em.remove(deleteMeType); getTransactionManager().commit(); } catch (Exception e) { try { System.out.println(e); getTransactionManager().rollback(); } catch (Exception ignore) { } throw e; } } } /** * Creates a new child resource on the test class' parent resource. * * @return the newly created resource * * @throws Exception if anything goes wrong */ private Resource addResourceToParent() throws Exception { Resource resource = null; getTransactionManager().begin(); try { resource = new Resource("child" + System.currentTimeMillis(), "name", parentResourceType); resource.setUuid("" + new Random().nextInt()); resource.setParentResource(parentResource); resource.setInventoryStatus(InventoryStatus.COMMITTED); resource.setResourceKey("" + new Random().nextInt()); em.persist(resource); } catch (Exception e) { System.out.println(e); getTransactionManager().rollback(); } getTransactionManager().commit(); return resource; } // Inner Classes -------------------------------------------- /** * Mocks out the call to the agent. Different results can be achieved by manipulating the attributes on the instance * that is registered with the server communications service. */ private class MockResourceFactoryAgentService implements ResourceFactoryAgentService { // Attributes -------------------------------------------- private CreateResourceStatus createReturnStatus = CreateResourceStatus.SUCCESS; private DeleteResourceStatus deleteReturnStatus = DeleteResourceStatus.SUCCESS; // Public -------------------------------------------- /** * Indicates what the result of a call to createResource should be. * * @param createReturnStatus indicates the type of response to send */ public void setCreateReturnStatus(CreateResourceStatus createReturnStatus) { this.createReturnStatus = createReturnStatus; } /** * Indicates what the result of a call to deleteResource should be. * * @param deleteReturnStatus indicates the type of response to send */ public void setDeleteReturnStatus(DeleteResourceStatus deleteReturnStatus) { this.deleteReturnStatus = deleteReturnStatus; } // ResourceFactoryAgentService Implementation -------------------------------------------- public void createResource(CreateResourceRequest request) throws PluginContainerException { CreateResourceResponse response = null; switch (createReturnStatus) { case SUCCESS: { response = new CreateResourceResponse(request.getRequestId(), "mockResourceName", "mockResourceKey", CreateResourceStatus.SUCCESS, null, request.getResourceConfiguration()); break; } case FAILURE: { response = new CreateResourceResponse(request.getRequestId(), null, null, CreateResourceStatus.FAILURE, "errorMessage", request.getResourceConfiguration()); break; } } ResourceFactoryManagerBeanTest.this.resourceFactoryManager.completeCreateResource(response); } public void deleteResource(DeleteResourceRequest request) throws PluginContainerException { DeleteResourceResponse response = null; switch (deleteReturnStatus) { case SUCCESS: { response = new DeleteResourceResponse(request.getRequestId(), request.getResourceId(), deleteReturnStatus, null); break; } case FAILURE: { response = new DeleteResourceResponse(request.getRequestId(), request.getResourceId(), deleteReturnStatus, "errorMessage"); break; } } ResourceFactoryManagerBeanTest.this.resourceFactoryManager.completeDeleteResourceRequest(response); } public CreateResourceResponse executeCreateResourceImmediately(CreateResourceRequest request) throws PluginContainerException { return null; } public DeleteResourceResponse executeDeleteResourceImmediately(DeleteResourceRequest request) throws PluginContainerException { return null; } } }