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