org.marketcetera.util.auth.AuthenticationSystemTest.java Source code

Java tutorial

Introduction

Here is the source code for org.marketcetera.util.auth.AuthenticationSystemTest.java

Source

package org.marketcetera.util.auth;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Locale;
import org.apache.commons.lang.SystemUtils;
import org.apache.log4j.Level;
import org.junit.Before;
import org.junit.Test;
import org.marketcetera.util.file.CloseableRegistry;
import org.marketcetera.util.log.ActiveLocale;
import org.marketcetera.util.log.I18NBoundMessage;
import org.marketcetera.util.test.TestCaseBase;

import static org.junit.Assert.*;

/**
 * @author tlerios@marketcetera.com
 * @since 0.5.0
 * @version $Id$
 */

/* $License$ */

public class AuthenticationSystemTest extends TestCaseBase {
    private static final String TEST_CATEGORY = AuthenticationSystem.class.getName();
    private static final String TEST_VALUE = "x";
    private static final String TEST_MESSAGE = "Test message";
    private static final String TEST_LOCATION = TEST_CATEGORY;

    private static class MyHolder extends Holder<String> {
        private int mTipCount;
        private int mCount;

        MyHolder(int tipCount) {
            mTipCount = tipCount;
            mCount = 0;
        }

        MyHolder(int tipCount, I18NBoundMessage message) {
            super(message);
            mTipCount = tipCount;
            mCount = 0;
        }

        void increaseAndSet() {
            mCount++;
            if (mCount >= mTipCount) {
                setValue(TEST_VALUE);
            }
        }
    }

    private static class MySetter extends Setter<MyHolder> {
        private int mCalledCount;

        MySetter(MyHolder holder) {
            super(holder, null);
        }

        int getCalledCount() {
            return mCalledCount;
        }

        void setValue() {
            mCalledCount++;
            getHolder().increaseAndSet();
        }
    }

    private static class MyContext extends Context<MySetter> {
        private String mUsage;
        private int mCalledCount;

        public MyContext(boolean overrides, String usage) {
            super(overrides);
            mUsage = usage;
        }

        int getCalledCount() {
            return mCalledCount;
        }

        @Override
        public void printUsage(PrintStream stream) {
            stream.print(mUsage);
        }

        @Override
        public void setValues() {
            mCalledCount++;
            for (MySetter setter : getSetters()) {
                if (setter.getHolder().isSet()) {
                    continue;
                }
                setter.setValue();
            }
        }
    }

    private static void usage(AuthenticationSystem system, String usage) {
        ByteArrayOutputStream outputStream;
        CloseableRegistry r = new CloseableRegistry();
        try {
            outputStream = new ByteArrayOutputStream();
            r.register(outputStream);
            PrintStream printStream = new PrintStream(outputStream);
            r.register(printStream);
            system.printUsage(printStream);
        } finally {
            r.close();
        }
        assertEquals(usage, new String(outputStream.toByteArray()));
    }

    @Before
    public void setupAuthenticationSystemTest() {
        setLevel(TEST_CATEGORY, Level.ERROR);
        ActiveLocale.setProcessLocale(Locale.ROOT);
    }

    @Test
    public void oneContext() throws Exception {
        MyHolder holder1 = new MyHolder(1);
        assertFalse(holder1.isSet());
        MyHolder holder2 = new MyHolder(2, TestMessages.TEST_MESSAGE);
        assertFalse(holder2.isSet());

        MyContext context1 = new MyContext(false, "1");
        MySetter setter11 = new MySetter(holder1);
        context1.add(setter11);
        MySetter setter12 = new MySetter(holder2);
        context1.add(setter12);

        AuthenticationSystem system = new AuthenticationSystem();
        system.add(context1);
        usage(system, "1" + SystemUtils.LINE_SEPARATOR);
        system.setValues();

        assertEquals(1, context1.getCalledCount());
        assertEquals(1, setter11.getCalledCount());
        assertEquals(1, setter12.getCalledCount());

        assertTrue(holder1.isSet());
        assertFalse(holder2.isSet());

        assertEquals(TEST_VALUE, holder1.getValue());

        assertSingleEvent(Level.ERROR, TEST_CATEGORY, TEST_MESSAGE, TEST_LOCATION);
    }

