now allowing components and interfaces to be added after construction.
[utils] / system / general / src / test / java / org / wamblee / system / core / ContainerTest.java
index 27a1937ff59f4f7e845022f1bb056397d3c3aa20..7eb66757772fb31d1746e6348855c242d1eaf94e 100644 (file)
  */
 package org.wamblee.system.core;
 
+import java.io.IOException;
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.Arrays;
 
+import junit.framework.TestCase;
+
 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;
-import org.wamblee.system.core.DefaultRequiredInterface;
-import org.wamblee.system.core.ProvidedInterface;
-import org.wamblee.system.core.RequiredInterface;
-import org.wamblee.system.core.SystemAssemblyException;
-import org.wamblee.system.core.Component.Status;
 import org.wamblee.test.AssertionUtils;
+import org.wamblee.test.EasyMockMatchers;
 import org.wamblee.test.EventTracker;
 
-import junit.framework.TestCase;
-
 public class ContainerTest extends TestCase {
 
        private EventTracker<String> _tracker;
@@ -86,20 +79,38 @@ public class ContainerTest extends TestCase {
        }
 
        public void testEnvironmentApplication() {
-               Component environment = new Environment(_tracker);
-               Component application = new Application(_tracker);
+               Environment environment = new Environment(_tracker);
+               Application application = new Application(_tracker);
                Container container = new Container("root", new Component[] {
                                environment, application }, new ProvidedInterface[0],
                                new RequiredInterface[0]);
 
-               container.start();
+               Scope scope = container.start();
+               assertTrue(container.isSealed());
+               AssertionUtils.assertEquals(new String[] { "start.environment",
+                               "start.application" }, _tracker.getEvents(
+                               Thread.currentThread()).toArray(new String[0]));
+               assertEquals(0, scope.getProvidedInterfaces().length);
+               
+               assertEquals(environment.getString(), application.getString());
+               assertEquals(environment.getInteger(), application.getInteger());
+
+       }
+       
+       public void testEnvironmentApplicationSimpleConstructor() {
+               Environment environment = new Environment(_tracker);
+               Application application = new Application(_tracker);
+               Container container = new Container("root").
+                 addComponent(environment).addComponent(application);
+               
+               Scope scope = container.start();
                AssertionUtils.assertEquals(new String[] { "start.environment",
                                "start.application" }, _tracker.getEvents(
                                Thread.currentThread()).toArray(new String[0]));
-               ProvidedInterface[] envServices = environment.getRunningInterfaces();
-               assertEquals(2, envServices.length);
-               ProvidedInterface[] appServices = application.getRunningInterfaces();
-               assertEquals(0, appServices.length);
+               assertEquals(0, scope.getProvidedInterfaces().length);
+               
+               assertEquals(environment.getString(), application.getString());
+               assertEquals(environment.getInteger(), application.getInteger());
 
        }
 
@@ -122,32 +133,22 @@ public class ContainerTest extends TestCase {
                Component environment = new Environment(_tracker);
                Component application = new Application(_tracker);
                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]);
-               assertEquals(Status.NOT_STARTED, system.getStatus());
-               system.start();
+               Scope runtime = system.start();
                RequiredInterface[] required = system.getRequiredInterfaces();
                assertEquals(0, required.length);
                ProvidedInterface[] provided = system.getProvidedInterfaces();
                assertEquals(0, provided.length);
-               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();
 
-               system.stop();
-               assertEquals(Status.STOPPED, environment.getStatus());
-               assertEquals(Status.STOPPED, application.getStatus());
-               assertEquals(Status.STOPPED, system.getStatus());
-
+               system.stop(runtime);
                AssertionUtils.assertEquals(new String[] { "stop.application",
                                "stop.environment" }, _tracker
                                .getEvents(Thread.currentThread()).toArray(new String[0]));
@@ -161,7 +162,7 @@ public class ContainerTest extends TestCase {
                        Container system = new Container("all", new Component[] {
                                        environment, application },
                                        new ProvidedInterface[] { new DefaultProvidedInterface(
-                                                       "string", String.class) },
+                                                       "float", Float.class) },
                                        new DefaultRequiredInterface[0]);
                } catch (SystemAssemblyException e) {
                        return;
@@ -190,9 +191,9 @@ public class ContainerTest extends TestCase {
                Container system = new Container("all", new Component[] { environment,
                                application }, new ProvidedInterface[0],
                                new RequiredInterface[] { new DefaultRequiredInterface(
-                                               "string", String.class) });
+                                               "float", Float.class) });
                system.getRequiredInterfaces()[0]
-                               .setProvider(new DefaultProvidedInterface("hallo", String.class));
+                               .setProvider(new DefaultProvidedInterface("hallo", Float.class));
                system.start();
                RequiredInterface[] required = system.getRequiredInterfaces();
                assertEquals(1, required.length);
