001 package org.picocontainer.lifecycle;
002
003 import static org.junit.Assert.assertEquals;
004 import org.junit.Test;
005 import org.picocontainer.*;
006 import org.picocontainer.containers.EmptyPicoContainer;
007 import org.picocontainer.monitors.NullComponentMonitor;
008
009 import static org.picocontainer.Characteristics.CACHE;
010
011 public class LazyLifecycleStrategyTestCase {
012
013 @Test
014 public void testStartStopAndDisposeCanBeLazy() {
015 final StringBuilder sb = new StringBuilder();
016 MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) {
017 @Override
018 public boolean isLazy(ComponentAdapter<?> adapter) {
019 return true;
020 }
021 }, new EmptyPicoContainer());
022 pico.addComponent(sb);
023 pico.as(CACHE).addComponent(MyStartableComp.class);
024 pico.start();
025 assertEquals("", sb.toString()); // normally would be "<" here
026 pico.getComponent(MyStartableComp.class);
027 pico.getComponent(MyStartableComp.class);
028 assertEquals("<", sb.toString()); // only one start() issued even if two or more getComponents
029 pico.stop();
030 assertEquals("<>", sb.toString());
031 pico.dispose();
032 assertEquals("<>!", sb.toString());
033 }
034
035 @Test
036 public void testStartStopAndDisposeCanBeLazyWithoutGet() {
037 final StringBuilder sb = new StringBuilder();
038 MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) {
039 @Override
040 public boolean isLazy(ComponentAdapter<?> adapter) {
041 return true;
042 }
043 }, new EmptyPicoContainer());
044 pico.addComponent(sb);
045 pico.as(CACHE).addComponent(MyStartableComp.class);
046 pico.start();
047 assertEquals("", sb.toString());
048 pico.stop();
049 assertEquals("", sb.toString());
050 pico.dispose();
051 assertEquals("", sb.toString());
052 }
053
054 @Test
055 public void testStartStopAndDisposeCanBeConditionallyLazy() {
056 final StringBuilder sb = new StringBuilder();
057 MutablePicoContainer pico = new DefaultPicoContainer(new StartableLifecycleStrategy(new NullComponentMonitor()) {
058 @Override
059 public boolean isLazy(ComponentAdapter<?> adapter) {
060 return adapter.getComponentImplementation() == MyStartableComp.class;
061 }
062 }, new EmptyPicoContainer());
063 pico.addComponent(sb);
064 pico.as(CACHE).addComponent(MyStartableComp.class);
065 pico.as(CACHE).addComponent(MyDifferentStartableComp.class);
066 pico.start();
067 assertEquals("{", sb.toString()); // one component started, one not
068 pico.getComponent(MyStartableComp.class);
069 pico.getComponent(MyStartableComp.class); // should not start a second time
070 assertEquals("{<", sb.toString()); // both components now started, one lazily.
071 pico.stop();
072 assertEquals("{<}>", sb.toString());
073 pico.dispose();
074 assertEquals("{<}>?!", sb.toString());
075 }
076
077 public static class MyStartableComp implements Startable, Disposable {
078 private StringBuilder sb;
079
080 public MyStartableComp(StringBuilder sb) {
081 this.sb = sb;
082 }
083
084 public void start() {
085 sb.append("<");
086 }
087
088 public void stop() {
089 sb.append(">");
090 }
091
092 public void dispose() {
093 sb.append("!");
094 }
095 }
096
097 public static class MyDifferentStartableComp implements Startable, Disposable {
098 private StringBuilder sb;
099
100 public MyDifferentStartableComp(StringBuilder sb) {
101 this.sb = sb;
102 }
103
104 public void start() {
105 sb.append("{");
106 }
107
108 public void stop() {
109 sb.append("}");
110 }
111
112 public void dispose() {
113 sb.append("?");
114 }
115 }
116
117 }