org.eclipse.lyo.testsuite.server.oslcv1tests.ServiceDescriptionTests.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.lyo.testsuite.server.oslcv1tests.ServiceDescriptionTests.java

Source

/*******************************************************************************
 * Copyright (c) 2011 IBM Corporation.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. 
 *
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *
 *    Steve Speicher - initial API and implementation
 *******************************************************************************/
package org.eclipse.lyo.testsuite.server.oslcv1tests;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathException;

import org.apache.http.HttpResponse;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.util.EntityUtils;
import org.eclipse.lyo.testsuite.server.util.OSLCConstants;
import org.eclipse.lyo.testsuite.server.util.OSLCUtils;
import org.eclipse.lyo.testsuite.server.util.SetupProperties;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * This class provides JUnit tests for the validation of OSLC ServiceDescriptionDocuments,
 * currently focusing on the validation of the OSLC_CM definition of ServiceDescriptionDocument.
 */
@RunWith(Parameterized.class)
public class ServiceDescriptionTests {

    //Base URL of the OSLC Service Description Document to be tested
    private static String baseUrl;
    private static Credentials basicCreds;

    private String currentUrl;
    private HttpResponse response;
    private String responseBody;
    private Document doc;

    public ServiceDescriptionTests(String url) {
        this.currentUrl = url;
    }

    @Before
    public void setup() throws IOException, ParserConfigurationException, SAXException, XPathException {
        Properties setupProps = SetupProperties.setup(null);
        if (setupProps.getProperty("testBackwardsCompatability") != null
                && Boolean.parseBoolean(setupProps.getProperty("testBackwardsCompatability"))) {
            setupProps = SetupProperties.setup(setupProps.getProperty("version1Properties"));
        }
        baseUrl = setupProps.getProperty("baseUri");
        String userId = setupProps.getProperty("userId");
        String pw = setupProps.getProperty("pw");
        basicCreds = new UsernamePasswordCredentials(userId, pw);
        response = OSLCUtils.getResponseFromUrl(baseUrl, currentUrl, basicCreds, OSLCConstants.CT_DISC_DESC_XML);
        responseBody = EntityUtils.toString(response.getEntity());
        //Get XML Doc from response
        doc = OSLCUtils.createXMLDocFromResponseBody(responseBody);
    }

    @Parameters
    public static Collection<Object[]> getAllDescriptionUrls()
            throws IOException, ParserConfigurationException, SAXException, XPathException {
        //Checks the ServiceProviderCatalog at the specified baseUrl of the REST service in order to grab all urls
        //to other ServiceProvidersCatalogs contained within it, recursively, in order to find the URLs of all
        //service description documents of the REST service.
        Properties setupProps = SetupProperties.setup(null);
        Collection<Object[]> coll = getReferencedUrls(setupProps.getProperty("baseUri"));
        return coll;
    }

    public static Collection<Object[]> getReferencedUrls(String base)
            throws IOException, XPathException, ParserConfigurationException, SAXException {
        Properties setupProps = SetupProperties.setup(null);
        String userId = setupProps.getProperty("userId");
        String pw = setupProps.getProperty("pw");

        HttpResponse resp = OSLCUtils.getResponseFromUrl(base, base, new UsernamePasswordCredentials(userId, pw),
                OSLCConstants.CT_DISC_CAT_XML + ", " + OSLCConstants.CT_DISC_DESC_XML);

        //If our 'base' is a ServiceDescription we don't need to recurse as this is the only one we can find
        if (resp.getEntity().getContentType().getValue().contains(OSLCConstants.CT_DISC_DESC_XML)) {
            Collection<Object[]> data = new ArrayList<Object[]>();
            data.add(new Object[] { base });
            EntityUtils.consume(resp.getEntity());
            return data;
        }

        Document baseDoc = OSLCUtils.createXMLDocFromResponseBody(EntityUtils.toString(resp.getEntity()));

        //ArrayList to contain the urls from all SPCs
        Collection<Object[]> data = new ArrayList<Object[]>();

        //Get all the ServiceDescriptionDocuments from this ServiceProviderCatalog
        NodeList sDescs = (NodeList) OSLCUtils.getXPath().evaluate("//oslc_disc:services/@rdf:resource", baseDoc,
                XPathConstants.NODESET);
        for (int i = 0; i < sDescs.getLength(); i++) {
            String uri = sDescs.item(i).getNodeValue();
            uri = OSLCUtils.absoluteUrlFromRelative(base, uri);
            data.add(new Object[] { uri });
        }

        //Get all ServiceProviderCatalog urls from the base document in order to recursively add all the
        //description documents from them as well.
        NodeList spcs = (NodeList) OSLCUtils.getXPath().evaluate(
                "//oslc_disc:entry/oslc_disc:ServiceProviderCatalog/@rdf:about", baseDoc, XPathConstants.NODESET);
        for (int i = 0; i < spcs.getLength(); i++) {
            String uri = spcs.item(i).getNodeValue();
            uri = OSLCUtils.absoluteUrlFromRelative(base, uri);
            if (!uri.equals(base)) {
                Collection<Object[]> subCollection = getReferencedUrls(uri);
                Iterator<Object[]> iter = subCollection.iterator();
                while (iter.hasNext()) {
                    data.add(iter.next());
                }
            }
        }
        return data;
    }

