X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcore%2FContainerTest.java;h=90723ed1c93c4f6271448cf19622ed0eb8166dbe;hb=177ce1a304daf669142a93b71950d676922faf96;hp=dfd8ed58fc87484130ba82cb307589701a3c6d52;hpb=323116ae80daecd6e064abe014a080c5cd03b123;p=utils diff --git a/system/general/src/test/java/org/wamblee/system/core/ContainerTest.java b/system/general/src/test/java/org/wamblee/system/core/ContainerTest.java index dfd8ed58..90723ed1 100644 --- a/system/general/src/test/java/org/wamblee/system/core/ContainerTest.java +++ b/system/general/src/test/java/org/wamblee/system/core/ContainerTest.java @@ -15,26 +15,19 @@ */ 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 _tracker; @@ -86,20 +79,37 @@ 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]); + 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()); - container.start(); + } + + 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 +132,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,8 +161,9 @@ 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]); + system.validate(); } 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); @@ -214,6 +215,30 @@ public class ContainerTest extends TestCase { fail(); } + + public void testDuplicateComponent() { + try { + Component comp1 = new Application(); + Component comp2 = new Application(); + Container system = new Container("top"); + system.addComponent(comp1).addComponent(comp2); + } catch (SystemAssemblyException e) { + return; + } + fail(); + } + + + public void testInconsistentHierarchy() { + try { + Component comp = new Application(); + Container system = new Container("top").addComponent(comp); + Container system2 = new Container("top2").addComponent(comp); + } catch (SystemAssemblyException e) { + return; + } + fail(); + } public void testCompositeWithExternalDependencesProvided() { @@ -222,7 +247,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 +297,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,8 +313,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); return; } fail(); @@ -303,17 +326,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")); + new ConstructorArgs(Application.class.getConstructor(String.class), "application2"), + Application.class.getDeclaredMethod("doStart", Scope.class)); - application2.doStart(); + application2.doStart(EasyMockMatchers.anyObject(Scope.class)); EasyMock.expectLastCall().andThrow(new RuntimeException()); control.replay(); @@ -328,10 +351,87 @@ 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); return; } fail(); } + + public void testOptionalRequiredInterfaceProvidedOptionalInternal() { + Application application = new Application(true); + Container container = new Container("top", new Component[] { application }, + new ProvidedInterface[0], Application.required(true)); + Environment env = new Environment(); + container.getRequiredInterfaces()[0].setProvider( + env.getProvidedInterfaces()[0]); + container.getRequiredInterfaces()[1].setProvider( + env.getProvidedInterfaces()[1]); + 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()); + assertSame(env.getProvidedInterfaces()[1], application.getRequiredInterfaces()[1].getProvider()); + } + + public void testOptionalRequiredInterfaceNotProvidedOptionalInternal() { + Application application = new Application(true); + Container container = new Container("top", new Component[] { application }, + new ProvidedInterface[0], Application.required(true)); + Environment env = new Environment(); + container.getRequiredInterfaces()[0].setProvider( + 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()); + assertNull(application.getRequiredInterfaces()[1].getProvider()); + } + + public void testOptionalRequiredInterfaceProvidedMandatoryInternal() { + Application application = new Application(); + Container container = new Container("top", new Component[] { application }, + new ProvidedInterface[0], Application.required(true)); + Environment env = new Environment(); + container.getRequiredInterfaces()[0].setProvider( + env.getProvidedInterfaces()[0]); + container.getRequiredInterfaces()[1].setProvider( + env.getProvidedInterfaces()[1]); + container.start(); + assertSame(env.getProvidedInterfaces()[0], container.getRequiredInterfaces()[0].getProvider()); + assertSame(env.getProvidedInterfaces()[1], container.getRequiredInterfaces()[1].getProvider()); + 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); + } }