camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Minhtri Tran <mtran7...@gmail.com>
Subject Re: Setting multiple expectations when streamCaching is on
Date Wed, 15 Nov 2017 15:29:40 GMT
Thanks Gregor and Claus.  I will use version 2.20.

-Minhtri

On Wed, Nov 15, 2017 at 4:26 AM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
> Hi
>
> I logged a ticket
> https://issues.apache.org/jira/browse/CAMEL-12010
>
> On Wed, Nov 15, 2017 at 10:18 AM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
>> Hi
>>
>> Okay I was building a little test in camel-core to reproduce this, and
>> its because of the Camel 2.20 optimisations we have done around type
>> converters.
>>
>> So when the data is converted to a String then we hit this optimised
>> IO converter
>> https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/converter/IOConverterOptimised.java#L49
>>
>> That ensures the stream cache is reset before any type conversion
>> attempt, which then ensures we can re-read the payload from the
>> unmarshal operation of jackson.
>>
>>
>>
>> On Wed, Nov 15, 2017 at 10:05 AM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
>>> Hi
>>>
>>> I guess its a bit expected as the output from jackson is streaming
>>> based and even so when stream caching is enabled - then when you
>>> convert the payload the 2nd time in the expectation then the payload
>>> has not been reset prior and therefore is eol, and the assertion
>>> fails.
>>>
>>> Camel will automatic reset stream caching (when possible) during
>>> routing, so if you had 2 mock endpoints mock:a and mock:b, and each
>>> had one assertion like yours, then it would work.
>>>
>>> However as Gregor writes it seems we have improved something somewhere
>>> in 2.20 > 2.19 that mitigates this problem. It could be in
>>> camel-jackson or Camel data formats, or in some stream caching type
>>> converter, etc. I haven't looked deeper or tried to run this test /
>>> debug it etc.
>>>
>>> You can just add a .convertBodyTo(String.class) before your mock
>>> endpoint and your test on 2.19.x would work.
>>>
>>> An alternative is to consider making mock endpoint reset the stream
>>> caching for each expectation it evaluations (which would be like some
>>> kind of root fix).
>>>
>>> On Fri, Nov 10, 2017 at 7:12 PM, Minhtri Tran <mtran7305@gmail.com> wrote:
>>>> Hello,
>>>>
>>>> I am currently having an issue with setting up multiple expectations
>>>> in a test case when streamCaching is enabled and json marshalling is
>>>> used.  Every expectation except the first one fails.
>>>>
>>>> Here’s my test class:
>>>>
>>>> @RunWith(CamelSpringBootRunner.class)
>>>>
>>>> @SpringBootTest(classes = MyApplication.class)
>>>>
>>>> public class MyTest extends CamelTestSupport {
>>>>
>>>>
>>>>
>>>>   @Test
>>>>
>>>>   public void test() throws Exception {
>>>>
>>>>     class Hello {
>>>>
>>>>       Hello(String value) {
>>>>
>>>>         this.value = value;
>>>>
>>>>       }
>>>>
>>>>
>>>>
>>>>       private String value;
>>>>
>>>>
>>>>
>>>>       public String getValue() {
>>>>
>>>>         return value;
>>>>
>>>>       }
>>>>
>>>>
>>>>
>>>>       public void setValue(String value) {
>>>>
>>>>         this.value = value;
>>>>
>>>>       }
>>>>
>>>>     }
>>>>
>>>>
>>>>
>>>>     MockEndpoint mock = getMockEndpoint("mock:dest");
>>>>
>>>>     mock.message(0).body().convertToString().contains("hello");
>>>>
>>>>     mock.message(0).body().convertToString().contains("world");
>>>>
>>>>     template.sendBody("direct:source", new Hello("hello world"));
>>>>
>>>>     mock.assertIsSatisfied();  }
>>>>
>>>>
>>>>
>>>>   @Override
>>>>
>>>>   protected RoutesBuilder createRouteBuilder() throws Exception {
>>>>
>>>>     return new RouteBuilder() {
>>>>
>>>>       @Override
>>>>
>>>>       public void configure() throws Exception {
>>>>
>>>>         from("direct:source")
>>>>
>>>>             .streamCaching()
>>>>
>>>>             .marshal().json(JsonLibrary.Jackson)
>>>>
>>>>             .to("mock:dest");
>>>>
>>>>       }
>>>>
>>>>     };
>>>>
>>>>   }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> This is the assertion error that I’m getting:
>>>>
>>>> java.lang.AssertionError: Assertion error at index 0 on mock
>>>> mock://dest with predicate: Simple: body contains world evaluated as:
>>>> contains world on Exchange[ID-A1504214-60132-1508506055845-1-2]
>>>>
>>>>
>>>>
>>>> Why is this happening?  How can I set multiple expectations on the
>>>> same message body in this case?
>>>>
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> Minhtri
>>>
>>>
>>>
>>> --
>>> Claus Ibsen
>>> -----------------
>>> http://davsclaus.com @davsclaus
>>> Camel in Action 2: https://www.manning.com/ibsen2
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> http://davsclaus.com @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2

Mime
View raw message