    @Test
    public void baseUrlIsValid() {
        //Get the status, make sure 200 OK
        assertTrue(response.getStatusLine().toString(), response.getStatusLine().getStatusCode() == 200);

        //Verify we got a response
        assertNotNull(responseBody);
    }

    @Test
    public void invalidContentTypeGivesNotSupported() throws IOException {
        HttpResponse resp = OSLCUtils.getResponseFromUrl(baseUrl, currentUrl, basicCreds, "application/svg+xml");
        String respType = resp.getEntity().getContentType().getValue();
        EntityUtils.consume(resp.getEntity());
        assertTrue(resp.getStatusLine().getStatusCode() == 406 || respType.contains("application/svg+xml"));
    }

    @Test
    public void contentTypeIsCMServiceDescription() throws IOException {
        HttpResponse resp = OSLCUtils.getResponseFromUrl(baseUrl, currentUrl, basicCreds,
                OSLCConstants.CT_DISC_DESC_XML);
        //Make sure the response to this URL was of valid type
        EntityUtils.consume(resp.getEntity());
        assertTrue(resp.getEntity().getContentType().getValue().contains(OSLCConstants.CT_DISC_DESC_XML));
    }

    @Test
    public void misplacedParametersDoNotEffectResponse() throws IOException {
        HttpResponse baseResp = OSLCUtils.getResponseFromUrl(baseUrl, currentUrl, basicCreds,
                OSLCConstants.CT_DISC_DESC_XML);
        String baseRespValue = EntityUtils.toString(baseResp.getEntity());

        HttpResponse parameterResp = OSLCUtils.getResponseFromUrl(baseUrl, currentUrl + "?oslc_cm:query",
                basicCreds, OSLCConstants.CT_DISC_DESC_XML);
        String parameterRespValue = EntityUtils.toString(parameterResp.getEntity());

        assertTrue(baseRespValue.equals(parameterRespValue));
    }

    @Test
    public void serviceDescriptionHasTitle() throws XPathException {
        //Verify that the ServiceDescription has a dc:title child element
        Node title = (Node) OSLCUtils.getXPath().evaluate("/oslc_cm:ServiceDescriptor/dc:title", doc,
                XPathConstants.NODE);
        assertNotNull(title);
        assertFalse(title.getTextContent().isEmpty());

        //Verify that the dc:title child element has no children
        NodeList children = (NodeList) OSLCUtils.getXPath().evaluate("/oslc_cm:ServiceDescriptor/dc:title/*", doc,
                XPathConstants.NODESET);
        assertTrue(children.getLength() == 0);
    }

    @Test
    public void serviceDescriptionHasDescription() throws XPathException {
        //Verify the ServiceDescription has a dc:description child element      
        Node description = (Node) OSLCUtils.getXPath().evaluate("/oslc_cm:ServiceDescriptor/dc:description", doc,
                XPathConstants.NODE);
        assertNotNull(description);
    }

    @Test
    public void serviceDescriptionContributorHasIdentifier() throws XPathException {
        //If the ServiceDescription has a dc:contributor element, make sure it has a dc:identifier child element
        NodeList contrib = (NodeList) OSLCUtils.getXPath().evaluate("//dc:contributor", doc, XPathConstants.NODE);
        if (contrib != null) {
            Node identifier = (Node) OSLCUtils.getXPath().evaluate("//dc:contributor/dc:identifier", doc,
                    XPathConstants.NODE);
            assertNotNull(identifier);
        }
    }

    @Test
    public void changeManagementServiceDescriptionHasValidFactory() throws XPathException {
        //If ServiceDescription is oslc_cm, make sure it has a valid factory child element
        Node cmRequest = (Node) OSLCUtils.getXPath().evaluate("//oslc_cm:changeRequests", doc, XPathConstants.NODE);
        if (cmRequest != null) {
            Node fac = (Node) OSLCUtils.getXPath().evaluate("//oslc_cm:changeRequests/oslc_cm:factory", doc,
                    XPathConstants.NODE);
            assertNotNull(fac);
            Node facUrl = (Node) OSLCUtils.getXPath()
                    .evaluate("//oslc_cm:changeRequests/oslc_cm:factory/oslc_cm:url", doc, XPathConstants.NODE);
            assertNotNull(facUrl);
            Node facTitle = (Node) OSLCUtils.getXPath()
                    .evaluate("//oslc_cm:changeRequests/oslc_cm:factory/dc:title", doc, XPathConstants.NODE);
            assertNotNull(facTitle);
            assertFalse(facTitle.getTextContent().isEmpty());
        }
    }

