You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Minhtri Tran <mt...@gmail.com> on 2017/11/10 18:12:00 UTC

Setting multiple expectations when streamCaching is on

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

Re: Setting multiple expectations when streamCaching is on

Posted by Gregor Zurowski <gr...@list.zurowski.org>.
Hi,

I just ran your code with Camel 2.20.0 and it works without issues,
but I can reproduce the problem with earlier releases such as 2.19.x
and 2.18.x.

Were there any particular changes in Camel 2.20.0 that would make
Minhtri's code work? Please note that the test code works in all
versions of Camel when stream caching is disabled in the route.

Thanks,
Gregor


On Fri, Nov 10, 2017 at 7:12 PM, Minhtri Tran <mt...@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

Re: Setting multiple expectations when streamCaching is on

Posted by Minhtri Tran <mt...@gmail.com>.
Thanks Gregor and Claus.  I will use version 2.20.

-Minhtri

On Wed, Nov 15, 2017 at 4:26 AM, Claus Ibsen <cl...@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 <cl...@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 <cl...@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 <mt...@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

Re: Setting multiple expectations when streamCaching is on

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

I logged a ticket
https://issues.apache.org/jira/browse/CAMEL-12010

On Wed, Nov 15, 2017 at 10:18 AM, Claus Ibsen <cl...@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 <cl...@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 <mt...@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

Re: Setting multiple expectations when streamCaching is on

Posted by Claus Ibsen <cl...@gmail.com>.
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 <cl...@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 <mt...@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

Re: Setting multiple expectations when streamCaching is on

Posted by Claus Ibsen <cl...@gmail.com>.
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 <mt...@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