blob: 19f31df6e8f277f83fe5b2992f642881cda7293d [file] [log] [blame]
/*
* 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.component.cm.test;
import java.math.BigInteger;
import java.security.SecureRandom;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.InvalidPayloadRuntimeException;
import org.apache.camel.Produce;
import org.apache.camel.ResolveEndpointFailedException;
import org.apache.camel.Service;
import org.apache.camel.component.cm.CMEndpoint;
import org.apache.camel.component.cm.CMProducer;
import org.apache.camel.component.cm.client.SMSMessage;
import org.apache.camel.component.cm.exceptions.HostUnavailableException;
import org.apache.camel.component.cm.exceptions.cmresponse.CMResponseException;
import org.apache.camel.component.cm.exceptions.cmresponse.InsufficientBalanceException;
import org.apache.camel.component.cm.exceptions.cmresponse.InvalidMSISDNException;
import org.apache.camel.component.cm.exceptions.cmresponse.InvalidProductTokenException;
import org.apache.camel.component.cm.exceptions.cmresponse.NoAccountFoundForProductTokenException;
import org.apache.camel.component.cm.exceptions.cmresponse.NoMessageException;
import org.apache.camel.component.cm.exceptions.cmresponse.NotPhoneNumberFoundException;
import org.apache.camel.component.cm.exceptions.cmresponse.UnknownErrorException;
import org.apache.camel.component.cm.exceptions.cmresponse.UnroutableMessageException;
import org.apache.camel.component.cm.test.mocks.cmsender.CMResponseExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.InsufficientBalanceExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.InvalidMSISDNExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.InvalidProductTokenExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.NoAccountFoundForProductTokenExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.NoMessageExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.NotPhoneNumberFoundExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.UnknownErrorExceptionSender;
import org.apache.camel.component.cm.test.mocks.cmsender.UnroutableMessageExceptionSender;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.spring.CamelSpringRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.util.Assert;
@RunWith(CamelSpringRunner.class)
@ContextConfiguration(classes = {CamelTestConfiguration.class })
public class CMTest extends AbstractJUnit4SpringContextTests {
// dependency: camel-spring-javaconfig
@Autowired
private CamelContext camelContext;
private SecureRandom random = new SecureRandom();
private final PhoneNumberUtil pnu = PhoneNumberUtil.getInstance();
private String validNumber;
@Produce("direct:sms")
private CMProxy cmProxy;
@EndpointInject("mock:test")
private MockEndpoint mock;
// private StopWatch stopWatch = new StopWatch(getClass().getSimpleName());
@Before
public void beforeTest() throws Exception {
mock.reset();
camelContext.getRouteController().startRoute(CamelTestConfiguration.SIMPLE_ROUTE_ID);
validNumber = pnu.format(pnu.getExampleNumber("ES"), PhoneNumberFormat.E164);
}
@After
public void afterTest() {
try {
camelContext.getRouteController().stopRoute(CamelTestConfiguration.SIMPLE_ROUTE_ID);
} catch (Exception e) {
logger.error("Exception trying to stop de routes", e);
}
// Stop all routes
// for (Route route : camelContext.getRoutes()) {
// try {
// camelContext.getRouteController().stopRoute(route.getId());
// } catch (Exception e) {
// logger.error("Exception trying to stop de routes", e);
// }
// }
}
/*
* 1. Invalid URI
*/
@Test(expected = ResolveEndpointFailedException.class)
public void testNotRequiredProductToken() throws Throwable {
try {
String schemedUri = "cm-sms://sgw01.cm.nl/gateway.ashx?defaultFrom=MyBusiness&defaultMaxNumberOfParts=8&testConnectionOnStartup=true";
camelContext.getEndpoint(schemedUri).start();
} catch (Throwable t) {
throw t.getCause();
}
}
@Test(expected = ResolveEndpointFailedException.class)
public void testNotRequiredDefaultFrom() throws Throwable {
try {
String schemedUri = "cm-sms://sgw01.cm.nl/gateway.ashx?defaultFrom=MyBusiness&defaultMaxNumberOfParts=8&testConnectionOnStartup=true";
camelContext.getEndpoint(schemedUri).start();
} catch (Throwable t) {
throw t.getCause();
}
}
@Test(expected = HostUnavailableException.class)
public void testHostUnavailableException() throws Throwable {
// cm-sms://sgw01.cm.nl/gateway.ashx?defaultFrom=MyBusiness&defaultMaxNumberOfParts=8&productToken=ea723fd7-da81-4826-89bc-fa7144e71c40&testConnectionOnStartup=true
String schemedUri = "cm-sms://dummy.sgw01.cm.nl/gateway.ashx?defaultFrom=MyBusiness&defaultMaxNumberOfParts=8&productToken=ea723fd7-da81-4826-89bc-fa7144e71c40&testConnectionOnStartup=true";
Service service = camelContext.getEndpoint(schemedUri).createProducer();
service.start();
}
@Test(expected = ResolveEndpointFailedException.class)
public void testInvalidHostDuplicateScheme() throws Throwable {
// cm-sms://sgw01.cm.nl/gateway.ashx?defaultFrom=MyBusiness&defaultMaxNumberOfParts=8&productToken=ea723fd7-da81-4826-89bc-fa7144e71c40&testConnectionOnStartup=true
try {
String schemedUri = "cm-sms://https://demo.com";
camelContext.getEndpoint(schemedUri);
} catch (Throwable t) {
throw t.getCause();
}
}
/*
* 2. Invalid Payload
*/
@Test(expected = RuntimeException.class)
public void testNullPayload() throws Throwable {
cmProxy.send(null);
}
// @DirtiesContext
@Test(expected = NoAccountFoundForProductTokenException.class)
public void testAsPartOfARoute() throws Exception {
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateUnicodeMessage(), validNumber, null);
cmProxy.send(smsMessage);
}
@Test(expected = NoAccountFoundForProductTokenException.class)
public void testNoAccountFoundForProductTokenException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new NoAccountFoundForProductTokenExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateGSM0338Message(), validNumber, null);
send(producer, smsMessage);
}
/*
* 3. CM Responses (Faking Exceptions)
*/
@Test(expected = CMResponseException.class)
public void testCMResponseException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new CMResponseExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateUnicodeMessage(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = InsufficientBalanceException.class)
public void testInsufficientBalanceException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new InsufficientBalanceExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateGSM0338Message(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = InvalidMSISDNException.class)
public void testInvalidMSISDNException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new InvalidMSISDNExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateUnicodeMessage(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = InvalidProductTokenException.class)
public void testInvalidProductTokenException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new InvalidProductTokenExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateUnicodeMessage(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = NoMessageException.class)
public void testNoMessageException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new NoMessageExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateGSM0338Message(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = NotPhoneNumberFoundException.class)
public void testNotPhoneNumberFoundException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new NotPhoneNumberFoundExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateUnicodeMessage(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = UnknownErrorException.class)
public void testUnknownErrorException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new UnknownErrorExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateGSM0338Message(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = UnroutableMessageException.class)
public void testUnroutableMessageException() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
CMProducer producer = endpoint.createProducer();
producer.setSender(new UnroutableMessageExceptionSender());
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateUnicodeMessage(), validNumber, null);
send(producer, smsMessage);
}
@Test(expected = UnsupportedOperationException.class)
public void testCMEndpointIsForProducing() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
endpoint.createConsumer(null);
}
@Test
public void testCMEndpointGetHost() throws Exception {
// Change sending strategy
CMEndpoint endpoint = (CMEndpoint) camelContext.getEndpoint(applicationContext.getBean(CamelTestConfiguration.class).getUri());
Assert.isTrue(endpoint.getHost().equals(applicationContext.getEnvironment().getRequiredProperty("cm.url")));
}
@Test(expected = InvalidPayloadRuntimeException.class)
public void testSendInvalidPayload() throws Exception {
// Body
final SMSMessage smsMessage = new SMSMessage(generateIdAsString(), generateGSM0338Message(), null, null);
cmProxy.send(smsMessage);
}
/*
* CMMessages
*/
// @Test(expected = RuntimeException.class)
// public void testSkel() throws Exception {
// mock.expectedMessageCount(1);
//
// // Body
// final SMSMessage smsMessage = new SMSMessage("Hello CM", validNumber);
// cmProxy.send(smsMessage);
//
// mock.assertIsSatisfied();
// }
private String generateUnicodeMessage() {
String ch = "\uF400";
return generateRandomLengthMessageByChar(ch);
}
private String generateGSM0338Message() {
String ch = "a";
return generateRandomLengthMessageByChar(ch);
}
private String generateRandomLengthMessageByChar(String ch) {
// random Length
int msgLength = (int) (Math.random() * 2000);
StringBuffer message = new StringBuffer();
for (int index = 0; index < msgLength; index++) {
message.append(ch);
}
return message.toString();
}
//
private String generateIdAsString() {
return new BigInteger(130, random).toString(32);
}
private static void send(CMProducer producer, SMSMessage smsMessage) throws Exception {
Exchange exchange = producer.getEndpoint().createExchange();
exchange.getIn().setBody(smsMessage);
producer.process(exchange);
}
}