package org.opennaas.core.resources.tests; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import java.util.ArrayList; import java.util.List; import junit.framework.Assert; import org.junit.Test; import org.opennaas.core.resources.CorruptStateException; import org.opennaas.core.resources.ILifecycle.State; import org.opennaas.core.resources.IResourceBootstrapper; import org.opennaas.core.resources.IncorrectLifecycleStateException; import org.opennaas.core.resources.Resource; import org.opennaas.core.resources.ResourceException; import org.opennaas.core.resources.capability.ICapability; import org.opennaas.core.resources.capability.ICapabilityLifecycle; public class ResourceLifeCycleTest { Resource resource; // methods // resource.initialize(); // resource.activate(); // resource.shutdown(); // resource.deactivate(); @Test public void expectedLifeCycleTest() { resource = new Resource();// STATE INSTANTIATED try { resource.initialize(); Assert.assertEquals(resource.getState(), State.INITIALIZED); resource.activate(); Assert.assertEquals(resource.getState(), State.ACTIVE); resource.deactivate(); Assert.assertEquals(resource.getState(), State.INITIALIZED); resource.shutdown(); Assert.assertEquals(resource.getState(), State.SHUTDOWN); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getMessage()); } catch (ResourceException e) { Assert.fail(e.getMessage()); } catch (CorruptStateException e) { Assert.fail(e.getMessage()); } } @Test public void initializedStateTest() { resource = new Resource();// STATE INSTANTIATED resource.setState(State.INITIALIZED); boolean a = false, b = false; try { try { resource.initialize(); } catch (IncorrectLifecycleStateException e1) { a = true; } try { resource.deactivate(); } catch (IncorrectLifecycleStateException e) { b = true; } Assert.assertEquals(resource.getState(), State.INITIALIZED); try { resource.activate(); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getMessage()); } Assert.assertEquals(resource.getState(), State.ACTIVE); resource.setState(State.INITIALIZED); try { resource.shutdown(); } catch (IncorrectLifecycleStateException e1) { Assert.fail(e1.getMessage()); } Assert.assertEquals(resource.getState(), State.SHUTDOWN); } catch (ResourceException e) { Assert.fail(e.getMessage()); } catch (CorruptStateException e) { Assert.fail(e.getMessage()); } Assert.assertTrue(a); Assert.assertTrue(b); } @Test public void activeStateTest() { resource = new Resource();// STATE INSTANTIATED resource.setState(State.ACTIVE); boolean a = false, b = false, c = false; try { try { resource.initialize(); } catch (IncorrectLifecycleStateException e1) { a = true; } try { resource.activate(); } catch (IncorrectLifecycleStateException e) { b = true; } try { resource.shutdown(); } catch (IncorrectLifecycleStateException e1) { c = true; } Assert.assertEquals(resource.getState(), State.ACTIVE); try { resource.deactivate(); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getMessage()); } Assert.assertEquals(resource.getState(), State.INITIALIZED); } catch (ResourceException e) { Assert.fail(e.getMessage()); } catch (CorruptStateException e) { Assert.fail(e.getMessage()); } Assert.assertTrue(a); Assert.assertTrue(b); Assert.assertTrue(c); } @Test public void instantiatedStateTest() { resource = new Resource();// STATE INSTANTIATED boolean a = false, b = false, c = false; try { try { resource.deactivate(); } catch (IncorrectLifecycleStateException e1) { a = true; } try { resource.activate(); } catch (IncorrectLifecycleStateException e) { b = true; } try { resource.shutdown(); } catch (IncorrectLifecycleStateException e1) { c = true; } Assert.assertEquals(resource.getState(), State.INSTANTIATED); try { resource.initialize(); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getMessage()); } Assert.assertEquals(resource.getState(), State.INITIALIZED); } catch (ResourceException e) { Assert.fail(e.getMessage()); } catch (CorruptStateException e) { Assert.fail(e.getMessage()); } Assert.assertTrue(a); Assert.assertTrue(b); Assert.assertTrue(c); } @Test public void activateResourceTest() { try { Resource resource = new Resource(); resource.initialize(); ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); mockCapability.initialize(); // expect capability to be initialized and activated mockCapability.activate(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.bootstrap(resource); // expect a call to bootstrap replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.INITIALIZED); resource.activate(); verify(mockBootstrapper); // verify bootstrap() has been called verify(mockCapability); // verify capability initialize() and activate() have been called Assert.assertTrue(resource.getState().equals(State.ACTIVE)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void deactivateResourceTest() { try { Resource resource = new Resource(); resource.initialize(); ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); mockCapability.deactivate(); // expected mockCapability.shutdown(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.revertBootstrap(resource); // expected replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.ACTIVE); resource.deactivate(); verify(mockBootstrapper); // verify mockBootsrapper expectations verify(mockCapability); // verify mockCapability expectations Assert.assertTrue(resource.getState().equals(State.INITIALIZED)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void activateResourceRollbackTest1() { try { Resource resource = new Resource(); resource.initialize(); ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); mockCapability.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability.initialize(); expectLastCall().atLeastOnce(); mockCapability.activate(); expectLastCall().andThrow(new ResourceException()); mockCapability.deactivate(); // @ rollback expectLastCall().anyTimes(); mockCapability.shutdown(); expectLastCall().anyTimes(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.bootstrap(resource); // expect a call to bootstrap expectLastCall().anyTimes(); // it may not happen replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.INITIALIZED); boolean hasThrown = false; try { resource.activate(); } catch (ResourceException e) { hasThrown = true; } Assert.assertTrue(hasThrown); verify(mockBootstrapper); // verify bootstrap() has been called verify(mockCapability); // verify capability initialize() and activate() have been called Assert.assertTrue(resource.getState().equals(State.INITIALIZED)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void activateResourceRollbackTest2() { try { Resource resource = new Resource(); resource.initialize(); ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); mockCapability.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability.initialize(); // it may not happen if bootstrap fails expectLastCall().anyTimes(); mockCapability.activate(); expectLastCall().anyTimes(); mockCapability.deactivate(); // @ rollback expectLastCall().anyTimes(); mockCapability.shutdown(); expectLastCall().anyTimes(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.bootstrap(resource); expectLastCall().andThrow(new ResourceException()); replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.INITIALIZED); boolean hasThrown = false; try { resource.activate(); } catch (ResourceException e) { hasThrown = true; } Assert.assertTrue(hasThrown); verify(mockBootstrapper); verify(mockCapability); Assert.assertTrue(resource.getState().equals(State.INITIALIZED)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void deactivateResourceRollbackTest1() { try { Resource resource = new Resource(); resource.initialize(); ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); mockCapability.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability.deactivate(); expectLastCall().andThrow(new ResourceException()); mockCapability.shutdown(); expectLastCall().anyTimes(); mockCapability.initialize(); // @ rollback expectLastCall().anyTimes(); mockCapability.activate(); expectLastCall().anyTimes(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.revertBootstrap(resource); // expect a call to bootstrap expectLastCall().anyTimes(); // it may not happen if deactivate fails first replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.ACTIVE); boolean hasThrown = false; try { resource.deactivate(); } catch (CorruptStateException e) { // CORRUPT! capability.deactivate() fails after revertBootstrap() is executed -> corrupt state hasThrown = true; } Assert.assertTrue(hasThrown); verify(mockBootstrapper); verify(mockCapability); Assert.assertTrue(resource.getState().equals(State.ERROR)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void deactivateResourceRollbackTest2() { try { Resource resource = new Resource(); resource.initialize(); ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); mockCapability.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability.deactivate(); // they may not happen if revertBootstrap fails first expectLastCall().anyTimes(); mockCapability.shutdown(); expectLastCall().anyTimes(); mockCapability.initialize(); // @ rollback expectLastCall().anyTimes(); mockCapability.activate(); expectLastCall().anyTimes(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.revertBootstrap(resource); expectLastCall().andThrow(new ResourceException()); replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.ACTIVE); boolean hasThrown = false; try { resource.deactivate(); } catch (ResourceException e) { hasThrown = true; } Assert.assertTrue(hasThrown); verify(mockBootstrapper); // verify bootstrap() has been called verify(mockCapability); // verify capability initialize() and activate() have been called Assert.assertTrue(resource.getState().equals(State.ACTIVE)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } // TODO test activate && deactivate corrupt @Test public void activateResourceRollbackCorruptTest() { try { Resource resource = new Resource(); resource.initialize(); // fails to deactivate ICapabilityLifecycle mockCapability2 = createMock(ICapabilityLifecycle.class); mockCapability2.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability2.deactivate(); // @ rollback expectLastCall().andThrow(new ResourceException()); mockCapability2.shutdown(); expectLastCall().anyTimes(); mockCapability2.initialize(); expectLastCall().atLeastOnce(); mockCapability2.activate(); expectLastCall().atLeastOnce(); replay(mockCapability2); // fails to activate ICapabilityLifecycle mockCapability1 = createMock(ICapabilityLifecycle.class); mockCapability1.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability1.deactivate(); // @ rollback expectLastCall().anyTimes(); mockCapability1.shutdown(); expectLastCall().anyTimes(); mockCapability1.initialize(); expectLastCall().atLeastOnce(); mockCapability1.activate(); expectLastCall().andThrow(new ResourceException()); replay(mockCapability1); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability2); capabilities.add(mockCapability1); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.bootstrap(resource); // expect a call to bootstrap expectLastCall().anyTimes(); // it may not happen if deactivate fails first replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.INITIALIZED); boolean hasThrown = false; try { resource.activate(); } catch (CorruptStateException e) { // CORRUPT! hasThrown = true; } Assert.assertTrue(hasThrown); verify(mockBootstrapper); verify(mockCapability1); verify(mockCapability2); Assert.assertTrue(resource.getState().equals(State.ERROR)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void deactivateResourceRollbackCorruptTest() { try { Resource resource = new Resource(); resource.initialize(); // fails to activate ICapabilityLifecycle mockCapability1 = createMock(ICapabilityLifecycle.class); mockCapability1.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability1.deactivate(); expectLastCall().atLeastOnce(); mockCapability1.shutdown(); expectLastCall().atLeastOnce(); mockCapability1.initialize(); // @ rollback expectLastCall().anyTimes(); mockCapability1.activate(); expectLastCall().andThrow(new ResourceException()); replay(mockCapability1); // fails to deactivate ICapabilityLifecycle mockCapability2 = createMock(ICapabilityLifecycle.class); mockCapability2.getState(); expectLastCall().andReturn(ICapabilityLifecycle.State.INITIALIZED).anyTimes(); mockCapability2.deactivate(); expectLastCall().andThrow(new ResourceException()); mockCapability2.shutdown(); expectLastCall().anyTimes(); mockCapability2.initialize(); // @ rollback expectLastCall().anyTimes(); mockCapability2.activate(); expectLastCall().anyTimes(); replay(mockCapability2); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability1); capabilities.add(mockCapability2); resource.setCapabilities(capabilities); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.revertBootstrap(resource); // expect a call to bootstrap expectLastCall().anyTimes(); // it may not happen if deactivate fails first replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); resource.setState(State.ACTIVE); boolean hasThrown = false; try { resource.deactivate(); } catch (CorruptStateException e) { // CORRUPT! hasThrown = true; } Assert.assertTrue(hasThrown); verify(mockBootstrapper); verify(mockCapability1); verify(mockCapability2); Assert.assertTrue(resource.getState().equals(State.ERROR)); } catch (ResourceException e) { Assert.fail(e.getLocalizedMessage()); } catch (IncorrectLifecycleStateException e) { Assert.fail(e.getLocalizedMessage()); } catch (CorruptStateException e) { Assert.fail(e.getLocalizedMessage()); } } @Test public void forceDeactivateResourceTest() throws IncorrectLifecycleStateException, ResourceException, CorruptStateException { Resource resource = new Resource(); resource.initialize(); IResourceBootstrapper mockBootstrapper = createMock(IResourceBootstrapper.class); mockBootstrapper.revertBootstrap(resource); expectLastCall().andThrow(new ResourceException()); replay(mockBootstrapper); resource.setBootstrapper(mockBootstrapper); boolean isThrown = false; try { resource.forceDeactivate(); } catch (ResourceException e) { isThrown = true; } Assert.assertTrue(isThrown); /* check fail capability */ ICapabilityLifecycle mockCapability = createMock(ICapabilityLifecycle.class); /* force to fail the deactivate method */ mockCapability.deactivate(); expectLastCall().andThrow(new ResourceException()).anyTimes(); replay(mockCapability); List<ICapability> capabilities = new ArrayList<ICapability>(); capabilities.add(mockCapability); resource.setCapabilities(capabilities); resource.setBootstrapper(createMock(IResourceBootstrapper.class)); isThrown = false; try { resource.forceDeactivate(); } catch (ResourceException e) { isThrown = true; } Assert.assertTrue(isThrown); } }