be.fedict.eid.pkira.blm.model.contracthandler.services.XKMSServiceBeanTest.java Source code

Java tutorial

Introduction

Here is the source code for be.fedict.eid.pkira.blm.model.contracthandler.services.XKMSServiceBeanTest.java

Source

/*
 * eID PKI RA Project.
 * Copyright (C) 2010-2014 FedICT.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License version
 * 3.0 as published by the Free Software Foundation.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, see
 * http://www.gnu.org/licenses/.
 */

package be.fedict.eid.pkira.blm.model.contracthandler.services;

import java.math.BigInteger;
import java.security.Security;
import java.util.Date;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import be.fedict.eid.pkira.blm.errorhandling.ApplicationComponent;
import be.fedict.eid.pkira.blm.errorhandling.ErrorLogger;
import be.fedict.eid.pkira.blm.model.ca.CertificateAuthority;
import be.fedict.eid.pkira.blm.model.certificatedomain.CertificateDomain;
import be.fedict.eid.pkira.blm.model.config.ConfigurationEntry;
import be.fedict.eid.pkira.blm.model.config.ConfigurationEntryKey;
import be.fedict.eid.pkira.blm.model.config.ConfigurationEntryQuery;
import be.fedict.eid.pkira.blm.model.contracthandler.ContractHandlerBeanException;
import be.fedict.eid.pkira.blm.model.contracts.CertificateRevocationContract;
import be.fedict.eid.pkira.blm.model.contracts.CertificateSigningContract;
import be.fedict.eid.pkira.blm.model.contracts.CertificateType;
import be.fedict.eid.pkira.blm.model.framework.WebserviceLocator;
import be.fedict.eid.pkira.blm.model.reporting.ReportManager;
import be.fedict.eid.pkira.crypto.certificate.CertificateInfo;
import be.fedict.eid.pkira.crypto.certificate.CertificateParser;
import be.fedict.eid.pkira.crypto.csr.CSRInfo;
import be.fedict.eid.pkira.crypto.csr.CSRParser;
import be.fedict.eid.pkira.xkmsws.XKMSClient;
import be.fedict.eid.pkira.xkmsws.XKMSClientException;

import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;

public class XKMSServiceBeanTest {

    private static final Integer VALIDITY = 15;
    private static final String CSR = "CSR";
    private static final byte[] CSR_BYTES = new byte[1];
    private static final byte[] CERTIFICATE_BYTES = new byte[2];
    private static final String CERTIFICATE = "CERTIFICATE";
    private static final Date START_DATE = new Date();
    private static final Date END_DATE = new Date(System.currentTimeMillis() + 10000);
    private static final BigInteger SERIAL_NUMBER = BigInteger.TEN;

    private XKMSServiceBean service;

    @Mock
    private CSRParser csrParser;

    @Mock
    private CSRInfo csrInfo;

    @Mock
    private WebserviceLocator webserviceLocator;

    @Mock
    private XKMSClient xkmsClient;

    @Mock
    private CertificateParser certificateParser;

    @Mock
    private CertificateInfo certificateInfo;

    @Mock
    private ErrorLogger errorLogger;

    @Mock
    private ReportManager reportManager;

    @Mock
    private ConfigurationEntryQuery configurationEntryQuery;

    private final CertificateAuthority certificateAuthority = new CertificateAuthority();
    private final CertificateDomain certificateDomain = createCertificateDomain();

    @BeforeTest
    public void setup() throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        MockitoAnnotations.initMocks(this);

        service = new XKMSServiceBean();
        service.setCsrParser(csrParser);
        service.setWebserviceLocator(webserviceLocator);
        service.setCertificateParser(certificateParser);
        service.setErrorLogger(errorLogger);
        service.setReportManager(reportManager);
        service.setConfigurationEntryQuery(configurationEntryQuery);

