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.test.construct;
8   
9   import static org.junit.Assert.assertEquals;
10  import static org.junit.Assert.assertFalse;
11  import static org.junit.Assert.assertNotNull;
12  import static org.junit.Assert.assertNotSame;
13  import static org.junit.Assert.assertNull;
14  import static org.junit.Assert.assertTrue;
15  
16  import org.mule.DefaultMuleMessage;
17  import org.mule.api.MuleEvent;
18  import org.mule.api.MuleMessage;
19  import org.mule.api.MuleMessageCollection;
20  import org.mule.api.config.ThreadingProfile;
21  import org.mule.api.endpoint.InboundEndpoint;
22  import org.mule.api.transport.PropertyScope;
23  import org.mule.construct.SimpleFlowConstruct;
24  import org.mule.endpoint.DefaultInboundEndpoint;
25  import org.mule.source.StartableCompositeMessageSource;
26  import org.mule.tck.junit4.FunctionalTestCase;
27  import org.mule.tck.testmodels.fruit.Apple;
28  import org.mule.tck.testmodels.fruit.Banana;
29  import org.mule.tck.testmodels.fruit.Fruit;
30  import org.mule.tck.testmodels.fruit.FruitBowl;
31  import org.mule.tck.testmodels.fruit.Orange;
32  
33  import java.util.HashMap;
34  import java.util.List;
35  import java.util.Map;
36  
37  import org.junit.Test;
38  
39  public class FlowConfigurationFunctionalTestCase extends FunctionalTestCase
40  {
41  
42      public FlowConfigurationFunctionalTestCase()
43      {
44          setDisposeContextPerClass(true);
45      }
46  
47      @Override
48      protected String getConfigResources()
49      {
50          return "org/mule/test/construct/flow.xml";
51      }
52  
53      @Test
54      public void testFlow() throws Exception
55      {
56          final SimpleFlowConstruct flow = muleContext.getRegistry().lookupObject("flow");
57          assertEquals(DefaultInboundEndpoint.class, flow.getMessageSource().getClass());
58          assertEquals("vm://in", ((InboundEndpoint) flow.getMessageSource()).getEndpointURI()
59              .getUri()
60              .toString());
61          assertEquals(5, flow.getMessageProcessors().size());
62          assertNotNull(flow.getExceptionListener());
63  
64          assertEquals("012xyzabc3",
65              muleContext.getClient()
66                  .send("vm://in", new DefaultMuleMessage("0", muleContext))
67                  .getPayloadAsString());
68  
69      }
70  
71      @Test
72      public void testFlowCompositeSource() throws Exception
73      {
74          final SimpleFlowConstruct flow = muleContext.getRegistry().lookupObject("flow2");
75          assertEquals(StartableCompositeMessageSource.class, flow.getMessageSource().getClass());
76          assertEquals(2, flow.getMessageProcessors().size());
77  
78          assertEquals("01xyz",
79              muleContext.getClient()
80                  .send("vm://in2", new DefaultMuleMessage("0", muleContext))
81                  .getPayloadAsString());
82          assertEquals("01xyz",
83              muleContext.getClient()
84                  .send("vm://in3", new DefaultMuleMessage("0", muleContext))
85                  .getPayloadAsString());
86  
87      }
88  
89      @Test
90      public void testInOutFlow() throws Exception
91      {
92          muleContext.getClient().send("vm://inout-in", new DefaultMuleMessage("0", muleContext));
93          assertEquals("0", muleContext.getClient()
94              .request("vm://inout-out", RECEIVE_TIMEOUT)
95              .getPayloadAsString());
96      }
97  
98      @Test
99      public void testInOutAppendFlow() throws Exception
100     {
101         muleContext.getClient().send("vm://inout-append-in", new DefaultMuleMessage("0", muleContext));
102         assertEquals("0inout", muleContext.getClient()
103             .request("vm://inout-append-out", RECEIVE_TIMEOUT)
104             .getPayloadAsString());
105     }
106 
107     @Test
108     public void testSplitAggregateFlow() throws Exception
109     {
110         final Apple apple = new Apple();
111         final Banana banana = new Banana();
112         final Orange orange = new Orange();
113         final FruitBowl fruitBowl = new FruitBowl(apple, banana);
114         fruitBowl.addFruit(orange);
115 
116         muleContext.getClient().send("vm://split-aggregate-in",
117             new DefaultMuleMessage(fruitBowl, muleContext));
118 
119         final MuleMessage result = muleContext.getClient().request("vm://split-aggregate-out",
120             RECEIVE_TIMEOUT);
121 
122         assertNotNull(result);
123         assertTrue(result instanceof MuleMessageCollection);
124         final MuleMessageCollection coll = (MuleMessageCollection) result;
125         assertEquals(3, coll.size());
126         final List<?> results = (List<?>) coll.getPayload();
127 
128         assertTrue(apple.isBitten());
129         assertTrue(banana.isBitten());
130         assertTrue(orange.isBitten());
131 
132         assertTrue(results.contains(apple));
133         assertTrue(results.contains(banana));
134         assertTrue(results.contains(orange));
135     }
136 
137     @Test
138     public void testSplitAggregateListFlow() throws Exception
139     {
140         final Apple apple = new Apple();
141         final Banana banana = new Banana();
142         final Orange orange = new Orange();
143         final FruitBowl fruitBowl = new FruitBowl(apple, banana);
144         fruitBowl.addFruit(orange);
145 
146         muleContext.getClient().send("vm://split-aggregate-list-in",
147             new DefaultMuleMessage(fruitBowl.getFruit(), muleContext));
148 
149         final MuleMessage result = muleContext.getClient().request("vm://split-aggregate-list-out",
150             RECEIVE_TIMEOUT);
151 
152         assertNotNull(result);
153         assertTrue(result instanceof MuleMessageCollection);
154         final MuleMessageCollection coll = (MuleMessageCollection) result;
155         assertEquals(3, coll.size());
156         final List<?> results = (List<?>) coll.getPayload();
157 
158         assertTrue(apple.isBitten());
159         assertTrue(banana.isBitten());
160         assertTrue(orange.isBitten());
161 
162         assertTrue(results.contains(apple));
163         assertTrue(results.contains(banana));
164         assertTrue(results.contains(orange));
165     }
166 
167     @Test
168     public void testSplitAggregateListFlowSingleItem() throws Exception
169     {
170         final Apple apple = new Apple();
171         final FruitBowl fruitBowl = new FruitBowl();
172         fruitBowl.addFruit(apple);
173 
174         muleContext.getClient().send("vm://split-aggregate-singleton-list-in",
175             new DefaultMuleMessage(fruitBowl.getFruit(), muleContext));
176 
177         final MuleMessage result = muleContext.getClient().request("vm://split-aggregate-singleton-list-out",
178             RECEIVE_TIMEOUT);
179 
180         assertNotNull(result);
181         assertTrue(result instanceof MuleMessageCollection);
182         final MuleMessageCollection coll = (MuleMessageCollection) result;
183         assertEquals(1, coll.size());
184         final List<?> results = (List<?>) coll.getPayload();
185 
186         assertTrue(apple.isBitten());
187 
188         assertTrue(results.contains(apple));
189     }
190     
191     @Test
192     public void testSplitAggregateResponseListFlow() throws Exception
193     {
194         final Apple apple = new Apple();
195         final Banana banana = new Banana();
196         final Orange orange = new Orange();
197         final FruitBowl fruitBowl = new FruitBowl(apple, banana);
198         fruitBowl.addFruit(orange);
199 
200         final MuleMessage result  = muleContext.getClient().send("vm://split-aggregate-response-list-in",
201             new DefaultMuleMessage(fruitBowl.getFruit(), muleContext));
202 
203         assertNotNull(result);
204         assertTrue(result instanceof MuleMessageCollection);
205         final MuleMessageCollection coll = (MuleMessageCollection) result;
206         assertEquals(3, coll.size());
207         final List<?> results = (List<?>) coll.getPayload();
208         assertEquals(3, results.size());
209 
210         assertTrue(apple.isBitten());
211         assertTrue(banana.isBitten());
212         assertTrue(orange.isBitten());
213 
214         assertTrue(results.contains(apple));
215         assertTrue(results.contains(banana));
216         assertTrue(results.contains(orange));
217     }
218 
219     @Test
220     public void testSplitAggregateResponseListFlowSingleItem() throws Exception
221     {
222         final Apple apple = new Apple();
223         final FruitBowl fruitBowl = new FruitBowl();
224         fruitBowl.addFruit(apple);
225 
226         final MuleMessage result  = muleContext.getClient().send("vm://split-aggregate-response-singleton-list-in",
227             new DefaultMuleMessage(fruitBowl.getFruit(), muleContext));
228 
229         assertNotNull(result);
230         assertTrue(result instanceof MuleMessageCollection);
231         final MuleMessageCollection coll = (MuleMessageCollection) result;
232         assertEquals(1, coll.size());
233         final List<?> results = (List<?>) coll.getPayload();
234         assertEquals(1, results.size());
235 
236         assertTrue(apple.isBitten());
237         assertTrue(results.contains(apple));
238     }
239 
240     @Test
241     public void testSplitAggregateMapFlow() throws Exception
242     {
243         Map map = new HashMap<String, Fruit>();
244         final Apple apple = new Apple();
245         final Banana banana = new Banana();
246         final Orange orange = new Orange();
247         map.put("apple", apple);
248         map.put("banana", banana);
249         map.put("orange", orange);
250 
251         MuleEvent result = ((SimpleFlowConstruct) muleContext.getRegistry().lookupFlowConstruct("split-map")).process(getTestEvent(map));
252 
253         assertNotNull(result);
254         assertTrue(result.getMessage() instanceof MuleMessageCollection);
255 
256         final MuleMessageCollection coll = (MuleMessageCollection) result.getMessage();
257         assertEquals(3, coll.size());
258         final MuleMessage[] results = coll.getMessagesAsArray();
259 
260         assertTrue(apple.isBitten());
261         assertTrue(banana.isBitten());
262         assertTrue(orange.isBitten());
263 
264         assertNotNull(results[0].getProperty("key", PropertyScope.INVOCATION));
265         assertNotNull(results[1].getProperty("key", PropertyScope.INVOCATION));
266         assertNotNull(results[2].getProperty("key", PropertyScope.INVOCATION));
267     }
268 
269     @Test
270     public void testSplitFilterAggregateFlow() throws Exception
271     {
272         final Apple apple = new Apple();
273         final Banana banana = new Banana();
274         final Orange orange = new Orange();
275         final FruitBowl fruitBowl = new FruitBowl(apple, banana);
276         fruitBowl.addFruit(orange);
277 
278         muleContext.getClient().send("vm://split-filter-aggregate-in",
279             new DefaultMuleMessage(fruitBowl, muleContext));
280 
281         final MuleMessage result = muleContext.getClient().request("vm://split-filter-aggregate-out",
282             RECEIVE_TIMEOUT);
283 
284         assertNotNull(result);
285         assertTrue(result instanceof MuleMessageCollection);
286         final MuleMessageCollection coll = (MuleMessageCollection) result;
287         assertEquals(1, coll.size());
288         final List<?> results = (List<?>) coll.getPayload();
289 
290         assertTrue(results.contains(apple));
291         assertFalse(results.contains(banana));
292         assertFalse(results.contains(orange));
293     }
294 
295     @Test
296     public void testMessageChunkSplitAggregateFlow() throws Exception
297     {
298         String payload = "";
299         for (int i = 0; i < 100; i++)
300         {
301             payload += TEST_MESSAGE;
302         }
303 
304         muleContext.getClient().send("vm://message-chunk-split-aggregate-in",
305             new DefaultMuleMessage(payload, muleContext));
306 
307         final MuleMessage result = muleContext.getClient().request("vm://message-chunk-split-aggregate-out",
308             RECEIVE_TIMEOUT);
309 
310         assertNotNull(result);
311         assertNotSame(payload, result.getPayload());
312         assertEquals(payload, result.getPayloadAsString());
313     }
314 
315     @Test
316     public void testComponentsFlow() throws Exception
317     {
318         final MuleMessage result = muleContext.getClient().send("vm://components",
319             new DefaultMuleMessage(TEST_MESSAGE, muleContext));
320 
321         assertNotNull(result);
322         assertNotSame(TEST_MESSAGE + "test", result.getPayload());
323     }
324 
325     @Test
326     public void testWireTapFlow() throws Exception
327     {
328         muleContext.getClient().send("vm://wiretap-in", new DefaultMuleMessage(TEST_MESSAGE, muleContext));
329 
330         final MuleMessage result = muleContext.getClient().request("vm://wiretap-out", RECEIVE_TIMEOUT);
331         final MuleMessage tapResult = muleContext.getClient().request("vm://wiretap-tap", RECEIVE_TIMEOUT);
332 
333         assertNotNull(result);
334         assertNotNull(tapResult);
335         assertNotSame(result, tapResult);
336         assertEquals(TEST_MESSAGE + "inout", result.getPayloadAsString());
337         assertEquals(TEST_MESSAGE + "intap", tapResult.getPayloadAsString());
338     }
339 
340     @Test
341     public void testResponseElement() throws Exception
342     {
343         final MuleMessage result = muleContext.getClient().send("vm://response",
344             new DefaultMuleMessage("", muleContext));
345 
346         assertNotNull(result);
347         assertEquals("abcdefghi", result.getPayloadAsString());
348     }
349 
350     @Test
351     public void testAsyncOneWayEndpoint() throws Exception
352     {
353         muleContext.getClient().send("vm://async-oneway-in", new DefaultMuleMessage("0", muleContext));
354         final MuleMessage result = muleContext.getClient().request("vm://async-oneway-out", RECEIVE_TIMEOUT);
355         final MuleMessage asyncResult = muleContext.getClient().request("vm://async-async-oneway-out",
356             RECEIVE_TIMEOUT);
357 
358         assertNotNull(result);
359         assertNotNull(asyncResult);
360         assertEquals("0ac", result.getPayloadAsString());
361         assertEquals("0ab", asyncResult.getPayloadAsString());
362     }
363 
364     @Test
365     public void testAsyncRequestResponseEndpoint() throws Exception
366     {
367         muleContext.getClient().send("vm://async-requestresponse-in",
368             new DefaultMuleMessage("0", muleContext));
369         final MuleMessage result = muleContext.getClient().request("vm://async-requestresponse-out",
370             RECEIVE_TIMEOUT);
371         final MuleMessage asyncResult = muleContext.getClient().request(
372             "vm://async-async-requestresponse-out", RECEIVE_TIMEOUT);
373 
374         assertNotNull(result);
375         assertNotNull(asyncResult);
376         assertEquals("0ac", result.getPayloadAsString());
377         assertEquals("0ab", asyncResult.getPayloadAsString());
378     }
379 
380     @Test
381     public void testAsyncTransactionalEndpoint() throws Exception
382     {
383         MuleMessage response = muleContext.getClient().send("vm://async-tx-in",
384             new DefaultMuleMessage("0", muleContext));
385         assertNotNull(response);
386         assertNotNull(response.getExceptionPayload());
387 
388         final MuleMessage result = muleContext.getClient().request("vm://async-requestresponse-out",
389             RECEIVE_TIMEOUT);
390         final MuleMessage asyncResult = muleContext.getClient().request("vm://async-async-oneway-out",
391             RECEIVE_TIMEOUT);
392 
393         assertNull(result);
394         assertNull(asyncResult);
395     }
396 
397     // @Test
398     // public void testTransactional() throws Exception
399     // {
400     // muleContext.getClient().dispatch("vm://transactional-in", new
401     // DefaultMuleMessage("", muleContext));
402     //
403     // }
404     //
405     // @Test
406     // public void testTransactionalRollback() throws Exception
407     // {
408     // muleContext.getClient().dispatch("vm://transactional-rollback-in",
409     // new DefaultMuleMessage("", muleContext));
410     //
411     // }
412 
413     @Test
414     public void testMulticaster() throws Exception
415     {
416         muleContext.getClient()
417             .send("vm://multicaster-in", new DefaultMuleMessage(TEST_MESSAGE, muleContext));
418 
419         final MuleMessage result1 = muleContext.getClient().request("vm://multicaster-out1", RECEIVE_TIMEOUT);
420         final MuleMessage result2 = muleContext.getClient().request("vm://multicaster-out2", RECEIVE_TIMEOUT);
421         final MuleMessage result3 = muleContext.getClient().request("vm://multicaster-out3", RECEIVE_TIMEOUT);
422 
423         assertNotNull(result1);
424         assertNotNull(result2);
425         assertNotNull(result3);
426         assertNotSame(result1, result2);
427         assertNotSame(result1, result3);
428         assertNotSame(result2, result3);
429 
430         assertEquals(TEST_MESSAGE, result1.getPayload());
431         assertEquals(TEST_MESSAGE, result1.getPayload());
432         assertEquals(TEST_MESSAGE, result1.getPayload());
433 
434     }
435 
436     @Test
437     public void testRecipientList() throws Exception
438     {
439         muleContext.getClient().send("vm://recipient-list-in",
440             new DefaultMuleMessage(TEST_MESSAGE, muleContext));
441 
442         final MuleMessage result1 = muleContext.getClient().request("vm://recipient-list-out1",
443             RECEIVE_TIMEOUT);
444         final MuleMessage result2 = muleContext.getClient().request("vm://recipient-list-out2",
445             RECEIVE_TIMEOUT);
446         final MuleMessage result3 = muleContext.getClient().request("vm://recipient-list-out3",
447             RECEIVE_TIMEOUT);
448 
449         assertNotNull(result1);
450         assertNotNull(result2);
451         assertNotNull(result3);
452         assertNotSame(result1, result2);
453         assertNotSame(result1, result3);
454         assertNotSame(result2, result3);
455 
456         assertEquals(TEST_MESSAGE, result1.getPayload());
457         assertEquals(TEST_MESSAGE, result2.getPayload());
458         assertEquals(TEST_MESSAGE, result3.getPayload());
459 
460     }
461 
462     @Test
463     public void testChoiceWithoutOutboundEndpoints() throws Exception
464     {
465         assertEquals("foo Hello foo",
466             muleContext.getClient()
467                 .send("vm://choice2-in", new DefaultMuleMessage("foo", muleContext))
468                 .getPayloadAsString());
469         assertEquals("bar Hello bar",
470             muleContext.getClient()
471                 .send("vm://choice2-in", new DefaultMuleMessage("bar", muleContext))
472                 .getPayloadAsString());
473         assertEquals("egh Hello ?",
474             muleContext.getClient()
475                 .send("vm://choice2-in", new DefaultMuleMessage("egh", muleContext))
476                 .getPayloadAsString());
477     }
478 
479     @Test
480     public void testFlowRef() throws Exception
481     {
482         assertEquals("012xyzabc312xyzabc3",
483             muleContext.getClient()
484                 .send("vm://flow-ref-in", new DefaultMuleMessage("0", muleContext))
485                 .getPayloadAsString());
486     }
487 
488     @Test
489     public void testInvoke() throws Exception
490     {
491         assertEquals("0recieved",
492             muleContext.getClient()
493                 .send("vm://invoke-in", new DefaultMuleMessage("0", muleContext))
494                 .getPayloadAsString());
495     }
496 
497     @Test
498     public void testInvoke2() throws Exception
499     {
500         MuleMessage message = new DefaultMuleMessage("0", muleContext);
501         message.setOutboundProperty("one", "header1val");
502         assertEquals("header1valrecieved", muleContext.getClient()
503             .send("vm://invoke2-in", message)
504             .getPayloadAsString());
505     }
506 
507     @Test
508     public void testInvoke3() throws Exception
509     {
510         // ensure multiple arguments work
511         muleContext.getClient().send("vm://invoke3-in", new DefaultMuleMessage("0", muleContext));
512     }
513 
514     @Test
515     public void testInvoke4() throws Exception
516     {
517         // ensure no arguments work
518         muleContext.getClient().send("vm://invoke4-in", new DefaultMuleMessage("0", muleContext));
519     }
520 
521     @Test
522     public void testEnrichWithAttributes() throws Exception
523     {
524         MuleMessage message = new DefaultMuleMessage("0", muleContext);
525         assertEquals(
526             "0Hello",
527             muleContext.getClient()
528                 .send("vm://enrich-in", message)
529                 .getProperty("helloHeader", PropertyScope.INBOUND));
530     }
531 
532     @Test
533     public void testEnrichWithElements() throws Exception
534     {
535         MuleMessage message = new DefaultMuleMessage("0", muleContext);
536         MuleMessage result = muleContext.getClient().send("vm://enrich2-in", message);
537 
538         assertEquals("0Hello", result.getProperty("helloHeader", PropertyScope.INBOUND));
539         assertEquals("0Hello", result.getProperty("helloHeader2", PropertyScope.INBOUND));
540     }
541 
542     @Test
543     public void testEnrichUsingComponent() throws Exception
544     {
545         // MULE-5544
546         MuleMessage message = new DefaultMuleMessage("0", muleContext);
547         MuleMessage result = muleContext.getClient().send("vm://enrichcomponent-in", message);
548 
549         assertEquals("0", result.getProperty("echoHeader", PropertyScope.INBOUND));
550     }
551 
552     @Test
553     public void testEnrichUsingComponent2() throws Exception
554     {
555         // MULE-5544
556         MuleMessage message = new DefaultMuleMessage("0", muleContext);
557         MuleMessage result = muleContext.getClient().send("vm://enrichcomponent2-in", message);
558 
559         assertEquals("0", result.getProperty("echoHeader", PropertyScope.INBOUND));
560     }
561 
562     @Test
563     public void testLoggerMessage() throws Exception
564     {
565         MuleMessage message = new DefaultMuleMessage("0", muleContext);
566         muleContext.getClient().send("vm://loggermessage-in", message);
567     }
568 
569     @Test
570     public void testLoggerHeader() throws Exception
571     {
572         MuleMessage message = new DefaultMuleMessage("0", muleContext);
573         message.setOutboundProperty("toLog", "valueToLog");
574         muleContext.getClient().send("vm://loggerheader-in", message);
575     }
576 
577     static class Pojo
578     {
579 
580         public void method()
581         {
582 
583         }
584 
585         public void method(Object arg1, Object arg2)
586         {
587 
588         }
589     }
590 
591     @Test
592     public void testFlowThreadingProfile() throws Exception
593     {
594         SimpleFlowConstruct flow = muleContext.getRegistry().lookupObject("flow-threading-profile");
595         assertTrue(flow.getThreadingProfile().isDoThreading());
596         assertEquals(2, flow.getThreadingProfile().getMaxThreadsActive());
597         assertEquals(1, flow.getThreadingProfile().getMaxThreadsIdle());
598         assertEquals(ThreadingProfile.WHEN_EXHAUSTED_RUN, flow.getThreadingProfile().getPoolExhaustedAction());
599     }
600 
601     @Test
602     public void testCustomMessageRouter() throws Exception
603     {
604         MuleMessage message = new DefaultMuleMessage("", muleContext);
605         MuleMessage result = muleContext.getClient().send("vm://customRouter-in", message);
606         assertEquals("abc", result.getPayloadAsString());
607     }
608 
609     @Test
610     public void testPoll() throws Exception
611     {
612         MuleMessage message = muleContext.getClient().request("vm://poll-out", RECEIVE_TIMEOUT);
613         assertNotNull(message);
614         assertEquals(" Hello fooout", message.getPayloadAsString());
615     }
616 
617     @Test
618     public void testPollFlowRef() throws Exception
619     {
620         MuleMessage message = muleContext.getClient().request("vm://poll2-out", RECEIVE_TIMEOUT);
621         assertNotNull(message);
622         assertEquals("pollappendout", message.getPayloadAsString());
623     }
624 
625 }