KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > nanocontainer > script > groovy > GroovyNodeBuilderTestCase


1 package org.nanocontainer.script.groovy;
2
3 import java.io.IOException JavaDoc;
4 import java.io.Reader JavaDoc;
5 import java.io.StringReader JavaDoc;
6 import java.io.StringWriter JavaDoc;
7 import java.util.ArrayList JavaDoc;
8 import java.util.Vector JavaDoc;
9
10 import org.jmock.Mock;
11 import org.nanocontainer.NanoPicoContainer;
12 import org.nanocontainer.TestHelper;
13 import org.nanocontainer.integrationkit.PicoCompositionException;
14 import org.nanocontainer.reflection.DefaultNanoPicoContainer;
15 import org.nanocontainer.script.AbstractScriptedContainerBuilderTestCase;
16 import org.nanocontainer.script.BarDecoratingPicoContainer;
17 import org.nanocontainer.script.FooDecoratingPicoContainer;
18 import org.nanocontainer.script.NanoContainerMarkupException;
19 import org.nanocontainer.testmodel.A;
20 import org.nanocontainer.testmodel.B;
21 import org.nanocontainer.testmodel.HasParams;
22 import org.nanocontainer.testmodel.ParentAssemblyScope;
23 import org.nanocontainer.testmodel.SomeAssemblyScope;
24 import org.nanocontainer.testmodel.WebServerConfig;
25 import org.nanocontainer.testmodel.X;
26 import org.picocontainer.ComponentAdapter;
27 import org.picocontainer.MutablePicoContainer;
28 import org.picocontainer.PicoContainer;
29 import org.picocontainer.defaults.ComponentAdapterFactory;
30 import org.picocontainer.defaults.InstanceComponentAdapter;
31 import org.picocontainer.defaults.SetterInjectionComponentAdapter;
32 import org.picocontainer.defaults.SetterInjectionComponentAdapterFactory;
33 import org.picocontainer.defaults.UnsatisfiableDependenciesException;
34 import java.io.File JavaDoc;
35 import java.net.URLClassLoader JavaDoc;
36 import java.net.URL JavaDoc;
37
38 /**
39  *
40  * @author Paul Hammant
41  * @author Mauro Talevi
42  * @version $Revision: 1775 $
43  */

