*/
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;
}
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());
}
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]));
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;
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);
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() {
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
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();
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();
// 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();
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();
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());
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());
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);
+ }
}