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.interceptor;
8   
9   import org.mule.api.MuleEvent;
10  import org.mule.api.MuleException;
11  import org.mule.api.service.Service;
12  import org.mule.component.AbstractComponent;
13  import org.mule.management.stats.ProcessingTime;
14  import org.mule.model.seda.SedaService;
15  import org.mule.tck.junit4.AbstractMuleContextTestCase;
16  
17  import java.util.ArrayList;
18  import java.util.List;
19  
20  import org.junit.Test;
21  
22  import static org.junit.Assert.assertEquals;
23  import static org.junit.Assert.fail;
24  
25  public class InterceptorTestCase extends AbstractMuleContextTestCase
26  {
27  
28      private final String BEFORE = "Before";
29      private final String AFTER = "After";
30      private final String COMPONENT = "component";
31      private final String INTERCEPTOR_ONE = "inteceptor1";
32      private final String INTERCEPTOR_TWO = "inteceptor2";
33      private final String INTERCEPTOR_THREE = "inteceptor3";
34  
35      private final String SINGLE_INTERCEPTOR_RESULT = INTERCEPTOR_ONE + BEFORE + COMPONENT + INTERCEPTOR_ONE
36                                                       + AFTER;
37      private final String MULTIPLE_INTERCEPTOR_RESULT = INTERCEPTOR_ONE + BEFORE + INTERCEPTOR_TWO + BEFORE
38                                                         + INTERCEPTOR_THREE + BEFORE + COMPONENT
39                                                         + INTERCEPTOR_THREE + AFTER + INTERCEPTOR_TWO + AFTER
40                                                         + INTERCEPTOR_ONE + AFTER;
41  
42      @Test
43      public void testSingleInterceptor() throws Exception
44      {
45          Service service = createUninitializedService();
46          TestComponent component = (TestComponent) service.getComponent();
47  
48          List interceptors = new ArrayList();
49          interceptors.add(new TestInterceptor(INTERCEPTOR_ONE));
50          component.setInterceptors(interceptors);
51          service.initialise();
52          service.start();
53  
54          MuleEvent result = component.process(getTestInboundEvent(""));
55  
56          assertEquals(SINGLE_INTERCEPTOR_RESULT, result.getMessageAsString());
57      }
58  
59      @Test
60      public void testMultipleInterceptor() throws Exception
61      {
62          Service service = createUninitializedService();
63          TestComponent component = (TestComponent) service.getComponent();
64  
65          List interceptors = new ArrayList();
66          interceptors.add(new TestInterceptor(INTERCEPTOR_ONE));
67          interceptors.add(new TestInterceptor(INTERCEPTOR_TWO));
68          interceptors.add(new TestInterceptor(INTERCEPTOR_THREE));
69          component.setInterceptors(interceptors);
70          service.initialise();
71          service.start();
72  
73          MuleEvent result = component.process(getTestInboundEvent(""));
74  
75          assertEquals(MULTIPLE_INTERCEPTOR_RESULT, result.getMessageAsString());
76      }
77  
78      @Test
79      public void testSingleInterceptorStack() throws Exception
80      {
81          Service service = createUninitializedService();
82          TestComponent component = (TestComponent) service.getComponent();
83  
84          List interceptors = new ArrayList();
85          List stackInterceptors = new ArrayList();
86          stackInterceptors.add(new TestInterceptor(INTERCEPTOR_ONE));
87          interceptors.add(new InterceptorStack(stackInterceptors));
88          component.setInterceptors(interceptors);
89          service.initialise();
90          service.start();
91  
92          MuleEvent result = component.process(getTestInboundEvent(""));
93  
94          assertEquals(SINGLE_INTERCEPTOR_RESULT, result.getMessageAsString());
95      }
96  
97      @Test
98      public void testMultipleInterceptorStack() throws Exception
99      {
100         Service service = createUninitializedService();
101         TestComponent component = (TestComponent) service.getComponent();
102 
103         List interceptors = new ArrayList();
104         interceptors.add(new TestInterceptor(INTERCEPTOR_ONE));
105         List stackInterceptors = new ArrayList();
106         stackInterceptors.add(new TestInterceptor(INTERCEPTOR_TWO));
107         stackInterceptors.add(new TestInterceptor(INTERCEPTOR_THREE));
108         interceptors.add(new InterceptorStack(stackInterceptors));
109         component.setInterceptors(interceptors);
110         service.initialise();
111         service.start();
112 
113         MuleEvent result = component.process(getTestInboundEvent(""));
114 
115         assertEquals(MULTIPLE_INTERCEPTOR_RESULT, result.getMessageAsString());
116     }
117 
118     @Test
119     public void testMultipleInterceptorStack2() throws Exception
120     {
121         Service service = createUninitializedService();
122         TestComponent component = (TestComponent) service.getComponent();
123 
124         List interceptors = new ArrayList();
125         interceptors.add(new TestInterceptor(INTERCEPTOR_ONE));
126         interceptors.add(new TestInterceptor(INTERCEPTOR_TWO));
127         interceptors.add(new TestInterceptor(INTERCEPTOR_THREE));
128         List stackInterceptors = new ArrayList();
129         stackInterceptors.add(new TestInterceptor(INTERCEPTOR_ONE));
130         stackInterceptors.add(new TestInterceptor(INTERCEPTOR_TWO));
131         stackInterceptors.add(new TestInterceptor(INTERCEPTOR_THREE));
132         interceptors.add(new InterceptorStack(stackInterceptors));
133         component.setInterceptors(interceptors);
134         service.initialise();
135         service.start();
136 
137         MuleEvent result = component.process(getTestInboundEvent(""));
138 
139         assertEquals(INTERCEPTOR_ONE + BEFORE + INTERCEPTOR_TWO + BEFORE + INTERCEPTOR_THREE + BEFORE
140                      + INTERCEPTOR_ONE + BEFORE + INTERCEPTOR_TWO + BEFORE + INTERCEPTOR_THREE + BEFORE
141                      + COMPONENT + INTERCEPTOR_THREE + AFTER + INTERCEPTOR_TWO + AFTER + INTERCEPTOR_ONE
142                      + AFTER + INTERCEPTOR_THREE + AFTER + INTERCEPTOR_TWO + AFTER + INTERCEPTOR_ONE + AFTER,
143             result.getMessageAsString());
144     }
145 
146     class TestInterceptor extends AbstractEnvelopeInterceptor
147     {
148 
149         private String name;
150 
151         public TestInterceptor(String name)
152         {
153             this.name = name;
154         }
155 
156         @Override
157         public MuleEvent after(MuleEvent event)
158         {
159             try
160             {
161                 event.getMessage().setPayload(event.getMessage().getPayloadAsString() + name + AFTER);
162             }
163             catch (Exception e)
164             {
165                 e.printStackTrace();
166                 fail(e.getMessage());
167             }
168             return event;
169         }
170 
171         @Override
172         public MuleEvent before(MuleEvent event)
173         {
174             try
175             {
176                 event.getMessage().setPayload(event.getMessage().getPayloadAsString() + name + BEFORE);
177             }
178             catch (Exception e)
179             {
180                 e.printStackTrace();
181                 fail(e.getMessage());
182             }
183             return event;
184         }
185 
186         @Override
187         public MuleEvent last(MuleEvent event, ProcessingTime time, long startTime, boolean exceptionWasThrown) throws MuleException
188         {
189             return event;
190         }
191     }
192 
193     protected Service createUninitializedService() throws Exception
194     {
195         TestComponent component = new TestComponent();
196         Service service = new SedaService(muleContext);
197         service.setName("name");
198         service.setComponent(component);
199         service.setModel(muleContext.getRegistry().lookupSystemModel());
200         return service;
201     }
202 
203     class TestComponent extends AbstractComponent
204     {
205         @Override
206         protected Object doInvoke(MuleEvent event) throws Exception
207         {
208             return event.getMessageAsString() + COMPONENT;
209         }
210     }
211 
212 }