(no commit message)
[utils] / system / general / src / test / java / org / wamblee / system / core / ContainerTest.java
index 0c0a9935feb8b1da4f78321235d5c905d5aecf59..dfd8ed58fc87484130ba82cb307589701a3c6d52 100644 (file)
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */ 
+ */
 package org.wamblee.system.core;
 
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 
+import org.easymock.classextension.ConstructorArgs;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
 import org.wamblee.system.core.Component;
 import org.wamblee.system.core.Container;
 import org.wamblee.system.core.DefaultProvidedInterface;
@@ -61,11 +64,11 @@ public class ContainerTest extends TestCase {
                ProvidedInterface prov3 = new DefaultProvidedInterface("name",
                                MyMultiple.class);
 
-               AssertionUtils.assertEquals(new RequiredInterface[] { req1 },
-                               Container.filterRequiredServices(prov1, Arrays
+               AssertionUtils.assertEquals(new RequiredInterface[] { req1 }, Container
+                               .filterRequiredServices(prov1, Arrays
                                                .asList(new RequiredInterface[] { req1 })));
-               AssertionUtils.assertEquals(new RequiredInterface[] { req1 },
-                               Container.filterRequiredServices(prov1, Arrays
+               AssertionUtils.assertEquals(new RequiredInterface[] { req1 }, Container
+                               .filterRequiredServices(prov1, Arrays
                                                .asList(new RequiredInterface[] { req1, req2 })));
                AssertionUtils.assertEquals(new RequiredInterface[] { req1, req2 },
                                Container.filterRequiredServices(prov3, Arrays
@@ -88,27 +91,25 @@ public class ContainerTest extends TestCase {
                Container container = new Container("root", new Component[] {
                                environment, application }, new ProvidedInterface[0],
                                new RequiredInterface[0]);
-                               
+
                container.start();
                AssertionUtils.assertEquals(new String[] { "start.environment",
                                "start.application" }, _tracker.getEvents(
                                Thread.currentThread()).toArray(new String[0]));
-               ProvidedInterface[] envServices = environment.getRunningServices();
+               ProvidedInterface[] envServices = environment.getRunningInterfaces();
                assertEquals(2, envServices.length);
-               ProvidedInterface[] appServices = environment.getRunningServices();
-               assertEquals(2, appServices.length);
-               
+               ProvidedInterface[] appServices = application.getRunningInterfaces();
+               assertEquals(0, appServices.length);
+
        }
 
        public void testApplicationEnvironment() {
                try {
                        Component environment = new Environment();
                        Component application = new Application();
-                       Container container = new Container(
-                                       "root",
-                                       new Component[] {
-                                       application, environment }, 
-                                       new ProvidedInterface[0], new RequiredInterface[0]);
+                       Container container = new Container("root", new Component[] {
+                                       application, environment }, new ProvidedInterface[0],
+                                       new RequiredInterface[0]);
                        container.start();
                } catch (SystemAssemblyException e) {
                        // e.printStackTrace();
@@ -123,7 +124,7 @@ public class ContainerTest extends TestCase {
                assertEquals(0, _tracker.getEventCount());
                assertEquals(Status.NOT_STARTED, environment.getStatus());
                assertEquals(Status.NOT_STARTED, application.getStatus());
-               
+
                Container system = new Container("all", new Component[] { environment,
                                application }, new ProvidedInterface[0],
                                new RequiredInterface[0]);
@@ -136,22 +137,21 @@ public class ContainerTest extends TestCase {
                assertEquals(Status.RUNNING, environment.getStatus());
                assertEquals(Status.RUNNING, application.getStatus());
                assertEquals(Status.RUNNING, system.getStatus());
-               
-               AssertionUtils.assertEquals(
-                               new String[] { "start.environment", "start.application" }, 
-                               _tracker.getEvents(Thread.currentThread()).toArray(new String[0]));
-        _tracker.clear();
-               
+
+               AssertionUtils.assertEquals(new String[] { "start.environment",
+                               "start.application" }, _tracker.getEvents(
+                               Thread.currentThread()).toArray(new String[0]));
+               _tracker.clear();
+
                system.stop();
                assertEquals(Status.STOPPED, environment.getStatus());
                assertEquals(Status.STOPPED, application.getStatus());
                assertEquals(Status.STOPPED, system.getStatus());
-               
-               AssertionUtils.assertEquals(
-                               new String[] { "stop.application", "stop.environment" }, 
-                               _tracker.getEvents(Thread.currentThread()).toArray(new String[0]));
-      
-               
+
+               AssertionUtils.assertEquals(new String[] { "stop.application",
+                               "stop.environment" }, _tracker
+                               .getEvents(Thread.currentThread()).toArray(new String[0]));
+
        }
 
        public void testCompositeWithWrongProvidedInfo() {
@@ -265,4 +265,73 @@ public class ContainerTest extends TestCase {
                fail();
        }
 
+       public void testEnvironmentApplicationRollbackOnException()
+                       throws Exception {
+               IMocksControl control = EasyMock.createStrictControl();
+
+               Environment environment = new Environment(_tracker);
+               Application application = control.createMock(Application.class,
+                               new ConstructorArgs(Application.class.getConstructor()),
+                               Application.class.getDeclaredMethod("doStart"));
+
+               application.doStart();
+               EasyMock.expectLastCall().andThrow(new RuntimeException());
+               control.replay();
+
+               try {
+                       Container container = new Container("root", new Component[] {
+                                       environment, application }, new ProvidedInterface[0],
+                                       new RequiredInterface[0]);
+
+                       container.start();
+               } catch (RuntimeException e) {
+                       AssertionUtils.assertEquals(new String[] { "start.environment",
+                                       "stop.environment" }, _tracker.getEvents(
+                                       Thread.currentThread()).toArray(new String[0]));
+                       ProvidedInterface[] envServices = environment.getRunningInterfaces();
+                       assertEquals(0, envServices.length);
+                       return;
+               }
+               fail();
+       }
+
+       public void testEnvironmentApplicationRollbackOnExceptionWithExceptionOnStop()
+                       throws Exception {
+               IMocksControl control = EasyMock.createControl();
+
+               Environment environment = new Environment(_tracker);
+               // Application 1 will throw an exception while stopping.
+               Application application1 = control.createMock(Application.class,
+                               new ConstructorArgs(Application.class.getConstructor()),
+                               Application.class.getDeclaredMethod("doStop"));
+
+               application1.doStop();
+               EasyMock.expectLastCall().andThrow(new RuntimeException());
+               
+               // application 2 will throw an exception while starting
+               Application application2 = control.createMock(Application.class,
+                               new ConstructorArgs(Application.class.getConstructor()),
+                               Application.class.getDeclaredMethod("doStart"));
+
+               application2.doStart();
+               EasyMock.expectLastCall().andThrow(new RuntimeException());
+               
+               control.replay();
+
+               try {
+                       Container container = new Container("root", new Component[] {
+                                       environment, application1, application2 }, new ProvidedInterface[0],
+                                       new RequiredInterface[0]);
+
+                       container.start();
+               } catch (RuntimeException e) {
+                       AssertionUtils.assertEquals(new String[] { "start.environment", 
+                                       "stop.environment" }, _tracker.getEvents(
+                                       Thread.currentThread()).toArray(new String[0]));
+                       ProvidedInterface[] envServices = environment.getRunningInterfaces();
+                       assertEquals(0, envServices.length);
+                       return;
+               }
+               fail();
+       }
 }