    @Test
    public void twoContexts() throws Exception {
        MyHolder holder1 = new MyHolder(1);
        assertFalse(holder1.isSet());
        MyHolder holder2 = new MyHolder(2, TestMessages.TEST_MESSAGE);
        assertFalse(holder2.isSet());

        MyContext context1 = new MyContext(false, "1");
        MySetter setter11 = new MySetter(holder1);
        context1.add(setter11);
        MySetter setter12 = new MySetter(holder2);
        context1.add(setter12);

        MyContext context2 = new MyContext(false, "2");
        MySetter setter21 = new MySetter(holder1);
        context2.add(setter21);
        MySetter setter22 = new MySetter(holder2);
        context2.add(setter22);

        AuthenticationSystem system = new AuthenticationSystem();
        system.add(context1);
        system.add(context2);
        usage(system, "1" + SystemUtils.LINE_SEPARATOR + "2" + SystemUtils.LINE_SEPARATOR);
        system.setValues();

        assertEquals(1, context1.getCalledCount());
        assertEquals(1, setter11.getCalledCount());
        assertEquals(1, setter12.getCalledCount());

        assertEquals(1, context2.getCalledCount());
        assertEquals(0, setter21.getCalledCount());
        assertEquals(1, setter22.getCalledCount());

        assertTrue(holder1.isSet());
        assertTrue(holder2.isSet());

        assertEquals(TEST_VALUE, holder1.getValue());
        assertEquals(TEST_VALUE, holder2.getValue());

        assertNoEvents();
    }

    @Test
    public void threeContexts() throws Exception {
        MyHolder holder1 = new MyHolder(1);
        assertFalse(holder1.isSet());
        MyHolder holder2 = new MyHolder(2, TestMessages.TEST_MESSAGE);
        assertFalse(holder2.isSet());

        MyContext context1 = new MyContext(false, "1");
        MySetter setter11 = new MySetter(holder1);
        context1.add(setter11);
        MySetter setter12 = new MySetter(holder2);
        context1.add(setter12);

        MyContext context2 = new MyContext(false, "2");
        MySetter setter21 = new MySetter(holder1);
        context2.add(setter21);
        MySetter setter22 = new MySetter(holder2);
        context2.add(setter22);

        MyContext context3 = new MyContext(false, "3");
        MySetter setter31 = new MySetter(holder1);
        context3.add(setter31);
        MySetter setter32 = new MySetter(holder2);
        context3.add(setter32);

        AuthenticationSystem system = new AuthenticationSystem();
        system.add(context1);
        system.add(context2);
        system.add(context3);
        usage(system, "1" + SystemUtils.LINE_SEPARATOR + "2" + SystemUtils.LINE_SEPARATOR + "3"
                + SystemUtils.LINE_SEPARATOR);
        system.setValues();

        assertEquals(1, context1.getCalledCount());
        assertEquals(1, setter11.getCalledCount());
        assertEquals(1, setter12.getCalledCount());

        assertEquals(1, context2.getCalledCount());
        assertEquals(0, setter21.getCalledCount());
        assertEquals(1, setter22.getCalledCount());

        assertEquals(0, context3.getCalledCount());
        assertEquals(0, setter31.getCalledCount());
        assertEquals(0, setter32.getCalledCount());

        assertTrue(holder1.isSet());
        assertTrue(holder2.isSet());

        assertEquals(TEST_VALUE, holder1.getValue());
        assertEquals(TEST_VALUE, holder2.getValue());

        assertNoEvents();
    }
}