        when(csrParser.parseCSR(CSR)).thenReturn(csrInfo);
        when(csrInfo.getDerEncoded()).thenReturn(CSR_BYTES);
        when(webserviceLocator.getXKMSClient(certificateAuthority)).thenReturn(xkmsClient);
        when(certificateParser.parseCertificate(CERTIFICATE_BYTES)).thenReturn(certificateInfo);
        when(certificateParser.parseCertificate(CERTIFICATE)).thenReturn(certificateInfo);
        when(certificateInfo.getPemEncoded()).thenReturn(CERTIFICATE);
        when(certificateInfo.getSerialNumber()).thenReturn(SERIAL_NUMBER);
    }

    @Test
    public void signTest() throws Exception {
        try {
            ConfigurationEntry value = new ConfigurationEntry();
            value.setKey(ConfigurationEntryKey.NOT_BEFORE_TIMESHIFT_SECOND);
            value.setValue("300");
            when(configurationEntryQuery.findByEntryKey(ConfigurationEntryKey.NOT_BEFORE_TIMESHIFT_SECOND))
                    .thenReturn(value);
            when(xkmsClient.createCertificate(CSR_BYTES, VALIDITY, "CODE", 300)).thenReturn(CERTIFICATE_BYTES);

            CertificateSigningContract contract = createCertificateSigningContract();
            String certificate = service.sign(contract, CSR);

            assertEquals(certificate, CERTIFICATE);
            verify(reportManager).addLineToReport(contract, true);
            verifyNoMoreInteractions(errorLogger);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    @Test(dependsOnMethods = "signTest")
    public void signTestError() throws Exception {
        XKMSClientException exception = new XKMSClientException("Oops");
        when(xkmsClient.createCertificate(CSR_BYTES, VALIDITY, "CODE", 300)).thenThrow(exception);

        CertificateSigningContract contract = createCertificateSigningContract();
        try {

            service.sign(contract, CSR);
            fail("Expected exception.");
        } catch (ContractHandlerBeanException e) {
            // Ok
        }

        verify(reportManager).addLineToReport(contract, false);
        verify(errorLogger).logError(eq(ApplicationComponent.XKMS), anyString(), eq(exception));
    }

    @Test
    public void revocationTest() throws Exception {
        CertificateRevocationContract contract = createCertificateRevocationContract();
        service.revoke(contract, CertificateType.CODE, CERTIFICATE);

        verify(xkmsClient).revokeCertificate(SERIAL_NUMBER, "CODE");
        verify(reportManager).addLineToReport(contract, true);
        verifyNoMoreInteractions(errorLogger);
    }

    @Test
    public void revocationTestError() throws Exception {
        XKMSClientException exception = new XKMSClientException("Oops");
        doThrow(exception).when(xkmsClient).revokeCertificate(SERIAL_NUMBER, "CODE");

        CertificateRevocationContract contract = createCertificateRevocationContract();
        try {
            service.revoke(contract, CertificateType.CODE, CERTIFICATE);
            fail("Expected exception.");
        } catch (ContractHandlerBeanException e) {
            // Ok
        }

        verify(reportManager).addLineToReport(contract, false);
        verify(errorLogger).logError(eq(ApplicationComponent.XKMS), anyString(), eq(exception));
    }

    private CertificateSigningContract createCertificateSigningContract() {
        CertificateSigningContract contract = new CertificateSigningContract();
        contract.setContractDocument(CSR);
        contract.setCertificateDomain(certificateDomain);
        contract.setValidityPeriodMonths(VALIDITY);
        contract.setCertificateType(CertificateType.CODE);
        return contract;
    }

    private CertificateRevocationContract createCertificateRevocationContract() {
        CertificateRevocationContract contract = new CertificateRevocationContract();
        contract.setContractDocument(CERTIFICATE);
        contract.setCertificateDomain(certificateDomain);
        contract.setStartDate(START_DATE);
        contract.setEndDate(END_DATE);
        return contract;
    }

    private CertificateDomain createCertificateDomain() {
        CertificateDomain certificateDomain = new CertificateDomain();
        certificateDomain.setCertificateAuthority(certificateAuthority);
        return certificateDomain;
    }
}