/**
* Tests a session-to-module scoped wire
*/
public void testSessionToModule() throws Exception {
WorkContext ctx = new WorkContextImpl();
ScopeContainer moduleScope = new ModuleScopeContainer(ctx);
moduleScope.start();
ScopeContainer sessionScope = new HttpSessionScopeContainer(ctx);
sessionScope.start();
Map<String, AtomicComponent> contexts = MockFactory.createWiredComponents("source", SourceImpl.class,
sessionScope, members, "target", Target.class, TargetImpl.class, moduleScope);
moduleScope.onEvent(new CompositeStart(this, null));
Object session1 = new Object();
ctx.setIdentifier(HttpSessionScopeContainer.HTTP_IDENTIFIER, session1);
sessionScope.onEvent(new HttpSessionStart(this, session1));
AtomicComponent sourceComponent = contexts.get("source");
AtomicComponent targetComponent = contexts.get("target");
Source source = (Source) sourceComponent.getServiceInstance();
Target target = (Target) targetComponent.getServiceInstance();
assertNull(source.getTarget().getString());
assertNull(target.getString());
target.setString("foo");
assertTrue(Proxy.isProxyClass(source.getTarget().getClass()));
assertEquals("foo", source.getTarget().getString());
ctx.clearIdentifier(HttpSessionScopeContainer.HTTP_IDENTIFIER);
sessionScope.onEvent(new HttpSessionEnd(this, session1));
//second session
Object session2 = new Object();
ctx.setIdentifier(HttpSessionScopeContainer.HTTP_IDENTIFIER, session2);
sessionScope.onEvent(new HttpSessionStart(this, session2));
Target target2 = (Target) targetComponent.getServiceInstance();
Source source2 = (Source) sourceComponent.getServiceInstance();
assertEquals("foo", target2.getString());
assertEquals("foo", source2.getTarget().getString());
source2.getTarget().setString("baz");
assertEquals("baz", source2.getTarget().getString());
assertEquals("baz", target2.getString());
assertEquals("baz", target.getString());
ctx.clearIdentifier(HttpSessionScopeContainer.HTTP_IDENTIFIER);
sessionScope.onEvent(new HttpSessionEnd(this, session2));
moduleScope.stop();
sessionScope.stop();
}