@@ -222,7 +223,7 @@ public class ContainerTest extends TestCase {
                Container system = new Container("all",
                                new Component[] { application }, new ProvidedInterface[0],
                                application.getRequiredInterfaces());
-               environment.start();
+               environment.start(new DefaultScope(new ProvidedInterface[0]));
                system.getRequiredInterfaces()[0].setProvider(environment
                                .getProvidedInterfaces()[0]);
                system.getRequiredInterfaces()[1].setProvider(environment
@@ -272,9 +273,9 @@ public class ContainerTest extends TestCase {
                Environment environment = new Environment(_tracker);
                Application application = control.createMock(Application.class,
                                new ConstructorArgs(Application.class.getConstructor()),
-                               Application.class.getDeclaredMethod("doStart"));
+                               Application.class.getDeclaredMethod("doStart", Scope.class));
 
-               application.doStart();
+               application.doStart(EasyMockMatchers.anyObject(Scope.class));
                EasyMock.expectLastCall().andThrow(new RuntimeException());
                control.replay();
 
@@ -288,10 +289,6 @@ public class ContainerTest extends TestCase {
                        AssertionUtils.assertEquals(new String[] { "start.environment",
                                        "stop.environment" }, _tracker.getEvents(
                                        Thread.currentThread()).toArray(new String[0]));
-                       ProvidedInterface[] envServices = environment.getRunningInterfaces();
-                       assertEquals(0, envServices.length);
-                       assertNull(environment.getProvidedInterfaces()[0].getImplementation());
-                       assertNull(environment.getProvidedInterfaces()[0].getImplementation());
                        return;
                }
                fail();
@@ -305,17 +302,17 @@ public class ContainerTest extends TestCase {
                // Application 1 will throw an exception while stopping.
                Application application1 = control.createMock(Application.class,
                                new ConstructorArgs(Application.class.getConstructor()),
-                               Application.class.getDeclaredMethod("doStop"));
+                               Application.class.getDeclaredMethod("doStop", Object.class));
 
-               application1.doStop();
+               application1.doStop(EasyMock.anyObject());
                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"));
+                               Application.class.getDeclaredMethod("doStart", Scope.class));
 
-               application2.doStart();
+               application2.doStart(EasyMockMatchers.anyObject(Scope.class));
                EasyMock.expectLastCall().andThrow(new RuntimeException());
                
                control.replay();
@@ -330,10 +327,6 @@ public class ContainerTest extends TestCase {
                        AssertionUtils.assertEquals(new String[] { "start.environment", 
                                        "stop.environment" }, _tracker.getEvents(
                                        Thread.currentThread()).toArray(new String[0]));
-                       ProvidedInterface[] envServices = environment.getRunningInterfaces();
-                       assertEquals(0, envServices.length);
-                       assertNull(environment.getProvidedInterfaces()[0].getImplementation());
-                       assertNull(environment.getProvidedInterfaces()[0].getImplementation());
                        return;
                }
                fail();
@@ -348,7 +341,10 @@ public class ContainerTest extends TestCase {
                                env.getProvidedInterfaces()[0]); 
                container.getRequiredInterfaces()[1].setProvider(
                                env.getProvidedInterfaces()[1]);
-           container.start();
+               Scope external = new DefaultScope(env.getProvidedInterfaces());
+               env.start(external); 
+               
+           container.start(external);
            assertSame(env.getProvidedInterfaces()[0], container.getRequiredInterfaces()[0].getProvider());
            assertSame(env.getProvidedInterfaces()[1], container.getRequiredInterfaces()[1].getProvider());
            assertSame(env.getProvidedInterfaces()[0], application.getRequiredInterfaces()[0].getProvider());
@@ -361,8 +357,10 @@ public class ContainerTest extends TestCase {
                                new ProvidedInterface[0], Application.required(true));
                Environment env = new Environment();
                container.getRequiredInterfaces()[0].setProvider(
-                               env.getProvidedInterfaces()[0]); 
-           container.start();
+                               env.getProvidedInterfaces()[0]);
+               Scope external = new DefaultScope(new ProvidedInterface[0]); 
+               external.publishInterface(env.getProvidedInterfaces()[0], env.getString());
+           container.start(external);
            assertSame(env.getProvidedInterfaces()[0], container.getRequiredInterfaces()[0].getProvider());
            assertNull(container.getRequiredInterfaces()[1].getProvider());
            assertSame(env.getProvidedInterfaces()[0], application.getRequiredInterfaces()[0].getProvider());
@@ -384,4 +382,32 @@ public class ContainerTest extends TestCase {
            assertSame(env.getProvidedInterfaces()[0], application.getRequiredInterfaces()[0].getProvider());
            assertSame(env.getProvidedInterfaces()[1], application.getRequiredInterfaces()[1].getProvider());   
        }
+       
+       public void testSealed() { 
+               final Container container = new Container("xx"); 
+               assertFalse(container.isSealed()); 
+               container.start();
+               assertTrue(container.isSealed());
+               
+               AssertionUtils.assertException(new AssertionUtils.ErroneousCode() { 
+                       @Override
+                       public void run() throws Exception {
+                               container.addComponent(new Application());      
+                       }
+               }, SystemAssemblyException.class); 
+               
+               AssertionUtils.assertException(new AssertionUtils.ErroneousCode() { 
+                       @Override
+                       public void run() throws Exception {
+                               container.addProvidedInterface(new DefaultProvidedInterface("xx", String.class));       
+                       }
+               }, SystemAssemblyException.class); 
+               
+               AssertionUtils.assertException(new AssertionUtils.ErroneousCode() { 
+                       @Override
+                       public void run() throws Exception {
+                               container.addRequiredInterface(new DefaultRequiredInterface("xx", String.class));       
+                       }
+               }, SystemAssemblyException.class); 
+       }
 }