    @Test
    public void changeManagementServiceDescriptionHasValidSimpleQuery() throws XPathException {
        //If ServiceDescription is oslc_cm, make sure it has a valid simple query child element
        Node cmRequest = (Node) OSLCUtils.getXPath().evaluate("//oslc_cm:changeRequests", doc, XPathConstants.NODE);
        if (cmRequest != null) {
            NodeList sQ = (NodeList) OSLCUtils.getXPath().evaluate("//oslc_cm:changeRequests/oslc_cm:simpleQuery",
                    doc, XPathConstants.NODESET);
            assertTrue(sQ.getLength() == 1);
            Node url = (Node) OSLCUtils.getXPath()
                    .evaluate("//oslc_cm:changeRequests/oslc_cm:simpleQuery/oslc_cm:url", doc, XPathConstants.NODE);
            assertNotNull(url);
            Node title = (Node) OSLCUtils.getXPath()
                    .evaluate("//oslc_cm:changeRequests/oslc_cm:simpleQuery/dc:title", doc, XPathConstants.NODE);
            assertNotNull(title);
            assertFalse(title.getTextContent().isEmpty());
        }
    }

    @Test
    public void changeManagementServiceDescriptionHasValidSelectionDialog() throws XPathException {
        //If ServiceDescription is oslc_cm, make sure it has a valid selection dialog child element
        Node cmRequest = (Node) OSLCUtils.getXPath().evaluate("//oslc_cm:changeRequests", doc, XPathConstants.NODE);
        if (cmRequest != null) {
            NodeList sD = (NodeList) OSLCUtils.getXPath()
                    .evaluate("//oslc_cm:changeRequests/oslc_cm:selectionDialog", doc, XPathConstants.NODESET);
            for (int i = 0; i < sD.getLength(); i++) {
                Node sQUrl = (Node) OSLCUtils.getXPath().evaluate(
                        "//oslc_cm:changeRequests/oslc_cm:selectionDialog[" + (i + 1) + "]/oslc_cm:url", doc,
                        XPathConstants.NODE);
                assertNotNull(sQUrl);
                Node sDtitle = (Node) OSLCUtils.getXPath().evaluate(
                        "//oslc_cm:changeRequests/oslc_cm:selectionDialog[" + (i + 1) + "]/dc:title", doc,
                        XPathConstants.NODE);
                assertNotNull(sDtitle);
                assertFalse(sDtitle.getTextContent().isEmpty());
            }
        }
    }

    @Test
    public void changeManagementServiceDescriptionHasValidCreationDialog() throws XPathException {
        //If ServiceDescription is oslc_cm, make sure it has a valid creation dialog child element
        Node cmRequest = (Node) OSLCUtils.getXPath().evaluate("//oslc_cm:changeRequests", doc, XPathConstants.NODE);
        if (cmRequest != null) {
            NodeList sD = (NodeList) OSLCUtils.getXPath()
                    .evaluate("//oslc_cm:changeRequests/oslc_cm:creationDialog", doc, XPathConstants.NODESET);
            for (int i = 0; i < sD.getLength(); i++) {
                Node sQUrl = (Node) OSLCUtils.getXPath().evaluate(
                        "//oslc_cm:changeRequests/oslc_cm:creationDialog[" + (i + 1) + "]/oslc_cm:url", doc,
                        XPathConstants.NODE);
                assertNotNull(sQUrl);
                Node sDtitle = (Node) OSLCUtils.getXPath().evaluate(
                        "//oslc_cm:changeRequests/oslc_cm:creationDialog[" + (i + 1) + "]/dc:title", doc,
                        XPathConstants.NODE);
                assertNotNull(sDtitle);
                assertFalse(sDtitle.getTextContent().isEmpty());
            }
        }
    }

    @Test
    public void validateUrlsInServiceDescription() throws IOException, XPathException {
        //Get all referenced oslc_cm:url elements in the Description Document
        NodeList urlElements = (NodeList) OSLCUtils.getXPath().evaluate("//oslc_cm:url", doc,
                XPathConstants.NODESET);
        for (int i = 0; i < urlElements.getLength(); i++) {
            Node urlElement = urlElements.item(i);
            String url = urlElement.getTextContent();

            //Perform HTTP GET request on the URL and verify it exists in some form
            HttpResponse urlResponse = OSLCUtils.getResponseFromUrl(baseUrl, url, basicCreds, "*/*");
            EntityUtils.consume(urlResponse.getEntity());
            assertFalse(urlResponse.getStatusLine().getStatusCode() == 404);
        }
    }

    @Test
    public void homeElementHasTitleAndUrlChildElements() throws XPathException {
        //Make sure each home element has a title and url
        NodeList hElements = (NodeList) OSLCUtils.getXPath().evaluate("//oslc_cm:home", doc,
                XPathConstants.NODESET);
        for (int i = 0; i < hElements.getLength(); i++) {
            Node hUrl = (Node) OSLCUtils.getXPath().evaluate("./oslc_cm:url", hElements.item(i),
                    XPathConstants.NODE);
            assertNotNull(hUrl);
            Node hTitle = (Node) OSLCUtils.getXPath().evaluate("./dc:title", hElements.item(i),
                    XPathConstants.NODE);
            assertNotNull(hTitle);
            assertFalse(hTitle.getTextContent().isEmpty());
        }
    }
}