org.overlord.rtgov.tests.platforms.jbossas.activityserver.JBossASActivityServerServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.overlord.rtgov.tests.platforms.jbossas.activityserver.JBossASActivityServerServiceTest.java

Source

/*
 * 2012-3 Red Hat Inc. and/or its affiliates and other contributors.
 *
 * 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 org.overlord.rtgov.tests.platforms.jbossas.activityserver;

import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPMessage;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OperateOnDeployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.overlord.rtgov.activity.model.ActivityType;
import org.overlord.rtgov.activity.model.soa.RequestReceived;
import org.overlord.rtgov.activity.model.soa.ResponseSent;
import org.overlord.rtgov.activity.util.ActivityUtil;

import static org.junit.Assert.*;

@RunWith(Arquillian.class)
public class JBossASActivityServerServiceTest {

    private static final String ORDER_SERVICE_URL = "http://127.0.0.1:8080/demo-orders/OrderService";

    @Deployment(name = "orders-app", order = 1)
    public static JavaArchive createDeployment1() {
        String version = System.getProperty("rtgov.version");

        java.io.File archiveFile = Maven.resolver()
                .resolve("org.overlord.rtgov.samples.jbossas.ordermgmt:samples-jbossas-ordermgmt-app:" + version)
                .withoutTransitivity().asSingleFile();

        return ShrinkWrap.createFromZipFile(JavaArchive.class, archiveFile);
    }

    @Deployment(name = "orders-ip", order = 2)
    public static WebArchive createDeployment2() {
        String version = System.getProperty("rtgov.version");

        java.io.File archiveFile = Maven.resolver()
                .resolve("org.overlord.rtgov.samples.jbossas.ordermgmt:samples-jbossas-ordermgmt-ip:war:" + version)
                .withoutTransitivity().asSingleFile();

        return ShrinkWrap.createFromZipFile(WebArchive.class, archiveFile);
    }

    @Test
    @OperateOnDeployment("orders-app")
    public void testQueryActivityServer() {

        try {
            SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
            SOAPConnection con = factory.createConnection();

            java.net.URL url = new java.net.URL(ORDER_SERVICE_URL);

            String mesg = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                    + "   <soap:Body>"
                    + "       <orders:submitOrder xmlns:orders=\"urn:switchyard-quickstart-demo:orders:1.0\">"
                    + "            <order>" + "                <orderId>1</orderId>"
                    + "                <itemId>BUTTER</itemId>" + "                <quantity>100</quantity>"
                    + "                <customer>Fred</customer>" + "            </order>"
                    + "        </orders:submitOrder>" + "    </soap:Body>" + "</soap:Envelope>";

            long startTime = System.currentTimeMillis();

            java.io.InputStream is = new java.io.ByteArrayInputStream(mesg.getBytes());

            SOAPMessage request = MessageFactory.newInstance().createMessage(null, is);

            is.close();

            SOAPMessage response = con.call(request, url);

            java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

            response.writeTo(baos);

            baos.close();

            // Wait for events to propagate
            Thread.sleep(4000);

            java.util.List<ActivityType> acts = getActivityEvents(startTime, System.currentTimeMillis());

            if (acts == null) {
                fail("Activity event list is null");
            }

            System.out.println("LIST SIZE=" + acts.size());

            System.out.println("LIST=" + acts);

            if (acts.size() != 12) {
                fail("Expecting 12 activity events: " + acts.size());
            }

            // RTGOV-256 Check that first activity type has header value extracted as a property
            ActivityType at = acts.get(0);

            if (!at.getProperties().containsKey("contentType")) {
                fail("Property 'contentType' not found");
            }

            if (!at.getProperties().get("contentType")
                    .equals("{urn:switchyard-quickstart-demo:orders:1.0}submitOrder")) {
                fail("Incorrect content type, expecting '{urn:switchyard-quickstart-demo:orders:1.0}submitOrder' but got: "
                        + at.getProperties().get("contentType"));
            }

            if (!at.getProperties().containsKey("gateway")) {
                fail("Property 'gateway' not found");
            }

            if (!at.getProperties().get("gateway").equals("soap")) {
                fail("Incorrect gateway, expecting 'soap' but got: " + at.getProperties().get("gateway"));
            }

        } catch (Exception e) {
            e.printStackTrace();
            fail("Failed to invoke service: " + e);
        }
    }

    @Test
    @OperateOnDeployment("orders-app")
    public void testQueryActivityServerNoContextOrTimeframe() {

        try {
            getActivityEvents(0, 0);

            fail("Should have thrown exception due to no context or time frame");

        } catch (java.io.IOException ioe) {
            // Expected
        } catch (Exception e) {
            e.printStackTrace();
            fail("Failed to invoke service: " + e);
        }
    }

    @Test
    @OperateOnDeployment("orders-app")
    public void testQueryActivityServerFaultResponse() {

        try {
            SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
            SOAPConnection con = factory.createConnection();

            long startTime = System.currentTimeMillis();

            java.net.URL url = new java.net.URL(ORDER_SERVICE_URL);

            String mesg = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                    + "   <soap:Body>"
                    + "       <orders:submitOrder xmlns:orders=\"urn:switchyard-quickstart-demo:orders:1.0\">"
                    + "            <order>" + "                <orderId>1</orderId>"
                    + "                <itemId>Laptop</itemId>" + "                <quantity>100</quantity>"
                    + "                <customer>Fred</customer>" + "            </order>"
                    + "        </orders:submitOrder>" + "    </soap:Body>" + "</soap:Envelope>";

            java.io.InputStream is = new java.io.ByteArrayInputStream(mesg.getBytes());

            SOAPMessage request = MessageFactory.newInstance().createMessage(null, is);

            is.close();

            SOAPMessage response = con.call(request, url);

            java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

            response.writeTo(baos);

            baos.close();

            // Wait for events to propagate
            Thread.sleep(4000);

            java.util.List<ActivityType> acts = getActivityEvents(startTime, System.currentTimeMillis());

            if (acts == null) {
                fail("Activity event list is null");
            }

            System.out.println("LIST SIZE=" + acts.size());

            System.out.println("LIST=" + acts);

            if (acts.size() != 7) {
                fail("Expecting 7 activity events: " + acts.size());
            }

            ActivityType at1 = acts.get(4);

            if ((at1 instanceof ResponseSent) == false) {
                fail("Expecting a 'response sent' event");
            }

            ResponseSent resp = (ResponseSent) at1;

            if (resp.getMessageType() == null) {
                fail("Message type should not be null");
            }

            if (resp.getFault() == null) {
                fail("Fault should not be null");
            }

            if (!resp.getFault().equals("ItemNotFound")) {
                fail("Fault should be 'ItemNotFound': " + resp.getFault());
            }
        } catch (Exception e) {
            e.printStackTrace();
            fail("Failed to invoke service: " + e);
        }
    }

    @Test
    @OperateOnDeployment("orders-app")
    public void testQueryActivityServerInvalidRequestStructure() {

        try {
            SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
            SOAPConnection con = factory.createConnection();

            long startTime = System.currentTimeMillis();

            java.net.URL url = new java.net.URL(ORDER_SERVICE_URL);

            String mesg = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                    + "   <soap:Body>"
                    + "       <orders:submitOrder xmlns:orders=\"urn:switchyard-quickstart-demo:orders:1.0\">"
                    + "            <order>" + "                <orderId>1</orderId>"
                    + "                <itemId>BUTTER</itemId>" + "                <quantity>100</quantity>"
                    + "                <customerx>Fred</customerx>" + "            </order>"
                    + "        </orders:submitOrder>" + "    </soap:Body>" + "</soap:Envelope>";

            java.io.InputStream is = new java.io.ByteArrayInputStream(mesg.getBytes());

            SOAPMessage request = MessageFactory.newInstance().createMessage(null, is);

            is.close();

            SOAPMessage response = con.call(request, url);

            java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

            response.writeTo(baos);

            baos.close();

            // Wait for events to propagate
            Thread.sleep(4000);

            java.util.List<ActivityType> acts = getActivityEvents(startTime, System.currentTimeMillis());

            if (acts == null) {
                fail("Activity event list is null");
            }

            System.out.println("LIST SIZE=" + acts.size());

            System.out.println("LIST=" + acts);

            if (acts.size() != 2) {
                fail("Expecting 2 activity events: " + acts.size());
            }

            // RTGOV-262 Check response has replyTo id
            ActivityType at1 = acts.get(0);
            ActivityType at2 = acts.get(1);

            if ((at1 instanceof RequestReceived) == false) {
                fail("Expecting a 'request received' event");
            }

            if ((at2 instanceof ResponseSent) == false) {
                fail("Expecting a 'response sent' event");
            }

            RequestReceived req = (RequestReceived) at1;
            ResponseSent resp = (ResponseSent) at2;

            if (resp.getReplyToId() == null) {
                fail("Response 'replyTo' id not set");
            }

            if (!req.getMessageId().equals(resp.getReplyToId())) {
                fail("Response 'replyTo' id not same as request message id");
            }

            if (resp.getMessageType() != null) {
                fail("Message type of fault response, for validation error, should be null: "
                        + resp.getMessageType());
            }

            if (resp.getFault() == null) {
                fail("Fault for invalid response should not be null");
            }

            if (!resp.getFault().equals("ERROR")) {
                fail("Fault for invalid response should be 'ERROR': " + resp.getFault());
            }

            if (resp.getContent() == null) {
                fail("Fault response should have message content representing a description of the fault");
            }
        } catch (Exception e) {
            e.printStackTrace();
            fail("Failed to invoke service: " + e);
        }
    }

    public static java.util.List<ActivityType> getActivityEvents(long from, long to) throws Exception {

        java.net.CookieManager cm = new java.net.CookieManager();
        java.net.CookieHandler.setDefault(cm);

        URL eventsUrl = new URL("http://localhost:8080/overlord-rtgov/activity/events?from=" + from + "&to=" + to);

        HttpURLConnection connection = (HttpURLConnection) eventsUrl.openConnection();
        connection.setRequestMethod("GET");

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-Type", "application/json");

        initAuth(connection);

        java.io.InputStream is = connection.getInputStream();

        java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

        while (is.available() > 0) {
            byte[] b = new byte[is.available()];
            is.read(b);
            baos.write(b);
        }

        is.close();
        baos.close();

        byte[] b = baos.toByteArray();

        System.out.println("THE JSON=" + new String(b));

        return (ActivityUtil.deserializeActivityTypeList(b));
    }

    protected static void initAuth(HttpURLConnection connection) {
        String userPassword = "admin:admin";
        String encoding = org.apache.commons.codec.binary.Base64.encodeBase64String(userPassword.getBytes());

        StringBuffer buf = new StringBuffer(encoding);

        for (int i = 0; i < buf.length(); i++) {
            if (Character.isWhitespace(buf.charAt(i))) {
                buf.deleteCharAt(i);
                i--;
            }
        }

        connection.setRequestProperty("Authorization", "Basic " + buf.toString());
    }
}