now allowing components and interfaces to be added after construction.
[utils] / system / general / src / test / java / org / wamblee / system / core / ContainerTest.java
index bcca8cc11bb823c37f01232e81dc78dc2767c76f..7eb66757772fb31d1746e6348855c242d1eaf94e 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.wamblee.system.core;
 
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.Arrays;
 
@@ -24,6 +25,7 @@ import org.easymock.classextension.ConstructorArgs;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
 import org.wamblee.test.AssertionUtils;
+import org.wamblee.test.EasyMockMatchers;
 import org.wamblee.test.EventTracker;
 
 public class ContainerTest extends TestCase {
@@ -83,14 +85,29 @@ public class ContainerTest extends TestCase {
                                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());
@@ -120,7 +137,7 @@ public class ContainerTest extends TestCase {
                Container system = new Container("all", new Component[] { environment,
                                application }, new ProvidedInterface[0],
                                new RequiredInterface[0]);
-               system.start();
+               Scope runtime = system.start();
                RequiredInterface[] required = system.getRequiredInterfaces();
                assertEquals(0, required.length);
                ProvidedInterface[] provided = system.getProvidedInterfaces();
@@ -131,7 +148,7 @@ public class ContainerTest extends TestCase {
                                Thread.currentThread()).toArray(new String[0]));
                _tracker.clear();
 
-               system.stop();
+               system.stop(runtime);
                AssertionUtils.assertEquals(new String[] { "stop.application",
                                "stop.environment" }, _tracker
                                .getEvents(Thread.currentThread()).toArray(new String[0]));
@@ -206,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
@@ -256,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();
 
@@ -272,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();
@@ -289,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();
@@ -314,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();
@@ -332,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());
@@ -345,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());
@@ -368,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); 
+       }
 }