SpringComponent now supports adding properties as beans instead of
[utils] / system / spring / src / test / java / org / wamblee / system / spring / SpringComponentTest.java
index c63916f5d68946a6c3d0baa5a004d11b8d3322b8..3e63c7eaba4ee1b18b5399d9c3a7dca40bda7df4 100644 (file)
@@ -30,17 +30,26 @@ 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 HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML2 = "test.org.wamblee.system.springWithProperties2.xml";
+           
        private static final String PROPERTY_FILE = "test.org.wamblee.system.spring.properties";
+       
+       public static EventTracker<String> EVENT_TRACKER;
+       
+       private Scope _externalScope; 
 
        @Override
        protected void setUp() throws Exception {
                super.setUp();
+               EVENT_TRACKER = new EventTracker<String>();
+               _externalScope = new DefaultScope(new ProvidedInterface[0]);
        }
 
        public void testBlackboxSystem() {
@@ -48,8 +57,9 @@ public class SpringComponentTest extends TestCase {
                                new String[] { HELLO_SERVICE_SPRING_XML },
                                new HashMap<String, ProvidedInterface>(),
                                new HashMap<RequiredInterface, String>());
-               Scope runtime = system.start();
-               assertEquals(0, runtime.getProvidedInterfaces().length);
+               
+               Scope runtime = system.start(_externalScope);
+               assertEquals(0, _externalScope.getProvidedInterfaces().length);
 
                system.stop(runtime);
        }
@@ -62,11 +72,17 @@ public class SpringComponentTest extends TestCase {
                SpringComponent system = new SpringComponent("system",
                                new String[] { HELLO_SERVICE_SPRING_XML }, provided,
                                new HashMap<RequiredInterface, String>());
-               Scope runtime = system.start();
+               Scope runtime = system.start(_externalScope);
                ProvidedInterface[] services = runtime.getProvidedInterfaces();
+       
                assertEquals(1, services.length);
                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);
        }
@@ -82,10 +98,32 @@ public class SpringComponentTest extends TestCase {
                props.load(new ClassPathResource(PROPERTY_FILE).getInputStream());
                system.addProperties(props);
 
-               Scope scope = system.start();
+               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 testWithPropertiesAsBean() throws IOException {
+        Map<String, ProvidedInterface> provided = new HashMap<String, ProvidedInterface>();
+        provided.put("helloService", new DefaultProvidedInterface("hello",
+                HelloService2.class));
+        SpringComponent system = new SpringComponent("system",
+                new String[] { HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML2 },
+                provided, new HashMap<RequiredInterface, String>());
+        Properties props = new Properties();
+        props.load(new ClassPathResource(PROPERTY_FILE).getInputStream());
+        system.addProperties("properties", props);
+
+        Scope scope = system.start(_externalScope);
+        
+        ProvidedInterface[] services = scope.getProvidedInterfaces();
+        
+        Properties props2 = scope.getInterfaceImplementation(services[0], HelloService2.class).getProperties();
+        assertEquals(props, props2);
+    }
 
        public void testWithMissingRequirement() {
                try {
@@ -93,7 +131,7 @@ public class SpringComponentTest extends TestCase {
                                        new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML },
                                        new HashMap<String, ProvidedInterface>(),
                                        new HashMap<RequiredInterface, String>());
-                       system.start();
+                       system.start(_externalScope);
                } catch (SystemAssemblyException e) {
                        // e.printStackTrace();
                        return;