package org.openstack.atlas.api.filters;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.core.io.ClassPathResource;
import javax.xml.validation.SchemaFactory;
import javax.xml.bind.JAXBException;
import javax.xml.validation.Schema;
import javax.xml.bind.JAXBContext;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.openstack.atlas.util.debug.Debug;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.openstack.atlas.api.filters.helpers.XmlValidationExceptionHandler;
import org.openstack.atlas.docs.loadbalancers.api.v1.AccessList;
import org.openstack.atlas.docs.loadbalancers.api.v1.HealthMonitor;
import org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer;
import org.openstack.atlas.docs.loadbalancers.api.v1.Metadata;
import org.openstack.atlas.docs.loadbalancers.api.v1.Nodes;
import org.openstack.atlas.docs.loadbalancers.api.v1.SslTermination;
import org.openstack.atlas.docs.loadbalancers.api.v1.VirtualIp;
import org.xml.sax.SAXException;
public class XmlValidationFilterTest {
private static final String FPKG = "org.openstack.atlas.docs.loadbalancers.api.v1.faults";
private static final String PPKG = "org.openstack.atlas.docs.loadbalancers.api.v1";
private static final String FXSD = "META-INF/xsd/LoadBalancerApiFaults.xsd";
private static final String PXSD = "META-INF/xsd/LoadBalancerApi.xsd";
XmlValidationExceptionHandler errHandler;
private JAXBContext pCtx;
private JAXBContext fCtx;
private Schema pSchema;
private Schema fSchema;
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() throws JAXBException, IOException, SAXException {
pCtx = JAXBContext.newInstance(PPKG);
fCtx = JAXBContext.newInstance(FPKG);
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
pSchema = sf.newSchema((new ClassPathResource(PXSD)).getURL());
fSchema = sf.newSchema((new ClassPathResource(FXSD)).getURL());
errHandler = new XmlValidationExceptionHandler();
}
@After
public void tearDown() {
}
@Test
public void shouldNotThrowExceptionOnValidLoadBalancer() {
String xml = ""
+ "<loadBalancer xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\"\n"
+ " name=\"a-new-loadbalancer\"\n"
+ " port=\"80\"\n"
+ " protocol=\"HTTP\">\n"
+ " <virtualIps>\n"
+ " <virtualIp type=\"PUBLIC\"/>\n"
+ " </virtualIps>\n"
+ " <nodes>\n"
+ " <node address=\"10.1.1.1\" port=\"80\" condition=\"ENABLED\"/>\n"
+ " </nodes>\n"
+ "</loadBalancer>\n"
+ "\n"
+ "";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof LoadBalancer);
}
@Test
public void shouldNotThrowExceptionOnValidNodes() {
String xml = ""
+ "<nodes xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\">\n"
+ " <node address=\"10.1.1.1\" port=\"80\" condition=\"ENABLED\" type=\"PRIMARY\"/>\n"
+ " <node address=\"10.2.2.1\" port=\"80\" condition=\"ENABLED\" type=\"SECONDARY\"/>\n"
+ " <node address=\"www.myrackspace.com\" port=\"88\" condition=\"ENABLED\" type=\"SECONDARY\" weight=\"10\"/>\n"
+ "</nodes>\n"
+ "\n"
+ "";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof Nodes);
}
@Test
public void shouldNotThrowExceptionOnValidIPs() {
String xml = "<virtualIp xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" type=\"PUBLIC\" ipVersion=\"IPV6\" />";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof VirtualIp);
}
public void shouldNotThrowExceptionOnValidMonitor() {
String xml = "<healthMonitor xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\""
+ "type=\"CONNECT\" delay=\"10\" timeout=\"10\" "
+ "attemptsBeforeDeactivation=\"3\" />";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof HealthMonitor);
}
@Test
public void shouldNotThrowExceptionOnAccessList() {
String xml = ""
+ "<accessList xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\">\n"
+ " <networkItem\n"
+ " id=\"1000\"\n"
+ " address=\"206.160.165.40\"\n"
+ " type=\"ALLOW\" />\n"
+ " <networkItem\n"
+ " id=\"1001\"\n"
+ " address=\"206.160.165.0/24\"\n"
+ " type=\"DENY\" />\n"
+ "</accessList>\n"
+ "\n"
+ "";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof AccessList);
}
@Test
public void shouldNotThrowExceptionOnValidSSLTerm() {
String xml = ""
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<sslTermination xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" \n"
+ "enabled=\"true\" securePort=\"500\" \n"
+ "secureTrafficOnly=\"false\">\n"
+ "<privatekey>-----BEGIN RSA PRIVATE KEY-----\n"
+ "MIIBOwIBAAJBAKOHSQtbpmrdkEvqv/mSYVoAk4vi6JY6AwwB0guCxvydD3MwYCtg\n"
+ "HlYBCUO0/ob/ClnVcI891oxEJVE3hzLS1SECAwEAAQJAOBMm+A8YdOK/HVlFNUZ9\n"
+ "vYgfEEPh78m6y75AEZRpuatwMHgopRUj1qMQzkge4puSBwn3NfLrO3eGJpnwoMsC\n"
+ "wQIhAOtzzhQYz59Qj67O3tFz7xnzRJ7TDdt7XMK/Yssj+7b5AiEAscykeuw8EzcT\n"
+ "kADt8rgbldTqK8M/pz5NMdu/wqUwUWkCIQDk/E5Km0qo/VePwd9Pwrmh+kYdVNNg\n"
+ "RpyTRkCVodw3OQIgadMSxvMaYplydFCJT+ES0iAy7K8+kK19RsKzpQeq9ZkCIQDg\n"
+ "E9MQ6R7zQhGNLOyGB2I0Jz0khu4NDzi5IPGyrrwtPw==\n"
+ "-----END RSA PRIVATE KEY-----</privatekey>\n"
+ "<certificate>-----BEGIN CERTIFICATE-----\n"
+ "MIICFTCCAb+gAwIBAgIBATANBgkqhkiG9w0BAQUFADB5MRgwFgYDVQQDEw93d3cu\n"
+ "bm93aGVyZS5vcmcxETAPBgNVBAsTCEpva2Uga2V5MRowGAYDVQQKExFUZXN0IEtl\n"
+ "eSg1MTIgYml0KTEUMBIGA1UEBxMLU2FuIEFudG9uaW8xCzAJBgNVBAgTAlRYMQsw\n"
+ "CQYDVQQGEwJVUzAeFw0xMzA5MjgwMjIwMTBaFw0xMzEwMDYwMjIwMTBaMHkxGDAW\n"
+ "BgNVBAMTD3d3dy5ub3doZXJlLm9yZzERMA8GA1UECxMISm9rZSBrZXkxGjAYBgNV\n"
+ "BAoTEVRlc3QgS2V5KDUxMiBiaXQpMRQwEgYDVQQHEwtTYW4gQW50b25pbzELMAkG\n"
+ "A1UECBMCVFgxCzAJBgNVBAYTAlVTMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOH\n"
+ "SQtbpmrdkEvqv/mSYVoAk4vi6JY6AwwB0guCxvydD3MwYCtgHlYBCUO0/ob/ClnV\n"
+ "cI891oxEJVE3hzLS1SECAwEAAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\n"
+ "FgQUKXRxYocmyGVc4aQBH37kYT7Yi9wwDQYJKoZIhvcNAQEFBQADQQCEbip462IS\n"
+ "cvoPmITr0cYs1Jh0AtoQX0to/22Mis4Q401eQDd9oi8QUWJ++Lr+CzOTsc7IZkJF\n"
+ "L4w3iAQnOXiW\n"
+ "-----END CERTIFICATE-----</certificate>\n"
+ "</sslTermination>\n"
+ "";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof SslTermination);
}
@Test
public void shouldNotThrowExceptionOnValidMetadata() {
String xml = ""
+ "<metadata xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\">\n"
+ " <meta key=\"color\">red</meta>\n"
+ " <meta key=\"label\">web-load-balancer</meta>\n"
+ "</metadata>\n"
+ "";
errHandler = new XmlValidationExceptionHandler();
Object obj = null;
try {
obj = xml2pojo(xml);
} catch (Exception ex) {
String excMsg = Debug.getExtendedStackTrace(ex);
fail(excMsg);
}
assertFalse(errHandler.getErrList().size() > 0);
assertTrue(obj instanceof Metadata);
}
private Object xml2pojo(String xml) throws JAXBException, UnsupportedEncodingException, IOException {
return XmlValidationFilter.xml2pojo(xml, pCtx, pSchema, errHandler);
}
}