Author: cmueller Date: Mon Nov 5 12:54:49 2012 New Revision: 1405775 URL: http://svn.apache.org/viewvc?rev=1405775&view=rev Log: CAMEL-5718: Bodies of SMs with 8-bit data_coding are mangled Thanks to Francois Kritzinger for the patch
Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java (original) +++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java Mon Nov 5 12:54:49 2012 @@ -23,6 +23,7 @@ import java.util.List; import org.apache.camel.Exchange; import org.jsmpp.bean.AlertNotification; +import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.Command; import org.jsmpp.bean.DataSm; import org.jsmpp.bean.DeliverSm; @@ -104,8 +105,12 @@ public class SmppBinding { } else { smppMessage.setHeader(SmppConstants.MESSAGE_TYPE, SmppMessageType.DeliverSm.toString()); if (deliverSm.getShortMessage() != null) { - smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(), - configuration.getEncoding()))); + if (SmppUtils.parseAlphabetFromDataCoding(deliverSm.getDataCoding()) == Alphabet.ALPHA_8_BIT) { + smppMessage.setBody(new String(deliverSm.getShortMessage())); + } else { + smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(), + configuration.getEncoding()))); + } } else if (deliverSm.getOptionalParametes() != null && deliverSm.getOptionalParametes().length > 0) { List<OptionalParameter> oplist = Arrays.asList(deliverSm.getOptionalParametes()); Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java (original) +++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java Mon Nov 5 12:54:49 2012 @@ -21,6 +21,7 @@ import java.nio.charset.Charset; import org.apache.camel.impl.DefaultMessage; import org.jsmpp.bean.AlertNotification; +import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.Command; import org.jsmpp.bean.DataSm; import org.jsmpp.bean.DeliverSm; @@ -77,11 +78,13 @@ public class SmppMessage extends Default @Override protected Object createBody() { if (command instanceof MessageRequest) { - byte[] shortMessage = ((MessageRequest) command).getShortMessage(); + MessageRequest msgRequest = (MessageRequest)command; + byte[] shortMessage = msgRequest.getShortMessage(); if (shortMessage == null || shortMessage.length == 0) { return null; } - if (Charset.isSupported(configuration.getEncoding())) { + if (SmppUtils.parseAlphabetFromDataCoding(msgRequest.getDataCoding()) != Alphabet.ALPHA_8_BIT + && Charset.isSupported(configuration.getEncoding())) { try { return new String(shortMessage, configuration.getEncoding()); } catch (UnsupportedEncodingException e) { Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java (original) +++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java Mon Nov 5 12:54:49 2012 @@ -21,7 +21,6 @@ import java.util.Date; import org.apache.camel.Exchange; import org.apache.camel.Message; -import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.NumberingPlanIndicator; import org.jsmpp.bean.RegisteredDelivery; import org.jsmpp.bean.ReplaceSm; @@ -36,16 +35,7 @@ public class SmppReplaceSmCommand extend @Override public void execute(Exchange exchange) throws SmppException { - String body = exchange.getIn().getBody(String.class); - - byte providedAlphabet = getProvidedAlphabet(exchange); - Alphabet determinedAlphabet = determineAlphabet(exchange); - Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value()); - - byte[] message = null; - if (body != null) { - message = body.getBytes(charset); - } + byte[] message = getShortMessage(exchange.getIn()); ReplaceSm replaceSm = createReplaceSmTempate(exchange); replaceSm.setShortMessage(message); Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java (original) +++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java Mon Nov 5 12:54:49 2012 @@ -18,7 +18,6 @@ package org.apache.camel.component.smpp; import java.nio.charset.Charset; -import org.apache.camel.Exchange; import org.apache.camel.Message; import org.jsmpp.bean.Alphabet; import org.jsmpp.session.SMPPSession; @@ -32,18 +31,60 @@ public abstract class SmppSmCommand exte this.charset = Charset.forName(config.getEncoding()); } - protected byte getProvidedAlphabet(Exchange exchange) { - Message in = exchange.getIn(); + protected SmppSplitter createSplitter(Message message) { + Alphabet alphabet = determineAlphabet(message); + String body = message.getBody(String.class); + + SmppSplitter splitter; + switch (alphabet) { + case ALPHA_8_BIT: + splitter = new Smpp8BitSplitter(body.length()); + break; + case ALPHA_UCS2: + splitter = new SmppUcs2Splitter(body.length()); + break; + case ALPHA_DEFAULT: + default: + splitter = new SmppDefaultSplitter(body.length()); + break; + } + + return splitter; + } + + protected final byte[] getShortMessage(Message message) { + if (has8bitDataCoding(message)) { + return message.getBody(byte[].class); + } else { + byte providedAlphabet = getProvidedAlphabet(message); + Alphabet determinedAlphabet = determineAlphabet(message); + Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value()); + String body = message.getBody(String.class); + return body.getBytes(charset); + } + } + + private static boolean has8bitDataCoding(Message message) { + Byte dcs = message.getHeader(SmppConstants.DATA_CODING, Byte.class); + if (dcs != null) { + return SmppUtils.parseAlphabetFromDataCoding(dcs.byteValue()) == Alphabet.ALPHA_8_BIT; + } else { + Byte alphabet = message.getHeader(SmppConstants.ALPHABET, Byte.class); + return alphabet != null && alphabet.equals(Alphabet.ALPHA_8_BIT.value()); + } + } + + private byte getProvidedAlphabet(Message message) { byte alphabet = config.getAlphabet(); - if (in.getHeaders().containsKey(SmppConstants.ALPHABET)) { - alphabet = in.getHeader(SmppConstants.ALPHABET, Byte.class); + if (message.getHeaders().containsKey(SmppConstants.ALPHABET)) { + alphabet = message.getHeader(SmppConstants.ALPHABET, Byte.class); } return alphabet; } - protected Charset determineCharset(byte providedAlphabet, byte determinedAlphabet) { + private Charset determineCharset(byte providedAlphabet, byte determinedAlphabet) { if (providedAlphabet == SmppConstants.UNKNOWN_ALPHABET && determinedAlphabet == Alphabet.ALPHA_UCS2.value()) { return Charset.forName(SmppConstants.UCS2_ENCODING); // change charset to use multilang messages } @@ -51,14 +92,14 @@ public abstract class SmppSmCommand exte return charset; } - protected Alphabet determineAlphabet(Exchange exchange) { - String body = exchange.getIn().getBody(String.class); - byte alphabet = getProvidedAlphabet(exchange); + private Alphabet determineAlphabet(Message message) { + String body = message.getBody(String.class); + byte alphabet = getProvidedAlphabet(message); Alphabet alphabetObj; if (alphabet == SmppConstants.UNKNOWN_ALPHABET) { - byte[] message = body.getBytes(charset); - if (SmppUtils.isGsm0338Encodeable(message)) { + byte[] messageBytes = body.getBytes(charset); + if (SmppUtils.isGsm0338Encodeable(messageBytes)) { alphabetObj = Alphabet.ALPHA_DEFAULT; } else { alphabetObj = Alphabet.ALPHA_UCS2; @@ -69,27 +110,4 @@ public abstract class SmppSmCommand exte return alphabetObj; } - - protected SmppSplitter createSplitter(Exchange exchange) { - Alphabet alphabet = determineAlphabet(exchange); - - Message in = exchange.getIn(); - String body = in.getBody(String.class); - - SmppSplitter splitter; - switch (alphabet) { - case ALPHA_8_BIT: - splitter = new Smpp8BitSplitter(body.length()); - break; - case ALPHA_UCS2: - splitter = new SmppUcs2Splitter(body.length()); - break; - case ALPHA_DEFAULT: - default: - splitter = new SmppDefaultSplitter(body.length()); - break; - } - - return splitter; - } } \ No newline at end of file Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java (original) +++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java Mon Nov 5 12:54:49 2012 @@ -27,7 +27,6 @@ import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.jsmpp.bean.Address; -import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.DataCoding; import org.jsmpp.bean.ESMClass; import org.jsmpp.bean.GSMSpecificFeature; @@ -122,14 +121,8 @@ public class SmppSubmitMultiCommand exte } protected SubmitMulti[] createSubmitMulti(Exchange exchange) { - String body = exchange.getIn().getBody(String.class); - - byte providedAlphabet = getProvidedAlphabet(exchange); - Alphabet determinedAlphabet = determineAlphabet(exchange); - SmppSplitter splitter = createSplitter(exchange); - Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value()); - - byte[][] segments = splitter.split(body.getBytes(charset)); + SmppSplitter splitter = createSplitter(exchange.getIn()); + byte[][] segments = splitter.split(getShortMessage(exchange.getIn())); ESMClass esmClass; // multipart message Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java (original) +++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java Mon Nov 5 12:54:49 2012 @@ -23,7 +23,6 @@ import java.util.List; import org.apache.camel.Exchange; import org.apache.camel.Message; -import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.DataCoding; import org.jsmpp.bean.ESMClass; import org.jsmpp.bean.GSMSpecificFeature; @@ -91,15 +90,10 @@ public class SmppSubmitSmCommand extends } protected SubmitSm[] createSubmitSm(Exchange exchange) { - String body = exchange.getIn().getBody(String.class); + byte[] shortMessage = getShortMessage(exchange.getIn()); - byte providedAlphabet = getProvidedAlphabet(exchange); - Alphabet determinedAlphabet = determineAlphabet(exchange); - Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value()); - byte[] shortMessage = body.getBytes(charset); - SubmitSm template = createSubmitSmTemplate(exchange); - SmppSplitter splitter = createSplitter(exchange); + SmppSplitter splitter = createSplitter(exchange.getIn()); byte[][] segments = splitter.split(shortMessage); // multipart message Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java (original) +++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java Mon Nov 5 12:54:49 2012 @@ -16,7 +16,9 @@ */ package org.apache.camel.component.smpp; +import java.nio.charset.Charset; import java.util.Date; +import java.util.Set; import org.apache.camel.Exchange; import org.apache.camel.impl.DefaultCamelContext; @@ -33,6 +35,7 @@ import org.jsmpp.util.DeliveryReceiptSta import org.junit.Before; import org.junit.Test; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -202,6 +205,41 @@ public class SmppBindingTest { } @Test + public void createSmppMessageFrom8bitDataCodingDeliverSmShouldNotModifyBody() throws Exception { + final Set<String> encodings = Charset.availableCharsets().keySet(); + + final byte[] dataCodings = { + (byte)0x02, + (byte)0x04, + (byte)0xF6, + (byte)0xF4 + }; + + byte[] body = { + (byte)0xFF, 'A', 'B', (byte)0x00, + (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF + }; + + DeliverSm deliverSm = new DeliverSm(); + + for (byte dataCoding : dataCodings) { + deliverSm.setDataCoding(dataCoding); + deliverSm.setShortMessage(body); + + for (String encoding : encodings) { + binding.getConfiguration().setEncoding(encoding); + SmppMessage smppMessage = binding.createSmppMessage(deliverSm); + assertArrayEquals( + String.format("data coding=0x%02X; encoding=%s", + dataCoding, + encoding), + body, + smppMessage.getBody(String.class).getBytes()); + } + } + } + + @Test public void getterShouldReturnTheSetValues() { SmppConfiguration configuration = new SmppConfiguration(); binding.setConfiguration(configuration); Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java (original) +++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java Mon Nov 5 12:54:49 2012 @@ -16,11 +16,15 @@ */ package org.apache.camel.component.smpp; +import java.nio.charset.Charset; +import java.util.Set; + import org.jsmpp.bean.AlertNotification; import org.jsmpp.bean.DataSm; import org.jsmpp.bean.DeliverSm; import org.junit.Test; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -94,6 +98,40 @@ public class SmppMessageTest { assertNull(msg.getCommand()); assertTrue(msg.getHeaders().isEmpty()); } + + @Test + public void createBodyShouldNotMangle8bitDataCodingShortMessage() { + final Set<String> encodings = Charset.availableCharsets().keySet(); + + final byte[] dataCodings = { + (byte)0x02, + (byte)0x04, + (byte)0xF6, + (byte)0xF4 + }; + + byte[] body = { + (byte)0xFF, 'A', 'B', (byte)0x00, + (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF + }; + + DeliverSm command = new DeliverSm(); + SmppConfiguration config = new SmppConfiguration(); + + for (byte dataCoding : dataCodings) { + command.setDataCoding(dataCoding); + command.setShortMessage(body); + for (String encoding : encodings) { + config.setEncoding(encoding); + message = new SmppMessage(command, config); + assertArrayEquals( + String.format("data coding=0x%02X; encoding=%s", + dataCoding, + encoding), + body, ((String) message.createBody()).getBytes()); + } + } + } @Test public void createBodyShouldReturnNullIfTheCommandIsNull() { Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java (original) +++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java Mon Nov 5 12:54:49 2012 @@ -23,6 +23,7 @@ import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.impl.DefaultExchange; +import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.NumberingPlanIndicator; import org.jsmpp.bean.RegisteredDelivery; import org.jsmpp.bean.SMSCDeliveryReceipt; @@ -136,4 +137,172 @@ public class SmppReplaceSmCommandTest { assertEquals("1", exchange.getOut().getHeader(SmppConstants.ID)); } + + @Test + public void bodyWithSmscDefaultDataCodingNarrowedToCharset() throws Exception { + final int dataCoding = 0x00; /* SMSC-default */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + + session.replaceShortMessage((String) isNull(), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq((byte) 0), + aryEq(bodyNarrowed)); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithLatin1DataCodingNarrowedToCharset() throws Exception { + final int dataCoding = 0x03; /* ISO-8859-1 (Latin1) */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + + session.replaceShortMessage((String) isNull(), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq((byte) 0), + aryEq(bodyNarrowed)); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithSMPP8bitDataCodingNotModified() throws Exception { + final int dataCoding = 0x04; /* SMPP 8-bit */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + + session.replaceShortMessage((String) isNull(), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq((byte) 0), + aryEq(body)); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithGSM8bitDataCodingNotModified() throws Exception { + final int dataCoding = 0xF7; /* GSM 8-bit class 3 */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + + session.replaceShortMessage((String) isNull(), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq((byte) 0), + aryEq(body)); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void eightBitDataCodingOverridesDefaultAlphabet() throws Exception { + final int binDataCoding = 0xF7; /* GSM 8-bit class 3 */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm"); + exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_DEFAULT.value()); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, binDataCoding); + exchange.getIn().setBody(body); + + session.replaceShortMessage((String) isNull(), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq((byte) 0), + aryEq(body)); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void latin1DataCodingOverridesEightBitAlphabet() throws Exception { + final int latin1DataCoding = 0x03; /* ISO-8859-1 (Latin1) */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), + ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm"); + exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_8_BIT.value()); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, latin1DataCoding); + exchange.getIn().setBody(body); + + session.replaceShortMessage((String) isNull(), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq((byte) 0), + aryEq(bodyNarrowed)); + + replay(session); + + command.execute(exchange); + + verify(session); + } } \ No newline at end of file Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java (original) +++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java Mon Nov 5 12:54:49 2012 @@ -25,6 +25,7 @@ import org.apache.camel.ExchangePattern; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.impl.DefaultExchange; import org.jsmpp.bean.Address; +import org.jsmpp.bean.Alphabet; import org.jsmpp.bean.DataCoding; import org.jsmpp.bean.ESMClass; import org.jsmpp.bean.NumberingPlanIndicator; @@ -177,4 +178,249 @@ public class SmppSubmitMultiCommandTest assertEquals(1, exchange.getOut().getHeader(SmppConstants.SENT_MESSAGE_COUNT)); assertNull(exchange.getOut().getHeader(SmppConstants.ERROR)); } + + @Test + public void bodyWithSmscDefaultDataCodingNarrowedToCharset() throws Exception { + final int dataCoding = 0x00; /* SMSC-default */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + Address[] destAddrs = new Address[] { + new Address(TypeOfNumber.UNKNOWN, + NumberingPlanIndicator.UNKNOWN, + "1717") + }; + + expect(session.submitMultiple(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + aryEq(destAddrs), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(bodyNarrowed), + aryEq(new OptionalParameter[0]))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithLatin1DataCodingNarrowedToCharset() throws Exception { + final int dataCoding = 0x03; /* ISO-8859-1 (Latin1) */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + Address[] destAddrs = new Address[] { + new Address(TypeOfNumber.UNKNOWN, + NumberingPlanIndicator.UNKNOWN, + "1717") + }; + + expect(session.submitMultiple(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + aryEq(destAddrs), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(bodyNarrowed), + aryEq(new OptionalParameter[0]))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithSMPP8bitDataCodingNotModified() throws Exception { + final int dataCoding = 0x04; /* SMPP 8-bit */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + Address[] destAddrs = new Address[] { + new Address(TypeOfNumber.UNKNOWN, + NumberingPlanIndicator.UNKNOWN, + "1717") + }; + + expect(session.submitMultiple(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + aryEq(destAddrs), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(body), + aryEq(new OptionalParameter[0]))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithGSM8bitDataCodingNotModified() throws Exception { + final int dataCoding = 0xF7; /* GSM 8-bit class 3 */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + Address[] destAddrs = new Address[] { + new Address(TypeOfNumber.UNKNOWN, + NumberingPlanIndicator.UNKNOWN, + "1717") + }; + + expect(session.submitMultiple(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + aryEq(destAddrs), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(body), + aryEq(new OptionalParameter[0]))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void eightBitDataCodingOverridesDefaultAlphabet() throws Exception { + final int binDataCoding = 0x04; /* SMPP 8-bit */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_DEFAULT.value()); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, binDataCoding); + exchange.getIn().setBody(body); + Address[] destAddrs = new Address[] { + new Address(TypeOfNumber.UNKNOWN, + NumberingPlanIndicator.UNKNOWN, + "1717") + }; + + expect(session.submitMultiple(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + aryEq(destAddrs), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT), + eq(DataCoding.newInstance(binDataCoding)), + eq((byte) 0), + aryEq(body), + aryEq(new OptionalParameter[0]))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void latin1DataCodingOverridesEightBitAlphabet() throws Exception { + final int latin1DataCoding = 0x03; /* ISO-8859-1 (Latin1) */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_8_BIT.value()); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, latin1DataCoding); + exchange.getIn().setBody(body); + Address[] destAddrs = new Address[] { + new Address(TypeOfNumber.UNKNOWN, + NumberingPlanIndicator.UNKNOWN, + "1717") + }; + + expect(session.submitMultiple(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + aryEq(destAddrs), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT), + eq(DataCoding.newInstance(latin1DataCoding)), + eq((byte) 0), + aryEq(bodyNarrowed), + aryEq(new OptionalParameter[0]))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + } } \ No newline at end of file Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff ============================================================================== --- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java (original) +++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java Mon Nov 5 12:54:49 2012 @@ -225,4 +225,219 @@ public class SmppSubmitSmCommandTest { verify(session); } + + @Test + public void bodyWithSmscDefaultDataCodingNarrowedToCharset() throws Exception { + final int dataCoding = 0x00; /* SMSC-default */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + expect(session.submitShortMessage(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1717"), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT.value()), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(bodyNarrowed))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithLatin1DataCodingNarrowedToCharset() throws Exception { + final int dataCoding = 0x03; /* ISO-8859-1 (Latin1) */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + expect(session.submitShortMessage(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1717"), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT.value()), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(bodyNarrowed))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithSMPP8bitDataCodingNotModified() throws Exception { + final int dataCoding = 0x04; /* SMPP 8-bit */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + expect(session.submitShortMessage(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1717"), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT.value()), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(body))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void bodyWithGSM8bitDataCodingNotModified() throws Exception { + final int dataCoding = 0xF7; /* GSM 8-bit class 3 */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding); + exchange.getIn().setBody(body); + expect(session.submitShortMessage(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1717"), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT.value()), + eq(DataCoding.newInstance(dataCoding)), + eq((byte) 0), + aryEq(body))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void eightBitDataCodingOverridesDefaultAlphabet() throws Exception { + final int binDataCoding = 0x04; /* SMPP 8-bit */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_DEFAULT.value()); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, binDataCoding); + exchange.getIn().setBody(body); + expect(session.submitShortMessage(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1717"), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT.value()), + eq(DataCoding.newInstance(binDataCoding)), + eq((byte) 0), + aryEq(body))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + } + + @Test + public void latin1DataCodingOverridesEightBitAlphabet() throws Exception { + final int latin1DataCoding = 0x03; /* ISO-8859-1 (Latin1) */ + byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF}; + byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'}; + + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_8_BIT.value()); + exchange.getIn().setHeader(SmppConstants.DATA_CODING, latin1DataCoding); + exchange.getIn().setBody(body); + expect(session.submitShortMessage(eq("CMT"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1616"), + eq(TypeOfNumber.UNKNOWN), + eq(NumberingPlanIndicator.UNKNOWN), + eq("1717"), + eq(new ESMClass()), + eq((byte) 0), + eq((byte) 1), + (String) isNull(), + (String) isNull(), + eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)), + eq(ReplaceIfPresentFlag.DEFAULT.value()), + eq(DataCoding.newInstance(latin1DataCoding)), + eq((byte) 0), + aryEq(bodyNarrowed))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + } } \ No newline at end of file