44 public class GroovyNodeBuilderTestCase extends AbstractScriptedContainerBuilderTestCase {
45     private static final String JavaDoc ASSEMBLY_SCOPE = "SOME_SCOPE";
46
47     public void testInstantiateBasicScriptable() throws PicoCompositionException {
48         Reader JavaDoc script = new StringReader JavaDoc("" +
49                 "import org.nanocontainer.testmodel.*\n" +
50                 "X.reset()\n" +
51                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
52                 "nano = builder.container {\n" +
53                 " component(A)\n" +
54                 "}");
55
56         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
57         // LifecyleContainerBuilder starts the container
58
pico.dispose();
59
60         assertEquals("Should match the expression", "<A!A", X.componentRecorder);
61     }
62
63     public void testComponentInstances() throws PicoCompositionException {
64         Reader JavaDoc script = new StringReader JavaDoc("" +
65                 "import org.nanocontainer.testmodel.*\n" +
66                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
67                 "nano = builder.container {\n" +
68                 " component(key:'a', instance:'apple')\n" +
69                 " component(key:'b', instance:'banana')\n" +
70                 " component(instance:'noKeySpecified')\n" +
71                 "}");
72
73         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
74         assertEquals("apple", pico.getComponentInstance("a"));
75         assertEquals("banana", pico.getComponentInstance("b"));
76         assertEquals("noKeySpecified", pico.getComponentInstance(String JavaDoc.class));
77     }
78
79     public void testShouldFailWhenNeitherClassNorInstanceIsSpecifiedForComponent() {
80         Reader JavaDoc script = new StringReader JavaDoc("" +
81                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
82                 "nano = builder.container {\n" +
83                 " component(key:'a')\n" +
84                 "}");
85
86         try {
87             buildContainer(script, null, ASSEMBLY_SCOPE);
88             fail("NanoContainerMarkupException should have been raised");
89         } catch (NanoContainerMarkupException e) {
90             // expected
91
}
92     }
93
94     public void testShouldAcceptConstantParametersForComponent() throws PicoCompositionException {
95         Reader JavaDoc script = new StringReader JavaDoc("" +
96                 "import org.picocontainer.defaults.ConstantParameter\n" +
97                 "import org.nanocontainer.testmodel.*\n" +
98                 "" +
99                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
100                 "nano = builder.container {\n" +
101                 " component(key:'byClass', class:HasParams, parameters:[ 'a', 'b', new ConstantParameter('c') ])\n" +
102                 " component(key:'byClassString', class:'org.nanocontainer.testmodel.HasParams', parameters:[ 'c', 'a', 't' ])\n" +
103                 "}");
104
105         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
106         HasParams byClass = (HasParams) pico.getComponentInstance("byClass");
107         assertEquals("abc", byClass.getParams());
108
109         HasParams byClassString = (HasParams) pico.getComponentInstance("byClassString");
110         assertEquals("cat", byClassString.getParams());
111     }
112
113     public void testShouldAcceptComponentParametersForComponent() throws PicoCompositionException {
114         Reader JavaDoc script = new StringReader JavaDoc("" +
115                 "import org.picocontainer.defaults.ComponentParameter\n" +
116                 "import org.nanocontainer.testmodel.*\n" +
117                 "" +
118                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
119                 "nano = builder.container {\n" +
120                 " component(key:'a1', class:A)\n" +
121                 " component(key:'a2', class:A)\n" +
122                 " component(key:'b1', class:B, parameters:[ new ComponentParameter('a1') ])\n" +
123                 " component(key:'b2', class:B, parameters:[ new ComponentParameter('a2') ])\n" +
124                 "}");
125
126         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
127         A a1 = (A) pico.getComponentInstance("a1");
128         A a2 = (A) pico.getComponentInstance("a2");
129         B b1 = (B) pico.getComponentInstance("b1");
130         B b2 = (B) pico.getComponentInstance("b2");
131
132         assertNotNull(a1);
133         assertNotNull(a2);
134         assertNotNull(b1);
135         assertNotNull(b2);
136
137         assertSame(a1, b1.a);
138         assertSame(a2, b2.a);
139         assertNotSame(a1, a2);
140         assertNotSame(b1, b2);
141     }
142
143     public void testShouldAcceptComponentParameterWithClassNameKey() throws PicoCompositionException {
144         Reader JavaDoc script = new StringReader JavaDoc("" +
145                 "import org.picocontainer.defaults.ComponentParameter\n" +
146                 "import org.nanocontainer.testmodel.*\n" +
147                 "" +
148                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
149                 "nano = builder.container {\n" +
150                 " component(class:A)\n" +
151                 " component(key:B, class:B, parameters:[ new ComponentParameter(A) ])\n" +
152                 "}");
153
154         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
155         A a = (A) pico.getComponentInstance(A.class);
156         B b = (B) pico.getComponentInstance(B.class);
157
158         assertNotNull(a);
159         assertNotNull(b);
160         assertSame(a, b.a);
161     }
162
163     public void testComponentParametersScript() {
164         Reader JavaDoc script = new StringReader JavaDoc("" +
165                 "package org.nanocontainer.script.groovy\n" +
166                 "import org.picocontainer.defaults.ComponentParameter\n" +
167                 "import org.nanocontainer.testmodel.*\n" +
168                 "builder = new GroovyNodeBuilder()\n" +
169                 "nano = builder.container {\n" +
170                 " component(key:'a', class:A)\n" +
171                 " component(key:'b', class:B, parameters:[ new ComponentParameter('a') ])\n" +
172                 "}");
173
174         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
175         A a = (A) pico.getComponentInstance("a");
176         B b = (B) pico.getComponentInstance("b");
177         assertSame(a, b.a);
178     }
179
180     public void testShouldBeAbleToHandOffToNestedBuilder() {
181         Reader JavaDoc script = new StringReader JavaDoc("" +
182                 "package org.nanocontainer.script.groovy\n" +
183                 "import org.nanocontainer.testmodel.*\n" +
184                 "builder = new GroovyNodeBuilder()\n" +
185                 "builder.registerBuilder(name:'foo', class:'org.nanocontainer.script.groovy.TestingChildBuilder')\n" +
186                 "nano = builder.container {\n" +
187                 " component(key:'a', class:A)\n" +
188                 " foo {\n" +
189                 " component(key:'b', class:B)\n" +
190                 " }\n" +
191                 "}");
192
193         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
194         Object JavaDoc a = pico.getComponentInstance("a");
195         Object JavaDoc b = pico.getComponentInstance("b");
196
197         assertNotNull(a);
198         assertNotNull(b);
199     }
200
201     public void testShouldBeAbleToHandOffToNestedBuilderTheInlinedWay() {
202         Reader JavaDoc script = new StringReader JavaDoc("" +
203                 "package org.nanocontainer.script.groovy\n" +
204                 "import org.nanocontainer.testmodel.*\n" +
205                 "builder = new GroovyNodeBuilder()\n" +
206                 "nano = builder.container {\n" +
207                 " component(key:'a', class:A)\n" +
208                 " newBuilder(class:'org.nanocontainer.script.groovy.TestingChildBuilder') {\n" +
209                 " component(key:'b', class:B)\n" +
210                 " }\n" +
211                 "}");
212
213         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
214         Object JavaDoc a = pico.getComponentInstance("a");
215         Object JavaDoc b = pico.getComponentInstance("b");
216
217         assertNotNull(a);
218         assertNotNull(b);
219     }
220
221
222     public void testInstantiateBasicComponentInDeeperTree() {
223         X.reset();
224         Reader JavaDoc script = new StringReader JavaDoc("" +
225                 "package org.nanocontainer.script.groovy\n" +
226                 "import org.nanocontainer.testmodel.*\n" +
227                 "builder = new GroovyNodeBuilder()\n" +
228                 "nano = builder.container {\n" +
229                 " container() {\n" +
230                 " component(A)\n" +
231                 " }\n" +
232                 "}");
233
234         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
235         pico.dispose();
236         assertEquals("Should match the expression", "<A!A", X.componentRecorder);
237     }
238
239     public void testCustomComponentAdapterFactoryCanBeSpecified() {
240         Reader JavaDoc script = new StringReader JavaDoc("" +
241                 "package org.nanocontainer.script.groovy\n" +
242                 "import org.nanocontainer.testmodel.*\n" +
243                 "builder = new GroovyNodeBuilder()\n" +
244                 "nano = builder.container(componentAdapterFactory:assemblyScope) {\n" +
245                 " component(A)\n" +
246                 "}");
247
248         A a = new A();
249         Mock cafMock = mock(ComponentAdapterFactory.class);
250         cafMock.expects(once()).method("createComponentAdapter").with(same(A.class), same(A.class), eq(null)).will(returnValue(new InstanceComponentAdapter(A.class, a)));
251         ComponentAdapterFactory componentAdapterFactory = (ComponentAdapterFactory) cafMock.proxy();
252         PicoContainer pico = buildContainer(script, null, componentAdapterFactory);
253         assertSame(a, pico.getComponentInstanceOfType(A.class));
254     }
255
256     public void testCustomComponentMonitorCanBeSpecified() {
257         Reader JavaDoc script = new StringReader JavaDoc("" +
258                 "package org.nanocontainer.script.groovy\n" +
259                 "import java.io.StringWriter\n" +
260                 "import org.picocontainer.monitors.WriterComponentMonitor\n" +
261                 "import org.nanocontainer.testmodel.*\n" +
262                 "builder = new GroovyNodeBuilder()\n" +
263                 "writer = new StringWriter()\n" +
264                 "monitor = new WriterComponentMonitor(writer) \n"+
265                 "nano = builder.container(componentMonitor: monitor) {\n" +
266                 " component(A)\n" +
267                 " component(key:StringWriter, instance:writer)\n" +
268                 "}");
269
270         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
271         pico.getComponentInstanceOfType(WebServerConfig.class);
272         StringWriter JavaDoc writer = (StringWriter JavaDoc)pico.getComponentInstanceOfType(StringWriter JavaDoc.class);
273         assertTrue(writer.toString().length() > 0);
274     }
275
276     public void testCustomComponentMonitorCanBeSpecifiedWhenCAFIsSpecified() {
277         Reader JavaDoc script = new StringReader JavaDoc("" +
278                 "package org.nanocontainer.script.groovy\n" +
279                 "import java.io.StringWriter\n" +
280                 "import org.picocontainer.defaults.DefaultComponentAdapterFactory\n" +
281                 "import org.picocontainer.monitors.WriterComponentMonitor\n" +
282                 "import org.nanocontainer.testmodel.*\n" +
283                 "builder = new GroovyNodeBuilder()\n" +
284                 "writer = new StringWriter()\n" +
285                 "monitor = new WriterComponentMonitor(writer) \n"+
286                 "nano = builder.container(componentAdapterFactory: new DefaultComponentAdapterFactory(), componentMonitor: monitor) {\n" +
287                 " component(A)\n" +
288                 " component(key:StringWriter, instance:writer)\n" +
289                 "}");
290
291         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
292         pico.getComponentInstanceOfType(WebServerConfig.class);
293         StringWriter JavaDoc writer = (StringWriter JavaDoc)pico.getComponentInstanceOfType(StringWriter JavaDoc.class);
294         assertTrue(writer.toString().length() > 0);
295     }
296
297     public void testCustomComponentMonitorCanBeSpecifiedWhenParentIsSpecified() {
298         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
299         Reader JavaDoc script = new StringReader JavaDoc("" +
300                 "package org.nanocontainer.script.groovy\n" +
301                 "import java.io.StringWriter\n" +
302                 "import org.picocontainer.monitors.WriterComponentMonitor\n" +
303                 "import org.nanocontainer.testmodel.*\n" +
304                 "builder = new GroovyNodeBuilder()\n" +
305                 "writer = new StringWriter()\n" +
306                 "monitor = new WriterComponentMonitor(writer) \n"+
307                 "nano = builder.container(parent:parent, componentMonitor: monitor) {\n" +
308                 " component(A)\n" +
309                 " component(key:StringWriter, instance:writer)\n" +
310                 "}");
311
312         PicoContainer pico = buildContainer(script, parent, ASSEMBLY_SCOPE);
313         pico.getComponentInstanceOfType(WebServerConfig.class);
314         StringWriter JavaDoc writer = (StringWriter JavaDoc)pico.getComponentInstanceOfType(StringWriter JavaDoc.class);
315         assertTrue(writer.toString().length() > 0);
316     }
317
318     public void testCustomComponentMonitorCanBeSpecifiedWhenParentAndCAFAreSpecified() {
319         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
320         Reader JavaDoc script = new StringReader JavaDoc("" +
321                 "package org.nanocontainer.script.groovy\n" +
322                 "import java.io.StringWriter\n" +
323                 "import org.picocontainer.defaults.DefaultComponentAdapterFactory\n" +
324                 "import org.picocontainer.monitors.WriterComponentMonitor\n" +
325                 "import org.nanocontainer.testmodel.*\n" +
326                 "builder = new GroovyNodeBuilder()\n" +
327                 "writer = new StringWriter()\n" +
328                 "monitor = new WriterComponentMonitor(writer) \n"+
329                 "nano = builder.container(parent:parent, componentAdapterFactory: new DefaultComponentAdapterFactory(), componentMonitor: monitor) {\n" +
330                 " component(A)\n" +
331                 " component(key:StringWriter, instance:writer)\n" +
332                 "}");
333
334         PicoContainer pico = buildContainer(script, parent, ASSEMBLY_SCOPE);
335         pico.getComponentInstanceOfType(WebServerConfig.class);
336         StringWriter JavaDoc writer = (StringWriter JavaDoc)pico.getComponentInstanceOfType(StringWriter JavaDoc.class);
337         assertTrue(writer.toString().length() > 0);
338     }
339
340     public void testInstantiateWithImpossibleComponentDependenciesConsideringTheHierarchy() {
341         X.reset();
342         Reader JavaDoc script = new StringReader JavaDoc("" +
343                 "package org.nanocontainer.script.groovy\n" +
344                 "import org.nanocontainer.testmodel.*\n" +
345                 "builder = new GroovyNodeBuilder()\n" +
346                 "nano = builder.container {\n" +
347                 " component(B)\n" +
348                 " container() {\n" +
349                 " component(A)\n" +
350                 " }\n" +
351                 " component(C)\n" +
352                 "}");
353
354         try {
355             buildContainer(script, null, ASSEMBLY_SCOPE);
356             fail("Should not have been able to instansiate component tree due to visibility/parent reasons.");
357         } catch (UnsatisfiableDependenciesException expected) {
358         }
359     }
360
361     public void testInstantiateWithChildContainerAndStartStopAndDisposeOrderIsCorrect() {
362         X.reset();
363         Reader JavaDoc script = new StringReader JavaDoc("" +
364                 "package org.nanocontainer.script.groovy\n" +
365                 "import org.nanocontainer.testmodel.*\n" +
366                 "builder = new GroovyNodeBuilder()\n" +
367                 "nano = builder.container {\n" +
368                 " component(A)\n" +
369                 " container() {\n" +
370                 " component(B)\n" +
371                 " }\n" +
372                 " component(C)\n" +
373                 "}\n");
374
375         // A and C have no no dependancies. B Depends on A.
376
PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
377         //pico.start();
378
pico.stop();
379         pico.dispose();
380
381         assertEquals("Should match the expression", "<A<C<BB>C>A>!B!C!A", X.componentRecorder);
382     }
383
384     public void testBuildContainerWithParentAttribute() {
385         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
386         parent.registerComponentInstance("hello", "world");
387
388         Reader JavaDoc script = new StringReader JavaDoc("" +
389                 "package org.nanocontainer.script.groovy\n" +
390                 "import org.nanocontainer.testmodel.*\n" +
391                 "builder = new GroovyNodeBuilder()\n" +
392                 "nano = builder.container(parent:parent) {\n" +
393                 " component(A)\n" +
394                 "}\n");
395
396         PicoContainer pico = buildContainer(script, parent, ASSEMBLY_SCOPE);
397         // Should be able to get instance that was registered in the parent container
398
assertEquals("world", pico.getComponentInstance("hello"));
399     }
400
401
402     public void testBuildContainerWithParentDependencyAndAssemblyScope() {
403         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
404         parent.registerComponentImplementation("a", A.class);
405
406         Reader JavaDoc script = new StringReader JavaDoc("" +
407                 "package org.nanocontainer.script.groovy\n" +
408                 "import org.nanocontainer.testmodel.*\n" +
409                 "builder = new GroovyNodeBuilder()\n" +
410                 "nano = builder.container(parent:parent) {\n" +
411                 " if ( assemblyScope instanceof SomeAssemblyScope ){\n "+
412                 " component(B)\n" +
413                 " }\n "+
414                 "}\n");
415
416         PicoContainer pico = buildContainer(script, parent, new SomeAssemblyScope());
417         assertNotNull(pico.getComponentInstanceOfType(B.class));
418     }
419
420     public void testBuildContainerWithParentAndChildAssemblyScopes() throws IOException JavaDoc {
421         String JavaDoc scriptValue = ("" +
422                 "package org.nanocontainer.script.groovy\n" +
423                 "import org.nanocontainer.testmodel.*\n" +
424                 "builder = new GroovyNodeBuilder()\n" +
425                 "nano = builder.container(parent:parent) {\n" +
426                 " System.out.println('assemblyScope:'+assemblyScope)\n " +
427                 " if ( assemblyScope instanceof ParentAssemblyScope ){\n "+
428                 " System.out.println('parent scope')\n " +
429                 " component(A)\n" +
430                 " } else if ( assemblyScope instanceof SomeAssemblyScope ){\n "+
431                 " System.out.println('child scope')\n " +
432                 " component(B)\n" +
433                 " } else { \n" +
434                 " throw new IllegalArgumentException('Invalid Scope: ' + assemblyScope.getClass().getName())\n" +
435                 " System.out.println('Invalid scope')\n " +
436                 " } \n "+
437                 "}\n");
438
439         Reader JavaDoc script = new StringReader JavaDoc(scriptValue);
440         NanoPicoContainer parent = new DefaultNanoPicoContainer(
441             buildContainer(script, null, new ParentAssemblyScope()));
442
443         assertNotNull(parent.getComponentAdapterOfType(A.class));
444
445         script = new StringReader JavaDoc(scriptValue);
446         PicoContainer pico = buildContainer(script, parent, new SomeAssemblyScope());
447         assertNotNull(pico.getComponentInstance(B.class));
448     }
449
450
451
452     public void testBuildContainerWhenExpectedParentDependencyIsNotFound() {
453         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
454
455         Reader JavaDoc script = new StringReader JavaDoc("" +
456                 "package org.nanocontainer.script.groovy\n" +
457                 "import org.nanocontainer.testmodel.*\n" +
458                 "builder = new GroovyNodeBuilder()\n" +
459                 "nano = builder.container(parent:parent) {\n" +
460                 " if ( assemblyScope instanceof SomeAssemblyScope ){\n "+
461                 " component(B)\n" +
462                 " }\n "+
463                 "}\n");
464
465         try {
466             buildContainer(script, parent, new SomeAssemblyScope());
467             fail("UnsatisfiableDependenciesException expected");
468         } catch (UnsatisfiableDependenciesException e) {
469             // expected
470
}
471     }
472
473     public void testBuildContainerWithParentAttributesPropagatesComponentAdapterFactory() {
474         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(new SetterInjectionComponentAdapterFactory() );
475         Reader JavaDoc script = new StringReader JavaDoc("" +
476                 "package org.nanocontainer.script.groovy\n" +
477                 "import org.nanocontainer.testmodel.*\n" +
478                 "builder = new GroovyNodeBuilder()\n" +
479                 "nano = builder.container(parent:parent) {\n" +
480                 "}\n");
481
482         MutablePicoContainer pico = (MutablePicoContainer)buildContainer(script, parent, ASSEMBLY_SCOPE);
483         // Should be able to get instance that was registered in the parent container
484
ComponentAdapter componentAdapter = pico.registerComponentImplementation(String JavaDoc.class);
485         assertTrue("ComponentAdapter should be originally defined by parent" , componentAdapter instanceof SetterInjectionComponentAdapter);
486     }
487
488
489
490     public void testExceptionThrownWhenParentAttributeDefinedWithinChild() {
491         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer(new SetterInjectionComponentAdapterFactory() );
492         Reader JavaDoc script = new StringReader JavaDoc("" +
493                 "package org.nanocontainer.script.groovy\n" +
494                 "import org.nanocontainer.testmodel.*\n" +
495                 "nano = new GroovyNodeBuilder().container() {\n" +
496                 " component(A)\n" +
497                 " container(parent:parent) {\n" +
498                 " component(B)\n" +
499                 " }\n" +
500                 "}\n");
501
502         try {
503             buildContainer(script, parent, ASSEMBLY_SCOPE);
504             fail("NanoContainerMarkupException should have been thrown.");
505         } catch (NanoContainerMarkupException ignore) {
506             // expected
507
}
508     }
509
510     // TODO
511
public void testSpuriousAttributes() {
512         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
513
514         Reader JavaDoc script = new StringReader JavaDoc("" +
515                 "package org.nanocontainer.script.groovy\n" +
516                 "import org.nanocontainer.testmodel.*\n" +
517                 "builder = new GroovyNodeBuilder()\n" +
518                 "nano = builder.container(jim:'Jam', foo:'bar') {\n" +
519
520                 "}\n");
521             try {
522                 buildContainer(script, parent, ASSEMBLY_SCOPE);
523                 //fail("Should throw exception upon spurious attributes?");
524
} catch (NanoContainerMarkupException ex) {
525                 //ok?
526
}
527     }
528
529
530
531
532     public void testWithDynamicClassPathThatDoesNotExist() {
533         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
534         try {
535             Reader JavaDoc script = new StringReader JavaDoc("" +
536                     " child = null\n" +
537                     " pico = builder.container {\n" +
538                     " classPathElement(path:'this/path/does/not/exist.jar')\n" +
539                     " component(class:\"FooBar\") " +
540                     " }");
541
542             buildContainer(script, parent, ASSEMBLY_SCOPE);
543             fail("should have barfed with bad path exception");
544         } catch (NanoContainerMarkupException e) {
545             // excpected
546
}
547
548     }
549
550
551     public void testWithDynamicClassPath() {
552         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
553         Reader JavaDoc script = new StringReader JavaDoc(
554                 " builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n"
555               + " File testCompJar = org.nanocontainer.TestHelper.getTestCompJarFile()\n"
556               + " compJarPath = testCompJar.getCanonicalPath()\n"
557               + " child = null\n"
558               + " pico = builder.container {\n"
559               + " classPathElement(path:compJarPath)\n"
560               + " component(class:\"TestComp\")\n"
561               + " }");
562
563         MutablePicoContainer pico = (MutablePicoContainer) buildContainer(script, parent, ASSEMBLY_SCOPE);
564
565         assertTrue(pico.getComponentInstances().size() == 1);
566         assertEquals("TestComp", pico.getComponentInstances().get(0).getClass()
567                 .getName());
568     }
569
570
571
572
573     public void testWithDynamicClassPathWithPermissions() {
574         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
575         Reader JavaDoc script = new StringReader JavaDoc(
576                 ""
577                 + " builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n"
578                         + " File testCompJar = org.nanocontainer.TestHelper.getTestCompJarFile()\n"
579                         + " compJarPath = testCompJar.getCanonicalPath()\n"
580                         + " child = null\n"
581                         + " pico = builder.container {\n"
582                         + " classPathElement(path:compJarPath) {\n"
583                         + " grant(new java.net.SocketPermission('google.com','connect'))\n"
584                         + " }\n"
585                         + " component(class:\"TestComp\")\n"
586                         + " }" + "");
587
588         MutablePicoContainer pico = (MutablePicoContainer)buildContainer(script, parent, ASSEMBLY_SCOPE);
589
590         assertTrue(pico.getComponentInstances().size() == 1);
591         // can't actually test the permission under JUNIT control. We're just
592
// testing the syntax here.
593
}
594
595
596     public void testGrantPermissionInWrongPlace() {
597         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
598         try {
599             Reader JavaDoc script = new StringReader JavaDoc("" +
600                     " builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
601                     " File testCompJar = org.nanocontainer.TestHelper.getTestCompJarFile()\n" +
602                     " compJarPath = testCompJar.getCanonicalPath()\n" +
603                     " child = null\n" +
604                     " pico = builder.container {\n" +
605                     " grant(new java.net.SocketPermission('google.com','connect'))\n" +
606                     " }" +
607                     "");
608
609             buildContainer(script, parent, ASSEMBLY_SCOPE);
610             fail("should barf with [Don't know how to create a 'grant' child] exception");
611         } catch (NanoContainerMarkupException e) {
612             assertTrue(e.getMessage().indexOf("Don't know how to create a 'grant' child") > -1);
613         }
614
615     }
616
617     /**
618      * Santity check to make sure testcomp doesn't exist in the testing classpath
619      * otherwise all the tests that depend on the custom classpaths are suspect.
620      */

621     public void testTestCompIsNotAvailableViaSystemClassPath() {
622         try {
623             Class JavaDoc testComp = getClass().getClassLoader().loadClass("TestComp");
624             fail("Invalid configuration TestComp exists in system classpath. ");
625         } catch (ClassNotFoundException JavaDoc ex) {
626             //ok.
627
}
628
629     }
630
631
632     public void testWithParentClassPathPropagatesWithNoParentContainer()throws IOException JavaDoc {
633         File JavaDoc testCompJar = TestHelper.getTestCompJarFile();
634
635         URLClassLoader JavaDoc classLoader = new URLClassLoader JavaDoc(new URL JavaDoc[] {testCompJar.toURL()}, this.getClass().getClassLoader());
636         Class JavaDoc testComp = null;
637
638         try {
639             testComp = classLoader.loadClass("TestComp");
640         } catch (ClassNotFoundException JavaDoc ex) {
641             fail("Unable to load test component from the jar using a url classloader");
642         }
643         Reader JavaDoc script = new StringReader JavaDoc(""
644                 + "pico = builder.container(parent:parent) {\n"
645                 + " component(class:\"TestComp\")\n"
646                 + "}");
647
648         PicoContainer pico = buildContainer(new GroovyContainerBuilder(script, classLoader), null, null);
649         assertNotNull(pico);
650         Object JavaDoc testCompInstance = pico.getComponentInstance(testComp.getName());
651         assertSame(testCompInstance.getClass(), testComp);
652
653     }
654
655     public void testValidationTurnedOnThrowsExceptionForUnknownAttributes() {
656         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
657         Reader JavaDoc script = new StringReader JavaDoc(
658             "import org.nanocontainer.script.NullNodeBuilderDecorationDelegate\n" +
659             "import org.nanocontainer.script.groovy.GroovyNodeBuilder\n" +
660             "import org.nanocontainer.testmodel.*\n" +
661             "builder = new GroovyNodeBuilder(new NullNodeBuilderDecorationDelegate(), GroovyNodeBuilder.PERFORM_ATTRIBUTE_VALIDATION)\n" +
662             "nano = builder.container {\n" +
663             " component(key:'a', instance:'apple', badAttribute:'foo')\n" +
664             "}");
665
666         try {
667             buildContainer(script, parent, ASSEMBLY_SCOPE);
668             fail("GroovyNodeBuilder with validation should have thrown NanoContainerMarkupException");
669         } catch(GroovyCompilationException ex) {
670             //Weed out the groovy compilation exceptions
671
throw ex;
672         } catch (NanoContainerMarkupException ex) {
673             //a-ok
674
}
675     }
676
677     public void testValidationTurnedOffDoesntThrowExceptionForUnknownAttributes() {
678         DefaultNanoPicoContainer parent = new DefaultNanoPicoContainer();
679         Reader JavaDoc script = new StringReader JavaDoc(
680             "import org.nanocontainer.script.NullNodeBuilderDecorationDelegate\n" +
681             "import org.nanocontainer.script.groovy.GroovyNodeBuilder\n" +
682             "import org.nanocontainer.testmodel.*\n" +
683             "builder = new GroovyNodeBuilder(new NullNodeBuilderDecorationDelegate(), GroovyNodeBuilder.SKIP_ATTRIBUTE_VALIDATION)\n" +
684             "nano = builder.container {\n" +
685             " component(key:'a', instance:'apple', badAttribute:'foo')\n" +
686             "}");
687
688         try {
689             buildContainer(script, parent, ASSEMBLY_SCOPE);
690             //a-ok
691
} catch(GroovyCompilationException ex) {
692             //Weed out the groovy compilation exceptions
693
throw ex;
694         } catch (NanoContainerMarkupException ex) {
695             fail("GroovyNodeBuilder with validation turned off should never have thrown NanoContainerMarkupException: " + ex.getMessage());
696         }
697
698     }
699
700
701     public void testComponentAdapterIsPotentiallyScriptable() throws PicoCompositionException {
702         Reader JavaDoc script = new StringReader JavaDoc("" +
703                 "import org.nanocontainer.testmodel.*\n" +
704                 "X.reset()\n" +
705                 "builder = new org.nanocontainer.script.groovy.OldGroovyNodeBuilder()\n" +
706                 "nano = builder.container {\n" +
707                 " ca = component(java.lang.Object) \n" +
708                 " component(instance:ca.getClass().getName())\n" +
709                 "}");
710
711         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
712         // LifecyleContainerBuilder starts the container
713
assertEquals("org.picocontainer.defaults.CachingComponentAdapter", pico.getComponentInstances().get(1).toString());
714     }
715
716
717     private PicoContainer buildContainer(Reader JavaDoc script, PicoContainer parent, Object JavaDoc scope) {
718         return buildContainer(new GroovyContainerBuilder(script, getClass().getClassLoader()), parent, scope);
719     }
720
721
722     public void testChainOfDecoratingPicoContainersCanDoInterceptionOfMutablePicoContainerMethods() throws ClassNotFoundException JavaDoc {
723
724         Reader JavaDoc script = new StringReader JavaDoc("" +
725                 "import org.nanocontainer.testmodel.*\n" +
726                 "builder = new org.nanocontainer.script.groovy.GroovyNodeBuilder()\n" +
727                 "nano = builder.container {\n" +
728                 " decoratingPicoContainer("+ FooDecoratingPicoContainer.class.getName()+")\n" +
729                 " decoratingPicoContainer("+ BarDecoratingPicoContainer.class.getName()+")\n" +
730                 " component(\"java.util.Vector\")\n" +
731                 "}");
732
733         PicoContainer pico = buildContainer(script, null, ASSEMBLY_SCOPE);
734
735
736         // decorators are fairly dirty - they replace a very select implementation in this TestCase.
737
assertNotNull(pico.getComponentInstanceOfType(ArrayList JavaDoc.class));
738         assertNull(pico.getComponentInstanceOfType(Vector JavaDoc.class));
739     }
740
741
742
743
744
745
746
747
748
749 }
750
Popular Tags