1 package net.sf.fleet.test;
2
3 import static org.testng.Assert.*;
4
5 import java.util.HashSet;
6 import java.util.Set;
7
8 import net.sf.fleet.Context;
9 import net.sf.fleet.annotations.Configuration;
10 import net.sf.fleet.annotations.Contribution;
11 import net.sf.fleet.annotations.Module;
12 import net.sf.fleet.annotations.NotCachable;
13 import net.sf.fleet.exceptions.FleetConfigurationException;
14 import net.sf.fleet.impl.ContextImpl;
15
16 import org.testng.annotations.Test;
17
18 public class ContributionsIntegrationTest {
19 @Module
20 public interface ModuleA {
21 @Configuration( id = "moduleA" )
22 public Set<String> getModuleAConfiguration();
23 }
24
25 @Module
26 public interface ModuleB {
27 @Configuration( id = "moduleB" )
28 @NotCachable
29 public Set<String> getModuleBConfiguration();
30 }
31
32 public static class ModuleAImpl extends AbstractModuleImpl implements ModuleA {
33
34 public Set<String> getModuleAConfiguration() {
35 return new HashSet<String>();
36 }
37
38 @Contribution( module = ModuleB.class, configuration = "moduleB" )
39 public void contributeToModuleBConfiguration(Set<String> pConfig) {
40 pConfig.add("ModuleAWasHere");
41 mContributed = true;
42 }
43 }
44
45 public static abstract class AbstractModuleImpl {
46 protected boolean mContributed = false;
47 public boolean hasContributed() {
48 return mContributed;
49 }
50
51 public void resetContributed() {
52 mContributed = false;
53 }
54 }
55
56 public static class ModuleBImpl extends AbstractModuleImpl implements ModuleB {
57
58 public Set<String> getModuleBConfiguration() {
59 return new HashSet<String>();
60 }
61
62 @Contribution( module = ModuleA.class, configuration = "moduleA" )
63 public void contributeToModuleAConfiguration(Set<String> pConfig) {
64 pConfig.add("ModuleBWasHere");
65 mContributed = true;
66 }
67 }
68
69 @Test
70 public void testBasic() {
71 ContextImpl lContext = new ContextImpl();
72 lContext.addModule(new ModuleAImpl());
73 lContext.addModule(new ModuleBImpl());
74 assertContains(lContext.getModule(ModuleA.class).getModuleAConfiguration(),"ModuleBWasHere");
75 assertContains(lContext.getModule(ModuleB.class).getModuleBConfiguration(),"ModuleAWasHere");
76 }
77
78 @Test(dependsOnMethods="testBasic")
79 public void testCaching() {
80 ContextImpl lContext = new ContextImpl();
81
82 ModuleAImpl lModuleAImpl = new ModuleAImpl();
83 ModuleBImpl lModuleBImpl = new ModuleBImpl();
84
85 lContext.addModule(lModuleAImpl);
86 lContext.addModule(lModuleBImpl);
87
88 assertContains(lContext.getModule(ModuleA.class).getModuleAConfiguration(),"ModuleBWasHere");
89 assertContains(lContext.getModule(ModuleB.class).getModuleBConfiguration(),"ModuleAWasHere");
90
91 assertTrue(lModuleAImpl.hasContributed(),"ModuleA should have contributed but didn't.");
92 assertTrue(lModuleBImpl.hasContributed(),"ModuleB should have contributed but didn't.");
93
94 lModuleAImpl.resetContributed(); lModuleBImpl.resetContributed();
95
96 assertContains(lContext.getModule(ModuleA.class).getModuleAConfiguration(),"ModuleBWasHere");
97 assertContains(lContext.getModule(ModuleB.class).getModuleBConfiguration(),"ModuleAWasHere");
98
99 assertTrue(lModuleAImpl.hasContributed(),"ModuleA should have contributed but didn't.");
100 assertFalse(lModuleBImpl.hasContributed(),"ModuleB should not have contributed but did.");
101 }
102
103 private void assertContains(Set<String> pModuleAConfiguration, String pString) {
104 assertTrue(pModuleAConfiguration.contains(pString),"Set did not contain value " + pString);
105 }
106
107 @Test
108 public void testBrokenContribution() {
109 Context lContext = new ContextImpl();
110 lContext.addModule(new ModuleAImpl());
111 try {
112 lContext.addModule(new ModuleBImpl() {
113
114 @Contribution( module = ModuleA.class, configuration = "moduleANoSuchConfig" )
115 public void contributeToModuleAConfiguration(Set<String> pConfig) {}
116 });
117 fail("Expected a unity configuration exception when adding a module that attempts to contribute to a non-existent configuration.");
118 } catch ( FleetConfigurationException e ) {
119
120 }
121 }
122 }