org.signserver.test.signserverws.v31.SignServerWSServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.signserver.test.signserverws.v31.SignServerWSServiceTest.java

Source

/*************************************************************************
 *                                                                       *
 *  SignServer: The OpenSource Automated Signing Server                  *
 *                                                                       *
 *  This software is free software; you can redistribute it and/or       *
 *  modify it under the terms of the GNU Lesser General Public           *
 *  License as published by the Free Software Foundation; either         *
 *  version 2.1 of the License, or any later version.                    *
 *                                                                       *
 *  See terms of license at gnu.org.                                     *
 *                                                                       *
 *************************************************************************/
package org.signserver.test.signserverws.v31;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.xml.namespace.QName;
import org.apache.log4j.Logger;
import org.bouncycastle.util.encoders.Base64;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
import org.signserver.common.GenericSignRequest;
import org.signserver.common.GenericSignResponse;
import org.signserver.common.RequestAndResponseManager;
import org.signserver.test.signserverws.signserverws.v31.CryptoTokenOfflineException_Exception;
import org.signserver.test.signserverws.signserverws.v31.IllegalRequestException_Exception;
import org.signserver.test.signserverws.signserverws.v31.InvalidWorkerIdException_Exception;
import org.signserver.test.signserverws.signserverws.v31.ProcessRequestWS;
import org.signserver.test.signserverws.signserverws.v31.ProcessResponseWS;
import org.signserver.test.signserverws.signserverws.v31.SignServerException_Exception;
import org.signserver.test.signserverws.signserverws.v31.SignServerWS;
import org.signserver.test.signserverws.signserverws.v31.SignServerWSService;
import org.signserver.test.signserverws.signserverws.v31.WorkerStatusWS;
import org.signserver.testutils.ModulesTestCase;

