View Javadoc

1   /*
2    * $Id: TransientRegistryTestCase.java 22377 2011-07-11 12:41:42Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  package org.mule.registry;
11  
12  import org.mule.api.MuleContext;
13  import org.mule.api.context.MuleContextAware;
14  import org.mule.api.lifecycle.Disposable;
15  import org.mule.api.registry.MuleRegistry;
16  import org.mule.api.registry.RegistrationException;
17  import org.mule.tck.junit4.AbstractMuleContextTestCase;
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  
22  import javax.annotation.PostConstruct;
23  import javax.annotation.PreDestroy;
24  
25  import org.junit.Test;
26  
27  import static org.junit.Assert.assertEquals;
28  import static org.junit.Assert.fail;
29  
30  public class TransientRegistryTestCase extends AbstractMuleContextTestCase
31  {
32      @Test
33      public void testObjectLifecycle() throws Exception
34      {
35          muleContext.start();
36  
37          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
38          muleContext.getRegistry().registerObject("test", tracker);
39  
40          muleContext.dispose();
41          assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
42      }
43  
44      @Test
45      public void testJSR250ObjectLifecycle() throws Exception
46      {
47          muleContext.start();
48  
49          JSR250ObjectLifecycleTracker tracker = new JSR250ObjectLifecycleTracker();
50          muleContext.getRegistry().registerObject("test", tracker);
51  
52          muleContext.dispose();
53          assertEquals("[setMuleContext, initialise, dispose]", tracker.getTracker().toString());
54      }
55  
56      @Test
57      public void testObjectBypassLifecycle() throws Exception
58      {
59          muleContext.start();
60  
61          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
62          muleContext.getRegistry().registerObject("test", tracker, MuleRegistry.LIFECYCLE_BYPASS_FLAG);
63          muleContext.dispose();
64          assertEquals("[setMuleContext, stop, dispose]", tracker.getTracker().toString());
65      }
66  
67      @Test
68      public void testObjectBypassInjectors() throws Exception
69      {
70          muleContext.start();
71          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
72          muleContext.getRegistry().registerObject("test", tracker, MuleRegistry.INJECT_PROCESSORS_BYPASS_FLAG);
73          muleContext.dispose();
74          assertEquals("[initialise, start, stop, dispose]", tracker.getTracker().toString());
75      }
76  
77      @Test
78      public void testObjectBypassLifecycleAndInjectors() throws Exception
79      {
80          muleContext.start();
81  
82          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
83          muleContext.getRegistry().registerObject("test", tracker, MuleRegistry.LIFECYCLE_BYPASS_FLAG + MuleRegistry.INJECT_PROCESSORS_BYPASS_FLAG);
84          muleContext.dispose();
85          assertEquals("[stop, dispose]", tracker.getTracker().toString());
86      }
87  
88      @Test
89      public void testObjectLifecycleStates() throws Exception
90      {
91          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
92          muleContext.getRegistry().registerObject("test", tracker);
93          assertEquals("[setMuleContext, initialise]", tracker.getTracker().toString());
94  
95          try
96          {
97              muleContext.initialise();
98              fail("context already initialised");
99          }
100         catch (IllegalStateException e)
101         {
102             //expected
103         }
104 
105         muleContext.start();
106         assertEquals("[setMuleContext, initialise, start]", tracker.getTracker().toString());
107 
108         try
109         {
110             muleContext.start();
111             fail("context already started");
112         }
113         catch (IllegalStateException e)
114         {
115             //expected
116         }
117 
118         muleContext.stop();
119         assertEquals("[setMuleContext, initialise, start, stop]", tracker.getTracker().toString());
120 
121         try
122         {
123             muleContext.stop();
124             fail("context already stopped");
125         }
126         catch (IllegalStateException e)
127         {
128             //expected
129         }
130 
131         muleContext.dispose();
132         assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
133 
134         try
135         {
136             muleContext.dispose();
137             fail("context already disposed");
138         }
139         catch (IllegalStateException e)
140         {
141             //expected
142         }
143     }
144 
145     @Test
146     public void testObjectLifecycleRestart() throws Exception
147     {
148         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
149         muleContext.getRegistry().registerObject("test", tracker);
150 
151         muleContext.start();
152         assertEquals("[setMuleContext, initialise, start]", tracker.getTracker().toString());
153 
154         muleContext.stop();
155         assertEquals("[setMuleContext, initialise, start, stop]", tracker.getTracker().toString());
156 
157         muleContext.start();
158         assertEquals("[setMuleContext, initialise, start, stop, start]", tracker.getTracker().toString());
159 
160         muleContext.dispose();
161         assertEquals("[setMuleContext, initialise, start, stop, start, stop, dispose]", tracker.getTracker().toString());
162     }
163 
164     @Test
165     public void testLifecycleStateOutOfSequenceDisposeFirstWithTransientRegistryDirectly() throws Exception
166     {
167         TransientRegistry reg = new TransientRegistry(muleContext);
168 
169         reg.fireLifecycle(Disposable.PHASE_NAME);
170         
171         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
172         try
173         {
174             reg.registerObject("test", tracker);
175             fail("Cannot register objects on a disposed registry");
176         }
177         catch (RegistrationException e)
178         {
179             //Expected
180         }
181     }
182 
183     @Test
184     public void testLifecycleStateOutOfSequenceStartFirst() throws Exception
185     {
186         muleContext.start();
187         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
188         muleContext.getRegistry().registerObject("test", tracker);
189         //Initialise called implicitly because you cannot start a component without initialising it first
190         assertEquals("[setMuleContext, initialise, start]", tracker.getTracker().toString());
191 
192         muleContext.dispose();
193         //Stop called implicitly because you cannot dispose component without stopping it first
194         assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
195     }
196 
197     @Test
198     public void testLifecycleStateOutOfSequenceStopFirst() throws Exception
199     {
200         try
201         {
202             muleContext.stop();
203             fail("Cannot not stop the context if not started");
204         }
205         catch (IllegalStateException e)
206         {
207             //expected
208         }
209 
210         muleContext.start();
211         muleContext.stop();
212         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
213         muleContext.getRegistry().registerObject("test", tracker);
214         //Start is bypassed because the component was added when the registry was stopped, hence no need to start the component
215         //Stop isn't called either because start was not called
216         //Initialised is called because that pahse has completed in the registry
217         assertEquals("[setMuleContext, initialise]", tracker.getTracker().toString());
218 
219         muleContext.dispose();
220         assertEquals("[setMuleContext, initialise, dispose]", tracker.getTracker().toString());
221     }
222 
223     @Test
224     public void testLifecycleStateOutOfSequenceDisposeFirst() throws Exception
225     {
226         muleContext.dispose();
227 
228         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
229         try
230         {
231             muleContext.getRegistry().registerObject("test", tracker);
232             fail("cannot register objects on a disposed registry");
233         }
234         catch (RegistrationException e)
235         {
236             //Expected
237         }
238     }
239 
240     public class InterfaceBasedTracker extends AbstractLifecycleTracker
241     {
242         // no custom methods
243     }
244 
245     public class JSR250ObjectLifecycleTracker implements MuleContextAware
246     {
247         private final List<String> tracker = new ArrayList<String>();
248 
249         public List<String> getTracker() {
250             return tracker;
251         }
252 
253         public void setMuleContext(MuleContext context)
254         {
255             tracker.add("setMuleContext");
256         }
257 
258         @PostConstruct
259         public void init()
260         {
261             tracker.add("initialise");
262         }
263 
264         @PreDestroy
265         public void dispose()
266         {
267             tracker.add("dispose");
268         }
269     }
270 }