test.unit.be.fedict.eid.applet.shared.UnmarshallerTest.java Source code

Java tutorial

Introduction

Here is the source code for test.unit.be.fedict.eid.applet.shared.UnmarshallerTest.java

Source

/*
 * eID Applet Project.
 * Copyright (C) 2008-2009 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 test.unit.be.fedict.eid.applet.shared;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.LinkedList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.easymock.EasyMock;
import org.junit.Test;

import be.fedict.eid.applet.shared.AbstractProtocolMessage;
import be.fedict.eid.applet.shared.AppletProtocolMessageCatalog;
import be.fedict.eid.applet.shared.ClientEnvironmentMessage;
import be.fedict.eid.applet.shared.ErrorCode;
import be.fedict.eid.applet.shared.FinishedMessage;
import be.fedict.eid.applet.shared.IdentificationRequestMessage;
import be.fedict.eid.applet.shared.IdentityDataMessage;
import be.fedict.eid.applet.shared.annotation.HttpHeader;
import be.fedict.eid.applet.shared.annotation.MessageDiscriminator;
import be.fedict.eid.applet.shared.annotation.PostConstruct;
import be.fedict.eid.applet.shared.protocol.HttpReceiver;
import be.fedict.eid.applet.shared.protocol.ProtocolMessageCatalog;
import be.fedict.eid.applet.shared.protocol.Unmarshaller;

public class UnmarshallerTest {

    private static final Log LOG = LogFactory.getLog(UnmarshallerTest.class);

    @Test
    public void receiveIdentityDataMessageWithoutRequiredHeaders() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type"))
                .andStubReturn("IdentityDataMessage");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(new LinkedList<String>());
        EasyMock.expect(mockHttpReceiver.getBody()).andStubReturn("hello world".getBytes());

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        try {
            unmarshaller.receive(mockHttpReceiver);
            fail();
        } catch (RuntimeException e) {
            // expected input validation error
            // verify
            LOG.debug("expected exception: " + e.getMessage());
            EasyMock.verify(mockHttpReceiver);
        }
    }

    @Test
    public void receiveNoHeadersAtAll() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn(null);

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        try {
            unmarshaller.receive(mockHttpReceiver);
            fail();
        } catch (RuntimeException e) {
            // expected input validation error
            // verify
            LOG.debug("expected exception: " + e.getMessage());
            EasyMock.verify(mockHttpReceiver);
            assertFalse("null".equals(e.getMessage()));
        }
    }

    @Test
    public void receiveIdentityDataMessage() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("foo-bar");
        testHeaderNames.add("X-AppletProtocol-Version");
        testHeaderNames.add("X-AppletProtocol-Type");
        testHeaderNames.add("X-AppletProtocol-IdentityFileSize");
        testHeaderNames.add("X-AppletProtocol-AddressFileSize");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type"))
                .andStubReturn("IdentityDataMessage");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-IdentityFileSize")).andStubReturn("10");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-AddressFileSize")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getBody()).andStubReturn("hello world".getBytes());

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        Object result = unmarshaller.receive(mockHttpReceiver);

        // verify
        EasyMock.verify(mockHttpReceiver);

        assertNotNull(result);
        assertTrue(result instanceof IdentityDataMessage);
        IdentityDataMessage identityDataMessageResult = (IdentityDataMessage) result;
        assertNotNull(identityDataMessageResult.body);
        assertArrayEquals("hello world".getBytes(), identityDataMessageResult.body);
        assertEquals((Integer) 10, identityDataMessageResult.identityFileSize);
        assertEquals((Integer) 1, identityDataMessageResult.addressFileSize);
        assertArrayEquals("hello worl".getBytes(), identityDataMessageResult.idFile);
        assertArrayEquals("d".getBytes(), identityDataMessageResult.addressFile);
    }

    @Test
    public void receiveIdentificationRequestMessage() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("foo-bar");
        testHeaderNames.add("X-AppletProtocol-Version");
        testHeaderNames.add("X-AppletProtocol-Type");
        testHeaderNames.add("X-AppletProtocol-IncludePhoto");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type"))
                .andStubReturn("IdentificationRequestMessage");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-IncludePhoto")).andStubReturn("true");

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        Object result = unmarshaller.receive(mockHttpReceiver);

        // verify
        EasyMock.verify(mockHttpReceiver);

        assertNotNull(result);
        assertTrue(result instanceof IdentificationRequestMessage);
        IdentificationRequestMessage message = (IdentificationRequestMessage) result;
        assertTrue(message.includePhoto);
    }

    @Test
    public void receiveFinishedMessage() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("X-AppletProtocol-Version");
        testHeaderNames.add("X-AppletProtocol-Type");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type")).andStubReturn("FinishedMessage");

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        Object result = unmarshaller.receive(mockHttpReceiver);

        // verify
        EasyMock.verify(mockHttpReceiver);

        assertNotNull(result);
        assertTrue(result instanceof FinishedMessage);
        FinishedMessage message = (FinishedMessage) result;
        assertNull(message.errorCode);
    }

    @Test
    public void receiveFinishedMessageWithErrorCode() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("X-AppletProtocol-Version");
        testHeaderNames.add("X-AppletProtocol-Type");
        testHeaderNames.add("X-AppletProtocol-ErrorCode");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type")).andStubReturn("FinishedMessage");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-ErrorCode"))
                .andStubReturn(ErrorCode.CERTIFICATE_EXPIRED.name());

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        Object result = unmarshaller.receive(mockHttpReceiver);

        // verify
        EasyMock.verify(mockHttpReceiver);

        assertNotNull(result);
        assertTrue(result instanceof FinishedMessage);
        FinishedMessage message = (FinishedMessage) result;
        assertEquals(ErrorCode.CERTIFICATE_EXPIRED, message.errorCode);
    }

    public static final class MyRuntimeException extends RuntimeException {

        private static final long serialVersionUID = 1L;

        public MyRuntimeException(String message) {
            super(message);
        }
    }

    public static final class TestMessage extends AbstractProtocolMessage {

        @HttpHeader(TYPE_HTTP_HEADER)
        @MessageDiscriminator
        public static final String TYPE = TestMessage.class.getSimpleName();

        @PostConstruct
        public void postConstruct() {
            LOG.debug("postConstruct method invoked");
            throw new MyRuntimeException("failing post construct method");
        }
    }

    @Test
    public void testFailingPostConstructStackTrace() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new ProtocolMessageCatalog() {

            public List<Class<?>> getCatalogClasses() {
                List<Class<?>> catalogClasses = new LinkedList<Class<?>>();
                catalogClasses.add(TestMessage.class);
                return catalogClasses;
            }
        };
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("foo-bar");
        testHeaderNames.add("X-AppletProtocol-Version");
        testHeaderNames.add("X-AppletProtocol-Type");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type"))
                .andStubReturn(TestMessage.class.getSimpleName());

        // prepare
        EasyMock.replay(mockHttpReceiver);

        try {
            // operate
            unmarshaller.receive(mockHttpReceiver);
            fail();
        } catch (Exception e) {
            LOG.debug("error: " + e.getMessage(), e);
            // verify
            EasyMock.verify(mockHttpReceiver);
            assertTrue(e instanceof MyRuntimeException);
        }
    }

    @Test
    public void receiveClientEnvironmentMessage() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("foo-bar");
        testHeaderNames.add("X-AppletProtocol-Version");
        testHeaderNames.add("X-AppletProtocol-Type");
        testHeaderNames.add("X-AppletProtocol-JavaVersion");
        testHeaderNames.add("X-AppletProtocol-JavaVendor");
        testHeaderNames.add("X-AppletProtocol-OSName");
        testHeaderNames.add("X-AppletProtocol-OSArch");
        testHeaderNames.add("X-AppletProtocol-OSVersion");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);

        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type"))
                .andStubReturn("ClientEnvironmentMessage");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-JavaVersion")).andStubReturn("1.6");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-JavaVendor")).andStubReturn("Sun");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-OSName")).andStubReturn("Linux");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-OSArch")).andStubReturn("i386");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-OSVersion")).andStubReturn("2.6");
        EasyMock.expect(mockHttpReceiver.getBody()).andStubReturn("Reader 1\nReader 2\n".getBytes());

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        Object result = unmarshaller.receive(mockHttpReceiver);

        // verify
        EasyMock.verify(mockHttpReceiver);

        assertNotNull(result);
        assertTrue(result instanceof ClientEnvironmentMessage);
        ClientEnvironmentMessage message = (ClientEnvironmentMessage) result;
        assertEquals("1.6", message.javaVersion);
        assertEquals("Sun", message.javaVendor);
        assertEquals("Linux", message.osName);
        assertEquals("i386", message.osArch);
        assertEquals("2.6", message.osVersion);
        // TODO body test
    }

    @Test
    public void receiveIdentityDataMessageCaseInsensitiveHeaders() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type"))
                .andStubReturn("IdentityDataMessage");

        List<String> testHeaderNames = new LinkedList<String>();
        testHeaderNames.add("foo-bar");
        testHeaderNames.add("x-appletprotocol-version");
        testHeaderNames.add("x-appletprotocol-type");
        testHeaderNames.add("x-appletprotocol-identityfilesize");
        testHeaderNames.add("x-appletprotocol-addressfilesize");
        EasyMock.expect(mockHttpReceiver.getHeaderNames()).andStubReturn(testHeaderNames);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("x-appletprotocol-version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("x-appletprotocol-type"))
                .andStubReturn("IdentityDataMessage");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("x-appletprotocol-identityfilesize")).andStubReturn("10");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("x-appletprotocol-addressfilesize")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getBody()).andStubReturn("hello world".getBytes());

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        Object result = unmarshaller.receive(mockHttpReceiver);

        // verify
        EasyMock.verify(mockHttpReceiver);

        assertNotNull(result);
        assertTrue(result instanceof IdentityDataMessage);
        IdentityDataMessage identityDataMessageResult = (IdentityDataMessage) result;
        assertNotNull(identityDataMessageResult.body);
        assertArrayEquals("hello world".getBytes(), identityDataMessageResult.body);
        assertEquals((Integer) 10, identityDataMessageResult.identityFileSize);
        assertEquals((Integer) 1, identityDataMessageResult.addressFileSize);
    }

    @Test
    public void receiveUnknownMessage() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("1");
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Type")).andStubReturn("foo-bar");

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        try {
            unmarshaller.receive(mockHttpReceiver);
            fail();
        } catch (RuntimeException e) {
            // expected
            // verify
            LOG.debug("expected error: " + e.getMessage());
            EasyMock.verify(mockHttpReceiver);
        }
    }

    @Test
    public void unsecureHttpReceiver() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(false);

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        try {
            unmarshaller.receive(mockHttpReceiver);
            fail();
        } catch (SecurityException e) {
            // expected
            // verify
            LOG.debug("expected error: " + e.getMessage());
            EasyMock.verify(mockHttpReceiver);
        }
    }

    @Test
    public void protocolVersion() throws Exception {
        // setup
        ProtocolMessageCatalog catalog = new AppletProtocolMessageCatalog();
        Unmarshaller unmarshaller = new Unmarshaller(catalog);

        HttpReceiver mockHttpReceiver = EasyMock.createMock(HttpReceiver.class);

        // stubs
        EasyMock.expect(mockHttpReceiver.isSecure()).andStubReturn(true);
        EasyMock.expect(mockHttpReceiver.getHeaderValue("X-AppletProtocol-Version")).andStubReturn("007");

        // prepare
        EasyMock.replay(mockHttpReceiver);

        // operate
        try {
            unmarshaller.receive(mockHttpReceiver);
            fail();
        } catch (RuntimeException e) {
            // expected
            // verify
            LOG.debug("expected error: " + e.getMessage());
            EasyMock.verify(mockHttpReceiver);
        }
    }

    // TODO: test semantical validator

}