test.integ.be.fedict.commons.eid.client.CardAndTerminalManagerExercises.java Source code

Java tutorial

Introduction

Here is the source code for test.integ.be.fedict.commons.eid.client.CardAndTerminalManagerExercises.java

Source

/*
 * Commons eID Project.
 * Copyright (C) 2008-2013 FedICT.
 * Copyright (C) 2015 e-Contract.be BVBA.
 *
 * 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/.
 */

/**
 * Manual exercise for CardAndTerminalManager.
 * Prints events and list of readers with cards.
 * [short readername] ... 
 * readers with cards inserted have a "*" behind their short name
 * 
 * @author Frank Marien
 * 
 */

package test.integ.be.fedict.commons.eid.client;

import java.util.Random;
import javax.smartcardio.Card;
import javax.smartcardio.CardTerminal;
import org.junit.Test;
import be.fedict.commons.eid.client.CardAndTerminalManager;
import be.fedict.commons.eid.client.event.CardEventsListener;
import be.fedict.commons.eid.client.event.CardTerminalEventsListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class CardAndTerminalManagerExercises implements CardTerminalEventsListener, CardEventsListener {

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

    private CardAndTerminalManager cardAndTerminalManager;

    // ---------------------------------------------------------------------------------------------

    /*
     * Exercises asynchronous run with callbacks: instantiate, register
     * listeners, call start(). The test then loops and adds/removes a listener
     * in some pseudo-random timing pattern. This is to ensure that the list of
     * listeners remains properly synchronized in relation to it being iterated
     * whenever events are being sent to listeners this test never returns..
     * since it requires someone to attach/detach readers and insert/remove
     * cards this is no problem until we automate those using e.g.
     * http://www.lynxmotion
     * .com/p-816-al5d-robotic-arm-combo-kit-free-software.aspx
     * 
     * While running this test, the operator should attach and detach at least 2
     * card terminals, insert and remove cards from them, in all possible
     * permutations. The state displayed should, at all times, reflect the state
     * of the readers and their cards within 250-400 ms.
     */

    @Test
    public void testDetections() throws Exception {
        final Random random = new Random(0);
        this.cardAndTerminalManager = new CardAndTerminalManager(new TestLogger());
        this.cardAndTerminalManager.addCardTerminalListener(this);
        this.cardAndTerminalManager.addCardListener(this);

        // cardAndTerminalManager.ignoreCardEventsFor("VASCO DP905");

        this.cardAndTerminalManager.start();

        final CardTerminalEventsListener dummyCTL = new CardTerminalEventsListener() {

            @Override
            public void terminalDetached(final CardTerminal cardTerminal) {
            }

            @Override
            public void terminalAttached(final CardTerminal cardTerminal) {
            }

            @Override
            public void terminalEventsInitialized() {
                // TODO Auto-generated method stub

            }
        };

        final CardEventsListener dummyCL = new CardEventsListener() {

            @Override
            public void cardRemoved(final CardTerminal cardTerminal) {
            }

            @Override
            public void cardInserted(final CardTerminal cardTerminal, final Card card) {
            }

            @Override
            public void cardEventsInitialized() {
                // TODO Auto-generated method stub

            }
        };

        LOG.debug("main thread running.. do some card tricks..");

        for (;;) {
            System.err.print("+");
            this.cardAndTerminalManager.addCardTerminalListener(dummyCTL);
            this.cardAndTerminalManager.addCardListener(dummyCL);
            Thread.sleep(random.nextInt(100));
            System.err.print("-");
            this.cardAndTerminalManager.removeCardTerminalListener(dummyCTL);
            this.cardAndTerminalManager.removeCardListener(dummyCL);
            Thread.sleep(random.nextInt(100));
        }
    }

    // ---------------------------------------------------------------------------------------------

    /*
     * Exercise CardAndTerminalManager's start() stop() semantics, with regards
     * to its worker thread. This test starts and stops a CardAndTerminalManager
     * randomly. It should remain in a consistent state at all times and detect
     * terminal attaches/detaches and card inserts/removals as usual (while
     * running, of course..)
     */
    @Test
    public void testStartStop() throws Exception {
        final Random random = new Random(0);
        this.cardAndTerminalManager = new CardAndTerminalManager(new TestLogger());
        this.cardAndTerminalManager.addCardTerminalListener(this);
        this.cardAndTerminalManager.addCardListener(this);

        for (;;) {
            System.err.print("+");
            this.cardAndTerminalManager.start();
            Thread.sleep(random.nextInt(2000));
            System.err.print("-");
            this.cardAndTerminalManager.stop();
            Thread.sleep(random.nextInt(2000));
        }
    }

    // ----------------------------- callbacks that just print to stderr
    // -------------------

    @Override
    public void terminalAttached(final CardTerminal terminalAttached) {
        LOG.debug("Terminal Attached [" + terminalAttached.getName() + "]");
    }

    @Override
    public void terminalDetached(final CardTerminal terminalDetached) {
        LOG.debug("Terminal Detached [" + terminalDetached.getName() + "]");
    }

    @Override
    public void cardInserted(final CardTerminal cardTerminal, final Card card) {
        if (card != null) {
            LOG.debug("Card [" + StringUtils.atrToString(card.getATR()) + "] Inserted Into Terminal ["
                    + cardTerminal.getName() + "]");
        } else {
            LOG.debug("Card present but failed to connect()");
        }
    }

    @Override
    public void cardRemoved(final CardTerminal terminalWithCardRemoved) {
        LOG.debug("Card Removed From [" + terminalWithCardRemoved.getName() + "]");
    }

    @Override
    public void cardEventsInitialized() {
        LOG.debug("Card Events Initialised");

    }

    @Override
    public void terminalEventsInitialized() {
        LOG.debug("Terminal Events Initialised");
    }
}