/*
* Copyright 2006-2010 the original author or authors.
*
* Licensed 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 com.consol.citrus.validation;
import com.consol.citrus.actions.ReceiveMessageAction;
import com.consol.citrus.context.TestContext;
import com.consol.citrus.endpoint.Endpoint;
import com.consol.citrus.endpoint.EndpointConfiguration;
import com.consol.citrus.exceptions.ValidationException;
import com.consol.citrus.message.DefaultMessage;
import com.consol.citrus.message.Message;
import com.consol.citrus.messaging.Consumer;
import com.consol.citrus.testng.AbstractTestNGUnitTest;
import com.consol.citrus.validation.builder.PayloadTemplateMessageBuilder;
import com.consol.citrus.validation.context.ValidationContext;
import com.consol.citrus.validation.xml.DomXmlMessageValidator;
import com.consol.citrus.validation.xml.XmlMessageValidationContext;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
import static org.easymock.EasyMock.*;
/**
* @author Christoph Deppisch
*/
public class DTDValidationTest extends AbstractTestNGUnitTest {
@Autowired
@Qualifier("defaultXmlMessageValidator")
private DomXmlMessageValidator validator;
private Endpoint endpoint = EasyMock.createMock(Endpoint.class);
private Consumer consumer = EasyMock.createMock(Consumer.class);
private EndpointConfiguration endpointConfiguration = EasyMock.createMock(EndpointConfiguration.class);
private ReceiveMessageAction receiveMessageBean;
@Override
@BeforeMethod
public void prepareTest() {
super.prepareTest();
receiveMessageBean = new ReceiveMessageAction();
receiveMessageBean.setEndpoint(endpoint);
receiveMessageBean.setValidator(validator);
}
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testInlineDTD() {
reset(endpoint, consumer, endpointConfiguration);
expect(endpoint.createConsumer()).andReturn(consumer).anyTimes();
expect(endpoint.getEndpointConfiguration()).andReturn(endpointConfiguration).anyTimes();
expect(endpointConfiguration.getTimeout()).andReturn(5000L).anyTimes();
Message message = new DefaultMessage("<!DOCTYPE root [ "
+ "<!ELEMENT root (message)>"
+ "<!ELEMENT message (text)>"
+ "<!ELEMENT text (#PCDATA)>"
+ " ]>"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
expect(consumer.receive(anyObject(TestContext.class), anyLong())).andReturn(message);
expect(endpoint.getActor()).andReturn(null).anyTimes();
replay(endpoint, consumer, endpointConfiguration);
PayloadTemplateMessageBuilder controlMessageBuilder = new PayloadTemplateMessageBuilder();
XmlMessageValidationContext validationContext = new XmlMessageValidationContext();
validationContext.setMessageBuilder(controlMessageBuilder);
controlMessageBuilder.setPayloadData("<!DOCTYPE root [ "
+ "<!ELEMENT root (message)>"
+ "<!ELEMENT message (text)>"
+ "<!ELEMENT text (#PCDATA)>"
+ " ]>"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
List<ValidationContext> validationContexts = new ArrayList<ValidationContext>();
validationContexts.add(validationContext);
receiveMessageBean.setValidationContexts(validationContexts);
receiveMessageBean.execute(context);
}
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testSystemId() {
reset(endpoint, consumer, endpointConfiguration);
expect(endpoint.createConsumer()).andReturn(consumer).anyTimes();
expect(endpoint.getEndpointConfiguration()).andReturn(endpointConfiguration).anyTimes();
expect(endpointConfiguration.getTimeout()).andReturn(5000L).anyTimes();
Message message = new DefaultMessage("<!DOCTYPE root SYSTEM \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
expect(consumer.receive(anyObject(TestContext.class), anyLong())).andReturn(message);
expect(endpoint.getActor()).andReturn(null).anyTimes();
replay(endpoint, consumer, endpointConfiguration);
PayloadTemplateMessageBuilder controlMessageBuilder = new PayloadTemplateMessageBuilder();
XmlMessageValidationContext validationContext = new XmlMessageValidationContext();
validationContext.setMessageBuilder(controlMessageBuilder);
controlMessageBuilder.setPayloadData("<!DOCTYPE root SYSTEM \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
List<ValidationContext> validationContexts = new ArrayList<ValidationContext>();
validationContexts.add(validationContext);
receiveMessageBean.setValidationContexts(validationContexts);
receiveMessageBean.execute(context);
}
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testPublicId() {
reset(endpoint, consumer, endpointConfiguration);
expect(endpoint.createConsumer()).andReturn(consumer).anyTimes();
expect(endpoint.getEndpointConfiguration()).andReturn(endpointConfiguration).anyTimes();
expect(endpointConfiguration.getTimeout()).andReturn(5000L).anyTimes();
Message message = new DefaultMessage("<!DOCTYPE root PUBLIC \"example\" \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
expect(consumer.receive(anyObject(TestContext.class), anyLong())).andReturn(message);
expect(endpoint.getActor()).andReturn(null).anyTimes();
replay(endpoint, consumer, endpointConfiguration);
PayloadTemplateMessageBuilder controlMessageBuilder = new PayloadTemplateMessageBuilder();
XmlMessageValidationContext validationContext = new XmlMessageValidationContext();
validationContext.setMessageBuilder(controlMessageBuilder);
controlMessageBuilder.setPayloadData("<!DOCTYPE root PUBLIC \"example\" \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
List<ValidationContext> validationContexts = new ArrayList<ValidationContext>();
validationContexts.add(validationContext);
receiveMessageBean.setValidationContexts(validationContexts);
receiveMessageBean.execute(context);
}
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testPublicIdError() {
reset(endpoint, consumer, endpointConfiguration);
expect(endpoint.createConsumer()).andReturn(consumer).anyTimes();
expect(endpoint.getEndpointConfiguration()).andReturn(endpointConfiguration).anyTimes();
expect(endpointConfiguration.getTimeout()).andReturn(5000L).anyTimes();
Message message = new DefaultMessage("<!DOCTYPE root PUBLIC \"example\" \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
expect(consumer.receive(anyObject(TestContext.class), anyLong())).andReturn(message);
expect(endpoint.getActor()).andReturn(null).anyTimes();
replay(endpoint, consumer, endpointConfiguration);
PayloadTemplateMessageBuilder controlMessageBuilder = new PayloadTemplateMessageBuilder();
XmlMessageValidationContext validationContext = new XmlMessageValidationContext();
validationContext.setMessageBuilder(controlMessageBuilder);
controlMessageBuilder.setPayloadData("<!DOCTYPE root PUBLIC \"foo\" \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
List<ValidationContext> validationContexts = new ArrayList<ValidationContext>();
validationContexts.add(validationContext);
receiveMessageBean.setValidationContexts(validationContexts);
try {
receiveMessageBean.execute(context);
Assert.fail("Missing validation exception due to mismatch in public id");
} catch (ValidationException e) {
Assert.assertTrue(e.getMessage().contains("expected 'foo' but was 'example'"));
}
}
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testSystemIdError() {
reset(endpoint, consumer, endpointConfiguration);
expect(endpoint.createConsumer()).andReturn(consumer).anyTimes();
expect(endpoint.getEndpointConfiguration()).andReturn(endpointConfiguration).anyTimes();
expect(endpointConfiguration.getTimeout()).andReturn(5000L).anyTimes();
Message message = new DefaultMessage("<!DOCTYPE root PUBLIC \"example\" \"com/consol/citrus/validation/example.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
expect(consumer.receive(anyObject(TestContext.class), anyLong())).andReturn(message);
expect(endpoint.getActor()).andReturn(null).anyTimes();
replay(endpoint, consumer, endpointConfiguration);
PayloadTemplateMessageBuilder controlMessageBuilder = new PayloadTemplateMessageBuilder();
XmlMessageValidationContext validationContext = new XmlMessageValidationContext();
validationContext.setMessageBuilder(controlMessageBuilder);
controlMessageBuilder.setPayloadData("<!DOCTYPE root PUBLIC \"example\" \"org/w3/xhtml/xhtml1-transitional.dtd\">"
+ "<root>"
+ "<message>"
+ "<text>Hello TestFramework!</text>"
+ "</message>"
+ "</root>");
List<ValidationContext> validationContexts = new ArrayList<ValidationContext>();
validationContexts.add(validationContext);
receiveMessageBean.setValidationContexts(validationContexts);
try {
receiveMessageBean.execute(context);
Assert.fail("Missing validation exception due to mismatch in public id");
} catch (ValidationException e) {
Assert.assertTrue(e.getMessage().contains("expected 'org/w3/xhtml/xhtml1-transitional.dtd' but was 'com/consol/citrus/validation/example.dtd'"));
}
}
}