X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fspring%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fspring%2FSpringComponentTest.java;h=170297fa2c3f5ec0b3ce297e9920c979f6e5d7b3;hb=439da63cde4b6943359710673356ea05d96d0ad2;hp=dc7a5845c659f68c47bbcd7db8f855bd3fa1c5b2;hpb=932671cb2531a832b488f8ed5631fcb96a616f83;p=utils diff --git a/system/spring/src/test/java/org/wamblee/system/spring/SpringComponentTest.java b/system/spring/src/test/java/org/wamblee/system/spring/SpringComponentTest.java index dc7a5845..170297fa 100644 --- a/system/spring/src/test/java/org/wamblee/system/spring/SpringComponentTest.java +++ b/system/spring/src/test/java/org/wamblee/system/spring/SpringComponentTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.spring; import java.io.IOException; @@ -8,127 +23,146 @@ import java.util.Properties; import junit.framework.TestCase; import org.wamblee.io.ClassPathResource; -import org.wamblee.system.AbstractInterfaceDescriptor; -import org.wamblee.system.DefaultProvidedInterfaceDescriptor; -import org.wamblee.system.DefaultRequiredInterfaceDescriptor; -import org.wamblee.system.DefaultServiceRegistry; -import org.wamblee.system.ProvidedInterfaceDescriptor; -import org.wamblee.system.RequiredInterfaceDescriptor; -import org.wamblee.system.Service; -import org.wamblee.system.InterfaceDescriptor; -import org.wamblee.system.ServiceRegistry; -import org.wamblee.system.SystemAssemblyException; +import org.wamblee.system.core.DefaultProvidedInterface; +import org.wamblee.system.core.DefaultRequiredInterface; +import org.wamblee.system.core.DefaultScope; +import org.wamblee.system.core.ProvidedInterface; +import org.wamblee.system.core.RequiredInterface; +import org.wamblee.system.core.Scope; +import org.wamblee.system.core.SystemAssemblyException; +import org.wamblee.test.EventTracker; public class SpringComponentTest extends TestCase { private static final String HELLO_SERVICE_SPRING_XML = "test.org.wamblee.system.spring.xml"; private static final String HELLO_SERVICE_SPRING_WITH_REQS_XML = "test.org.wamblee.system.springWithRequirements.xml"; private static final String HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML = "test.org.wamblee.system.springWithProperties.xml"; - private static final String PROPERTY_FILE = "test.org.wamblee.system.spring.properties"; - - private ServiceRegistry _registry; + private static final String PROPERTY_FILE = "test.org.wamblee.system.spring.properties"; + + public static EventTracker EVENT_TRACKER; + + private Scope _externalScope; @Override protected void setUp() throws Exception { super.setUp(); - _registry = new DefaultServiceRegistry(); + EVENT_TRACKER = new EventTracker(); + _externalScope = new DefaultScope(new ProvidedInterface[0]); } public void testBlackboxSystem() { - SpringComponent system = new SpringComponent("system", _registry, + SpringComponent system = new SpringComponent("system", new String[] { HELLO_SERVICE_SPRING_XML }, - new HashMap(), - new HashMap()); - system.start("Hello", new Service[0]); - Service[] services = system.getRunningServices(); - assertEquals(0, services.length); + new HashMap(), + new HashMap()); - system.stop(); + Scope runtime = system.start(_externalScope); + assertEquals(0, _externalScope.getProvidedInterfaces().length); + + system.stop(runtime); } public void testOneProvidedService() { - Map provided = new HashMap(); - provided.put("helloService", new DefaultProvidedInterfaceDescriptor( - "hello", HelloService.class)); + Map provided = new HashMap(); + provided.put("helloService", new DefaultProvidedInterface("hello", + HelloService.class)); - SpringComponent system = new SpringComponent("system", _registry, + SpringComponent system = new SpringComponent("system", new String[] { HELLO_SERVICE_SPRING_XML }, provided, - new HashMap()); - system.start("Hello", new Service[0]); - Service[] services = system.getRunningServices(); + new HashMap()); + Scope runtime = system.start(_externalScope); + ProvidedInterface[] services = runtime.getProvidedInterfaces(); + assertEquals(1, services.length); - assertTrue(services[0].reference(HelloService.class) instanceof HelloService); - assertEquals("Hello world!", services[0].reference(HelloService.class) - .say()); - system.stop(); + Object service = runtime.getInterfaceImplementation(services[0], Object.class); + assertTrue(service instanceof HelloService); + + // BUG; Provided services should be made available in the external scope. + Object service2 = _externalScope.getInterfaceImplementation(provided.get("helloService"), Object.class); + assertSame(service, service2); + + assertEquals("Hello world!", ((HelloService) service).say()); + system.stop(runtime); } - + public void testWithProperties() throws IOException { - Map provided = new HashMap(); - provided.put("helloService", new DefaultProvidedInterfaceDescriptor( - "hello", HelloService.class)); - SpringComponent system = new SpringComponent("system", _registry, + Map provided = new HashMap(); + provided.put("helloService", new DefaultProvidedInterface("hello", + HelloService.class)); + SpringComponent system = new SpringComponent("system", new String[] { HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML }, - provided, - new HashMap()); + provided, new HashMap()); Properties props = new Properties(); props.load(new ClassPathResource(PROPERTY_FILE).getInputStream()); system.addProperties(props); - - system.start("Hello", new Service[0]); - Service[] services = system.getRunningServices(); - assertEquals("Property Value", services[0].reference(HelloService.class).say()); + + Scope scope = system.start(_externalScope); + // BUG: Hello service was constructed multiple times. Once with the unprocessed property + // and another time with the processed property. + assertEquals(1, EVENT_TRACKER.getEventCount()); + ProvidedInterface[] services = scope.getProvidedInterfaces(); + assertEquals("Property Value", scope.getInterfaceImplementation(services[0], HelloService.class).say()); } public void testWithMissingRequirement() { try { - SpringComponent system = new SpringComponent("system", _registry, + SpringComponent system = new SpringComponent("system", new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, - new HashMap(), - new HashMap()); - system.start("Bla", new Service[0]); + new HashMap(), + new HashMap()); + system.start(_externalScope); } catch (SystemAssemblyException e) { - //e.printStackTrace(); + // e.printStackTrace(); return; } fail(); } public void testWithRequirement() { - Map required = new HashMap(); - required.put(new DefaultRequiredInterfaceDescriptor("hello", HelloService.class), + Map required = new HashMap(); + required.put(new DefaultRequiredInterface("hello", HelloService.class), "helloService"); - SpringComponent system = new SpringComponent("system", _registry, + SpringComponent system = new SpringComponent("system", new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, - new HashMap(), required); - - HelloService helloObject = new HelloService("ladida"); - Service helloService = _registry.register(new DefaultProvidedInterfaceDescriptor("hello", HelloService.class), helloObject); - system.start("Bla", new Service[] { helloService } ); - system.stop(); + new HashMap(), required); + + HelloService helloObject = new HelloService("ladida"); + ProvidedInterface helloService = new DefaultProvidedInterface("hello", + HelloService.class); + Scope scope = new DefaultScope(new ProvidedInterface[]{ helloService }); + scope.publishInterface(helloService, helloObject); + system.getRequiredInterfaces()[0].setProvider(helloService); + + Scope runtime = system.start(scope); + system.stop(runtime); } - + public void testWithRequirementAndProvidedService() { - Map required = new HashMap(); - required.put(new DefaultRequiredInterfaceDescriptor("hello", HelloService.class), + Map required = new HashMap(); + required.put(new DefaultRequiredInterface("hello", HelloService.class), "helloService"); - Map provided = new HashMap(); - provided.put("blaService", new DefaultProvidedInterfaceDescriptor("bla", + Map provided = new HashMap(); + provided.put("blaService", new DefaultProvidedInterface("bla", BlaService.class)); - SpringComponent system = new SpringComponent("system", _registry, - new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, - provided, required); - - HelloService helloObject = new HelloService("ladida"); - Service helloService = _registry.register(new DefaultProvidedInterfaceDescriptor("hello", HelloService.class), helloObject); - Service[] services = system.start("Bla", new Service[] { helloService } ); - assertEquals(1, services.length); - - assertTrue(services[0].reference(BlaService.class) instanceof BlaService); - assertEquals("ladida", services[0].reference(BlaService.class) - .execute()); - system.stop(); + SpringComponent system = new SpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, provided, + required); + + HelloService helloObject = new HelloService("ladida"); + ProvidedInterface helloService = new DefaultProvidedInterface("hello", + HelloService.class); + Scope scope = new DefaultScope(new ProvidedInterface[] { helloService }); + scope.publishInterface(helloService, helloObject); + system.getRequiredInterfaces()[0].setProvider(helloService); + Scope runtime = system.start(scope); + ProvidedInterface started = runtime.getProvidedInterfaces()[0]; + + Object impl = runtime.getInterfaceImplementation(started, BlaService.class); + assertNotNull(impl); + assertTrue(impl instanceof BlaService); + assertEquals("ladida", ((BlaService)impl).execute()); + system.stop(runtime); } }