/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.impl; import java.io.IOException; import java.net.ConnectException; import org.apache.camel.Exchange; import org.apache.camel.ExchangeTestSupport; import org.apache.camel.InvalidPayloadException; import org.apache.camel.Message; import org.apache.camel.RuntimeCamelException; import org.apache.camel.TypeConversionException; import org.apache.camel.util.ObjectHelper; /** * @version */ public class DefaultExchangeTest extends ExchangeTestSupport { public void testBody() throws Exception { assertNotNull(exchange.getIn().getBody()); assertEquals("<hello id='m123'>world!</hello>", exchange.getIn().getBody()); assertEquals("<hello id='m123'>world!</hello>", exchange.getIn().getBody(String.class)); assertEquals("<hello id='m123'>world!</hello>", exchange.getIn().getMandatoryBody()); assertEquals("<hello id='m123'>world!</hello>", exchange.getIn().getMandatoryBody(String.class)); } public void testMandatoryBody() throws Exception { assertNotNull(exchange.getIn().getBody()); assertEquals("<hello id='m123'>world!</hello>", exchange.getIn().getBody()); try { assertEquals(null, exchange.getIn().getBody(Integer.class)); fail("Should have thrown a TypeConversionException"); } catch (TypeConversionException e) { // expected } assertEquals("<hello id='m123'>world!</hello>", exchange.getIn().getMandatoryBody()); try { exchange.getIn().getMandatoryBody(Integer.class); fail("Should have thrown an InvalidPayloadException"); } catch (InvalidPayloadException e) { // expected } } public void testExceptionAsType() throws Exception { exchange.setException(ObjectHelper.wrapRuntimeCamelException(new ConnectException("Cannot connect to remote server"))); ConnectException ce = exchange.getException(ConnectException.class); assertNotNull(ce); assertEquals("Cannot connect to remote server", ce.getMessage()); IOException ie = exchange.getException(IOException.class); assertNotNull(ie); assertEquals("Cannot connect to remote server", ie.getMessage()); Exception e = exchange.getException(Exception.class); assertNotNull(e); assertEquals("Cannot connect to remote server", e.getMessage()); RuntimeCamelException rce = exchange.getException(RuntimeCamelException.class); assertNotNull(rce); assertNotSame("Cannot connect to remote server", rce.getMessage()); assertEquals("Cannot connect to remote server", rce.getCause().getMessage()); } public void testHeader() throws Exception { assertNotNull(exchange.getIn().getHeaders()); assertEquals(123, exchange.getIn().getHeader("bar")); assertEquals(new Integer(123), exchange.getIn().getHeader("bar", Integer.class)); assertEquals("123", exchange.getIn().getHeader("bar", String.class)); assertEquals(123, exchange.getIn().getHeader("bar", 234)); assertEquals(123, exchange.getIn().getHeader("bar", () -> 456)); assertEquals(456, exchange.getIn().getHeader("baz", () -> 456)); assertEquals(123, exchange.getIn().getHeader("bar", 234)); assertEquals(new Integer(123), exchange.getIn().getHeader("bar", 234, Integer.class)); assertEquals("123", exchange.getIn().getHeader("bar", "234", String.class)); assertEquals("123", exchange.getIn().getHeader("bar", () -> "456", String.class)); assertEquals("456", exchange.getIn().getHeader("baz", () -> "456", String.class)); assertEquals(234, exchange.getIn().getHeader("cheese", 234)); assertEquals("234", exchange.getIn().getHeader("cheese", 234, String.class)); assertEquals("456", exchange.getIn().getHeader("cheese", () -> 456, String.class)); } public void testProperty() throws Exception { exchange.removeProperty("foobar"); assertFalse(exchange.hasProperties()); exchange.setProperty("fruit", "apple"); assertTrue(exchange.hasProperties()); assertEquals("apple", exchange.getProperty("fruit")); assertEquals(null, exchange.getProperty("beer")); assertEquals(null, exchange.getProperty("beer", String.class)); // Current TypeConverter support to turn the null value to false of boolean, // as assertEquals needs the Object as the parameter, we have to use Boolean.FALSE value in this case assertEquals(Boolean.FALSE, exchange.getProperty("beer", boolean.class)); assertEquals(null, exchange.getProperty("beer", Boolean.class)); assertEquals("apple", exchange.getProperty("fruit", String.class)); assertEquals("apple", exchange.getProperty("fruit", "banana", String.class)); assertEquals("banana", exchange.getProperty("beer", "banana")); assertEquals("banana", exchange.getProperty("beer", "banana", String.class)); } public void testRemoveProperties() throws Exception { exchange.removeProperty("foobar"); assertFalse(exchange.hasProperties()); exchange.setProperty("fruit", "apple"); exchange.setProperty("fruit1", "banana"); exchange.setProperty("zone", "Africa"); assertTrue(exchange.hasProperties()); assertEquals("apple", exchange.getProperty("fruit")); assertEquals("banana", exchange.getProperty("fruit1")); assertEquals("Africa", exchange.getProperty("zone")); exchange.removeProperties("fr*"); assertTrue(exchange.hasProperties()); assertEquals(exchange.getProperties().size(), 1); assertEquals(null, exchange.getProperty("fruit", String.class)); assertEquals(null, exchange.getProperty("fruit1", String.class)); assertEquals("Africa", exchange.getProperty("zone", String.class)); } public void testRemovePropertiesWithExclusion() throws Exception { exchange.removeProperty("foobar"); assertFalse(exchange.hasProperties()); exchange.setProperty("fruit", "apple"); exchange.setProperty("fruit1", "banana"); exchange.setProperty("fruit2", "peach"); exchange.setProperty("zone", "Africa"); assertTrue(exchange.hasProperties()); assertEquals("apple", exchange.getProperty("fruit")); assertEquals("banana", exchange.getProperty("fruit1")); assertEquals("peach", exchange.getProperty("fruit2")); assertEquals("Africa", exchange.getProperty("zone")); exchange.removeProperties("fr*", "fruit1", "fruit2"); assertTrue(exchange.hasProperties()); assertEquals(exchange.getProperties().size(), 3); assertEquals(null, exchange.getProperty("fruit", String.class)); assertEquals("banana", exchange.getProperty("fruit1", String.class)); assertEquals("peach", exchange.getProperty("fruit2", String.class)); assertEquals("Africa", exchange.getProperty("zone", String.class)); } public void testRemovePropertiesPatternWithAllExcluded() throws Exception { exchange.removeProperty("foobar"); assertFalse(exchange.hasProperties()); exchange.setProperty("fruit", "apple"); exchange.setProperty("fruit1", "banana"); exchange.setProperty("fruit2", "peach"); exchange.setProperty("zone", "Africa"); assertTrue(exchange.hasProperties()); assertEquals("apple", exchange.getProperty("fruit")); assertEquals("banana", exchange.getProperty("fruit1")); assertEquals("peach", exchange.getProperty("fruit2")); assertEquals("Africa", exchange.getProperty("zone")); exchange.removeProperties("fr*", "fruit", "fruit1", "fruit2", "zone"); assertTrue(exchange.hasProperties()); assertEquals(exchange.getProperties().size(), 4); assertEquals("apple", exchange.getProperty("fruit", String.class)); assertEquals("banana", exchange.getProperty("fruit1", String.class)); assertEquals("peach", exchange.getProperty("fruit2", String.class)); assertEquals("Africa", exchange.getProperty("zone", String.class)); } public void testInType() throws Exception { exchange.setIn(new MyMessage()); MyMessage my = exchange.getIn(MyMessage.class); assertNotNull(my); } public void testOutType() throws Exception { exchange.setOut(new MyMessage()); MyMessage my = exchange.getOut(MyMessage.class); assertNotNull(my); } public void testCopy() { DefaultExchange sourceExchange = new DefaultExchange(context); MyMessage sourceIn = new MyMessage(); sourceExchange.setIn(sourceIn); Exchange destExchange = sourceExchange.copy(); Message destIn = destExchange.getIn(); assertEquals("Dest message should be of the same type as source message", sourceIn.getClass(), destIn.getClass()); } public void testFaultCopy() { testFaultCopy(false); } public void testFaultSafeCopy() { testFaultCopy(true); } private void testFaultCopy(boolean safe) { DefaultExchange sourceExchange = new DefaultExchange(context); MyMessage source = new MyMessage(); source.setFault(true); sourceExchange.setIn(source); sourceExchange.setOut(source); Exchange destExchange = sourceExchange.copy(safe); assertEquals("Fault property was not copied to IN message", sourceExchange.getIn().isFault(), destExchange.getIn().isFault()); assertEquals("Fault property was not copied to OUT message", sourceExchange.getOut().isFault(), destExchange.getOut().isFault()); } public static class MyMessage extends DefaultMessage { @Override public MyMessage newInstance() { return new MyMessage(); } } }