X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fspring%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fspring%2FSpringComponentTest.java;h=6407c14463db1f80d98efaa38f61701f04592d0f;hb=ddd261f331280640c5b53c7128230b629ebcd268;hp=0914c9aa3d5e065c138ebb30387fe5f6ba377221;hpb=dea786c9d49228a37cb5fd5b4113b86d9f6cddbf;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 0914c9aa..6407c144 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,12 +1,12 @@ /* * 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. @@ -15,14 +15,10 @@ */ package org.wamblee.system.spring; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - import junit.framework.TestCase; import org.wamblee.io.ClassPathResource; + import org.wamblee.system.core.DefaultProvidedInterface; import org.wamblee.system.core.DefaultRequiredInterface; import org.wamblee.system.core.DefaultScope; @@ -31,121 +27,319 @@ import org.wamblee.system.core.RequiredInterface; import org.wamblee.system.core.Scope; import org.wamblee.system.core.SystemAssemblyException; +import org.wamblee.test.EventTracker; + +import java.io.IOException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + + +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ public class SpringComponentTest extends TestCase { + /** + * DOCUMENT ME! + */ + private static final String HELLO_SERVICE_SPRING_XML = "test.org.wamblee.system.spring.xml"; + + /** + * DOCUMENT ME! + */ + private static final String HELLO_SERVICE_SPRING_WITH_REQS_XML = "test.org.wamblee.system.springWithRequirements.xml"; + + /** + * DOCUMENT ME! + */ + private static final String HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML = "test.org.wamblee.system.springWithProperties.xml"; + + /** + * DOCUMENT ME! + */ + private static final String HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML2 = "test.org.wamblee.system.springWithProperties2.xml"; + + /** + * DOCUMENT ME! + */ + private static final String PROPERTY_FILE = "test.org.wamblee.system.spring.properties"; + + /** + * DOCUMENT ME! + */ + public static EventTracker EVENT_TRACKER; + + /** + * DOCUMENT ME! + */ + private Scope externalScope; + + /** + * DOCUMENT ME! + * + * @throws Exception DOCUMENT ME! + */ + @Override + protected void setUp() throws Exception { + super.setUp(); + EVENT_TRACKER = new EventTracker(); + externalScope = new DefaultScope(new ProvidedInterface[0]); + } + + /** + * DOCUMENT ME! + */ + public void testBlackboxSystem() { + SpringComponent system = new SpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_XML }, + new HashMap(), + new HashMap()); + + Scope runtime = system.start(externalScope); + assertEquals(0, externalScope.getProvidedInterfaces().size()); + + system.stop(runtime); + } + + /** + * DOCUMENT ME! + */ + public void testOneProvidedService() { + Map provided = new HashMap(); + provided.put("helloService", + new DefaultProvidedInterface("hello", HelloService.class)); + + SpringComponent system = new SpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_XML }, provided, + new HashMap()); + Scope runtime = system.start(externalScope); + List services = runtime.getProvidedInterfaces(); + + assertEquals(1, services.size()); + + Object service = runtime.getInterfaceImplementation(services.get(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); + } + + /** + * DOCUMENT ME! + * + * @throws IOException DOCUMENT ME! + */ + public void testWithProperties() throws IOException { + 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()); + Properties props = new Properties(); + props.load(new ClassPathResource(PROPERTY_FILE).getInputStream()); + system.addProperties(props); + + 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()); + + List services = scope.getProvidedInterfaces(); + assertEquals("Property Value", + scope.getInterfaceImplementation(services.get(0), HelloService.class) + .say()); + } + + /** + * DOCUMENT ME! + * + * @throws IOException DOCUMENT ME! + */ + public void testWithPropertiesAsBean() throws IOException { + Map provided = new HashMap(); + provided.put("helloService", + new DefaultProvidedInterface("hello", HelloService2.class)); + + SpringComponent system = new SpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML2 }, + provided, new HashMap()); + Properties props = new Properties(); + props.load(new ClassPathResource(PROPERTY_FILE).getInputStream()); + system.addProperties("properties", props); + + Scope scope = system.start(externalScope); + + List services = scope.getProvidedInterfaces(); + + Properties props2 = scope.getInterfaceImplementation(services + .get(0), HelloService2.class).getProperties(); + assertEquals(props, props2); + } + + /** + * DOCUMENT ME! + */ + public void testWithMissingRequirement() { + try { + SpringComponent system = new SpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, + new HashMap(), + new HashMap()); + system.start(externalScope); + } catch (SystemAssemblyException e) { + // e.printStackTrace(); + return; + } + + fail(); + } + + /** + * DOCUMENT ME! + */ + public void testWithRequirement() { + Map required = new HashMap(); + required.put(new DefaultRequiredInterface("hello", HelloService.class), + "helloService"); + + SpringComponent system = new SpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, + 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().get(0).setProvider(helloService); + + Scope runtime = system.start(scope); + system.stop(runtime); + } + + /** + * DOCUMENT ME! + */ + public void testWithRequirementAndProvidedService() { + Map required = new HashMap(); + required.put(new DefaultRequiredInterface("hello", HelloService.class), + "helloService"); + + Map provided = new HashMap(); + provided.put("blaService", + new DefaultProvidedInterface("bla", BlaService.class)); + + 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().get(0).setProvider(helloService); + + Scope runtime = system.start(scope); + ProvidedInterface started = runtime.getProvidedInterfaces().get(0); + + Object impl = runtime.getInterfaceImplementation(started, + BlaService.class); + assertNotNull(impl); + assertTrue(impl instanceof BlaService); + assertEquals("ladida", ((BlaService) impl).execute()); + system.stop(runtime); + } + + /** + * Tests a scenario where a subclass of SpringComponent adds a new + * provided interface where the interface is provided by the subclass + * itself and not by the spring configs inside. + */ + public void testWithProvidedFromSubClassNotFromConfig() { + Map provided = new HashMap(); + provided.put("helloService", + new DefaultProvidedInterface("hello", HelloService.class)); + + SubSpringComponent system = new SubSpringComponent("system", + new String[] { HELLO_SERVICE_SPRING_XML }, provided, + new HashMap()); + + Scope runtime = system.start(externalScope); + List services = runtime.getProvidedInterfaces(); + + assertEquals(2, services.size()); + + Object service = runtime.getInterfaceImplementation(services.get(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); + + Object floatsvc = externalScope.getInterfaceImplementation(system.getProvidedInterfaces() + .get(1), Object.class); + assertTrue(floatsvc instanceof Float); + assertTrue((((Float) floatsvc).floatValue() - 100.345f) < 0.00001); + + assertEquals("Hello world!", ((HelloService) service).say()); + system.stop(runtime); + } + + /** + * Tests the spring component with an additional requirement from + * the subclass which is not required by the spring config files inside. + */ + public void testWithRequirementFromSubClass() { + Map required = new HashMap(); + required.put(new DefaultRequiredInterface("hello", HelloService.class), + "helloService"); + + SpringComponent system = new SubSpringComponent2("system", + new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, + new HashMap(), required); + + HelloService helloObject = new HelloService("ladida"); + ProvidedInterface helloService = new DefaultProvidedInterface("hello", + HelloService.class); + + ProvidedInterface floatService = new DefaultProvidedInterface("float", + Float.class); + + Scope scope = new DefaultScope(new ProvidedInterface[] { + helloService + }); + scope.publishInterface(helloService, helloObject); + scope.publishInterface(floatService, 100.234f); + system.getRequiredInterfaces().get(0).setProvider(helloService); + system.getRequiredInterfaces().get(1).setProvider(floatService); - 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"; - - @Override - protected void setUp() throws Exception { - super.setUp(); - } - - public void testBlackboxSystem() { - SpringComponent system = new SpringComponent("system", - new String[] { HELLO_SERVICE_SPRING_XML }, - new HashMap(), - new HashMap()); - Scope runtime = system.start(); - assertEquals(0, runtime.getProvidedInterfaces().length); - - system.stop(runtime); - } - - public void testOneProvidedService() { - Map provided = new HashMap(); - provided.put("helloService", new DefaultProvidedInterface("hello", - HelloService.class)); - - SpringComponent system = new SpringComponent("system", - new String[] { HELLO_SERVICE_SPRING_XML }, provided, - new HashMap()); - Scope runtime = system.start(); - ProvidedInterface[] services = runtime.getProvidedInterfaces(); - assertEquals(1, services.length); - Object service = runtime.retrieveInterfaceImplementation(services[0], Object.class); - assertTrue(service instanceof HelloService); - assertEquals("Hello world!", ((HelloService) service).say()); - system.stop(runtime); - } - - public void testWithProperties() throws IOException { - 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()); - Properties props = new Properties(); - props.load(new ClassPathResource(PROPERTY_FILE).getInputStream()); - system.addProperties(props); - - Scope scope = system.start(); - ProvidedInterface[] services = scope.getProvidedInterfaces(); - assertEquals("Property Value", scope.retrieveInterfaceImplementation(services[0], HelloService.class).say()); - } - - public void testWithMissingRequirement() { - try { - SpringComponent system = new SpringComponent("system", - new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, - new HashMap(), - new HashMap()); - system.start(); - } catch (SystemAssemblyException e) { - // e.printStackTrace(); - return; - } - fail(); - } - - public void testWithRequirement() { - Map required = new HashMap(); - required.put(new DefaultRequiredInterface("hello", HelloService.class), - "helloService"); - SpringComponent system = new SpringComponent("system", - new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML }, - 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 DefaultRequiredInterface("hello", HelloService.class), - "helloService"); - Map provided = new HashMap(); - provided.put("blaService", new DefaultProvidedInterface("bla", - BlaService.class)); - - 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.retrieveInterfaceImplementation(started, BlaService.class); - assertNotNull(impl); - assertTrue(impl instanceof BlaService); - assertEquals("ladida", ((BlaService)impl).execute()); - system.stop(runtime); - } + Scope runtime = system.start(scope); + system.stop(runtime); + assertEquals(100.234f, + ((Float) runtime.get("floatValue")).floatValue(), 0.0001f); + } }