/**
 * Test calling SignServerWSService using SignServer 3.1 WSDL.
 *
 * This tests assumes that test-configuration.properties as been applied to
 * SignServer.
 *
 * @author Markus Kils
 * @version $Id: SignServerWSServiceTest.java 6122 2015-06-29 15:00:51Z netmackan $
 */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SignServerWSServiceTest extends ModulesTestCase {

    /** Logger for this class. */
    private static final Logger LOG = Logger.getLogger(SignServerWSServiceTest.class);

    /** Endpoint URL. */
    private final String ENDPOINT = "https://" + getHTTPHost() + ":" + getPublicHTTPSPort()
            + "/signserver/signserverws/signserverws?wsdl";

    private static final String[] CONF_FILES = { "signserver_deploy.properties",
            "conf/signserver_deploy.properties", };

    /** Worker ID as defined in test-configuration.properties. **/
    private static final String WORKERID = "7003";

    /** A worker ID assumed to not be existing. */
    private static final String NONEXISTING_WORKERID = "1231231";

    private SignServerWS ws;

    public SignServerWSServiceTest() {
        super();
        setupKeystores();
    }

    /** Setup keystores for SSL. **/
    private void setupKeystores() {
        Properties config = new Properties();

        final File home;
        final File path1 = new File("../..");
        final File path2 = new File(".");
        if (new File(path1, "res/deploytools/app.properties").exists()) {
            home = path1;
        } else if (new File(path2, "res/deploytools/app.properties").exists()) {
            home = path2;
        } else {
            throw new RuntimeException("Unable to detect SignServer path");
        }

        File confFile = null;
        for (String file : CONF_FILES) {
            final File f = new File(home, file);
            if (f.exists()) {
                confFile = f;
                break;
            }
        }
        if (confFile == null) {
            throw new RuntimeException("No signserver_deploy.properties found");
        } else {

            try {
                config.load(new FileInputStream(confFile));
            } catch (FileNotFoundException ignored) {
                LOG.debug("No signserver_deploy.properties");
            } catch (IOException ex) {
                LOG.error("Not using signserver_deploy.properties: " + ex.getMessage());
            }
            final String truststore = new File(home, "p12/truststore.jks").getAbsolutePath();
            System.out.println("Truststore: " + truststore);
            System.setProperty("javax.net.ssl.trustStore", truststore);
            System.setProperty("javax.net.ssl.trustStorePassword",
                    config.getProperty("java.trustpassword", "changeit"));
            //System.setProperty("javax.net.ssl.keyStore", "../../p12/testadmin.jks");
            //System.setProperty("javax.net.ssl.keyStorePassword", "foo123");
        }
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        LOG.info("Initilizing test using WS URL: " + getWsEndPointUrl());
        QName qname = new QName("gen.ws.protocol.signserver.org", "SignServerWSService");
        SignServerWSService signServerWSService = new SignServerWSService(new URL(getWsEndPointUrl()), qname);
        ws = signServerWSService.getSignServerWSPort();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    /** Overridden by org.signserver.test.signserverws.v32.SignServerWSServiceTest */
    protected String getWsEndPointUrl() {
        return ENDPOINT;
    }

    public void test00SetupDatabase() throws Exception {
        addDummySigner(7003, "SignServerWSServiceTest_XMLSigner1", true);
    }

    // TODO add test methods here. The name must begin with 'test'. For example:
    // public void testHello() {}

    public void test01GetStatusExisting() {
        try {
            final List<WorkerStatusWS> statuses = ws.getStatus(WORKERID);
            assertEquals("Number of results", 1, statuses.size());
            final WorkerStatusWS status = statuses.get(0);
            LOG.debug("Status: " + toString(status));

            assertEquals("workerName", "7003", status.getWorkerName());
            assertEquals("errormessage", null, status.getErrormessage());
            assertEquals("overallStatus", "ALLOK", status.getOverallStatus());
        } catch (InvalidWorkerIdException_Exception ex) {
            fail("Worker not found: " + WORKERID + " Hasn't test-configuration.properties been applied?");
        }
    }

    public void test02GetStatusNonExisting() {
        try {
            final List<WorkerStatusWS> statuses = ws.getStatus(NONEXISTING_WORKERID);
            fail("Should have thrown InvalidWorkerIdException_Exception but got " + statuses);
        } catch (InvalidWorkerIdException_Exception ok) {
            // OK
        }
    }

    public void test03ProcessOk() {
        try {
            final List<ProcessRequestWS> requests = new ArrayList<ProcessRequestWS>();
            final ProcessRequestWS request = new ProcessRequestWS();
            request.setRequestDataBase64(new String(Base64.encode(RequestAndResponseManager
                    .serializeProcessRequest(new GenericSignRequest(4711, "<root/>".getBytes())))));
            requests.add(request);
            final List<ProcessResponseWS> responses = ws.process(WORKERID, requests);
            assertEquals("Number of results", 1, responses.size());
            final GenericSignResponse response = (GenericSignResponse) RequestAndResponseManager
                    .parseProcessResponse(Base64.decode(responses.get(0).getResponseDataBase64()));
            LOG.trace("Response: " + new String(response.getProcessedData()));
            assertEquals("requestID", 4711, response.getRequestID());
            final Certificate certificate = response.getSignerCertificate();
            assertNotNull("Certificate", certificate);
        } catch (IOException ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (CryptoTokenOfflineException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (IllegalRequestException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (InvalidWorkerIdException_Exception ex) {
            fail("Worker not found: " + WORKERID + " Hasn't test-configuration.properties been applied?");
        } catch (SignServerException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        }
    }

    public void test04ProcessNonExisting() {
        try {
            final List<ProcessRequestWS> requests = new ArrayList<ProcessRequestWS>();
            final ProcessRequestWS request = new ProcessRequestWS();
            request.setRequestDataBase64(new String(Base64.encode(RequestAndResponseManager
                    .serializeProcessRequest(new GenericSignRequest(4711, "<root/>".getBytes())))));
            requests.add(request);
            ws.process(NONEXISTING_WORKERID, requests);
            fail("Should have thrown InvalidWorkerIdException_Exception");
        } catch (IOException ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (CryptoTokenOfflineException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (IllegalRequestException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (InvalidWorkerIdException_Exception ok) {
            // OK
        } catch (SignServerException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        }
    }

    public void test05ProcessIllegalRequest() {
        try {
            final List<ProcessRequestWS> requests = new ArrayList<ProcessRequestWS>();
            final ProcessRequestWS request = new ProcessRequestWS();
            request.setRequestDataBase64(new String(Base64.encode(RequestAndResponseManager.serializeProcessRequest(
                    new GenericSignRequest(4711, "< not-an-well-formed-xml-doc".getBytes())))));
            requests.add(request);
            final List<ProcessResponseWS> responses = ws.process(WORKERID, requests);
            fail("Should have thrown IllegalRequest or SignServerException but got: " + responses);
        } catch (IOException ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (CryptoTokenOfflineException_Exception ex) {
            LOG.error(ex, ex);
            fail(ex.getMessage());
        } catch (IllegalRequestException_Exception ex) {
            // OK
        } catch (InvalidWorkerIdException_Exception ex) {
            fail("Worker not found: " + WORKERID + " Hasn't test-configuration.properties been applied?");
        } catch (SignServerException_Exception ex) {
            // OK (sort of, better would have been an illegalrequest)
        }
    }

    public void test99RemoveDatabase() throws Exception {
        removeWorker(7003);
    }

    private String toString(WorkerStatusWS status) {
        final StringBuilder builder = new StringBuilder();
        builder.append("WorkerStatusWS {");
        builder.append("\n\t");

        builder.append("errormessage: ");
        builder.append(status.getErrormessage());
        builder.append("\n\t");

        builder.append("overallStatus: ");
        builder.append(status.getOverallStatus());
        builder.append("\n\t");

        builder.append("workerName: ");
        builder.append(status.getWorkerName());

        builder.append("\n");
        builder.append("}");
        return builder.toString();
    }

}