You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sm...@apache.org on 2006/06/09 12:57:10 UTC

svn commit: r413011 [2/3] - /incubator/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/javax/security/auth/login/LoginContextTest_1.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/javax/security/auth/login/LoginContextTest_1.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/javax/security/auth/login/LoginContextTest_1.java?rev=413011&r1=413010&r2=413011&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/javax/security/auth/login/LoginContextTest_1.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/javax/security/auth/login/LoginContextTest_1.java Fri Jun  9 03:57:10 2006
@@ -1,2215 +1,2215 @@
-/*
- *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-/**
-* @author Alexander V. Astapchuk
-* @version $Revision$
-*/
-
-package javax.security.auth.login;
-
-import java.io.IOException;
-import java.net.URL;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import java.security.AccessControlContext;
-import java.security.AccessController;
-import java.security.CodeSource;
-import java.security.DomainCombiner;
-import java.security.Permission;
-import java.security.PermissionCollection;
-import java.security.Policy;
-import java.security.PrivilegedExceptionAction;
-import java.security.PrivilegedAction;
-import java.security.ProtectionDomain;
-import java.security.Security;
-
-import javax.security.auth.AuthPermission;
-import javax.security.auth.Subject;
-import javax.security.auth.SubjectDomainCombiner;
-import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.spi.LoginModule;
-
-import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
-
-import junit.framework.TestCase;
-
-
-/**
- * Unit tests for LoginContext
- */
-public class LoginContextTest_1 extends TestCase {
-
-    private static final String CONFIG_NAME = "testConfiguration";
-
-    private static final String DEFAULT_CBHANDLER_PROPERTY = "auth.login.defaultCallbackHandler";
-
-    private static final int OPTIONAL = 0;
-
-    private static final int REQUIRED = 1;
-
-    private static final int REQUISITE = 2;
-
-    private static final int SUFFICIENT = 3;
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(LoginContextTest_1.class);
-    }
-
-    /**
-     * Converts short (local) class names (like TestLoginModule) into the 
-     * global (fully qualified) ones.<br>
-     * For example:<br>
-     * TestLoginModule => javax.security.auth.login.LoginContextTest$TestLoginModule
-     * @param shortName
-     * @return fully qualified name
-     */
-    private static String getGlobalClassName(String shortName) {
-        return LoginContextTest_1.class.getName() + "$" + shortName;
-    }
-
-    /**
-     * Maps an integer value into appropriate LoginModuleControlFlag.
-     * @param flag
-     * @return
-     */
-    private static LoginModuleControlFlag mapControlFlag(int flag) {
-        switch (flag) {
-        case OPTIONAL:
-            return LoginModuleControlFlag.OPTIONAL;
-        case REQUIRED:
-            return LoginModuleControlFlag.REQUIRED;
-        case REQUISITE:
-            return LoginModuleControlFlag.REQUISITE;
-        case SUFFICIENT:
-            return LoginModuleControlFlag.SUFFICIENT;
-        }
-        throw new Error("Unknown flag:" + flag);
-    }
-
-    /**
-     * A special purpose Configuration.<br>
-     * Special functions are:<br>
-     * <il>
-     * <li>it keeps track of the configuration names requested via 
-     * getAppConfigurationEntry - see {@link #wasTheNameQueried(String)}
-     * <li>can dynamically add modules - see 
-     * add{Optional|Required|Requisite|Sufficient}
-     * <li>with a presumption that the statically installed Configuration 
-     * is also of type TestConfig, allows to dynamically add modules to that
-     * installed Configuration - see addInstalled{*}.
-     * <li>can handle several Configurations with a different names for the 
-     * {@link #getAppConfigurationEntry(String)} - see 
-     * {@link #addConfig(String, Configuration)} (again, with a presumption that
-     * the Configuration.getConfiguration() is instanceof TestConfig )  
-     * </il>
-     */
-    private static final class TestConfig extends Configuration {
-        private String name;
-
-        private ArrayList entries = new ArrayList();
-
-        // A map 'name'=>'some specific configuration'
-        private HashMap configs = new HashMap();
-
-        // An array which keeps track of the configuration names requested.
-        private ArrayList requests = new ArrayList();
-
-        public TestConfig() {
-        }
-
-        public TestConfig(String name) {
-            this.name = name;
-        }
-
-        public AppConfigurationEntry[] getAppConfigurationEntry(String appName) {
-
-            if (!requests.contains(appName)) {
-                requests.add(appName);
-            }
-
-            if (name == null || !name.equals(appName)) {
-
-                Configuration conf = (Configuration) configs.get(appName);
-                if (conf != null) {
-                    return conf.getAppConfigurationEntry(appName);
-                }
-
-                if (!CONFIG_NAME.equals(appName)) {
-                    return null;
-                }
-            }
-
-            AppConfigurationEntry ret[] = new AppConfigurationEntry[entries
-                    .size()];
-            entries.toArray(ret);
-            return ret;
-        }
-
-        public void refresh() {
-            // do nothing
-        }
-
-        public boolean wasTheNameQueried(String name) {
-            return requests.contains(name);
-        }
-
-        String addRequired(String name) {
-            return add(name,
-                    AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
-                    new HashMap());
-        }
-
-        String addOptional(String name) {
-            return add(name,
-                    AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL,
-                    new HashMap());
-        }
-
-        String addSufficient(String name) {
-            return add(name,
-                    AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT,
-                    new HashMap());
-        }
-
-        String addRequisite(String name) {
-            return add(name, LoginModuleControlFlag.REQUISITE, new HashMap());
-        }
-
-        String add(int type, String name, Map options) {
-            return add(name, mapControlFlag(type), options);
-        }
-
-        String add(String name,
-                AppConfigurationEntry.LoginModuleControlFlag flag, Map options) {
-            String fullName = getGlobalClassName(name);
-            AppConfigurationEntry entry = new AppConfigurationEntry(fullName,
-                    flag, options);
-            entries.add(entry);
-            return fullName;
-        }
-
-        public static String addInstalledRequired(String name) {
-            return ((TestConfig) Configuration.getConfiguration())
-                    .addRequired(name);
-        }
-
-        public static String addInstalledOptional(String name) {
-            return ((TestConfig) Configuration.getConfiguration())
-                    .addOptional(name);
-        }
-
-        public static String addInstalledRequisite(String name) {
-            return ((TestConfig) Configuration.getConfiguration())
-                    .addRequisite(name);
-        }
-
-        public static String addInstalledSufficient(String name) {
-            return ((TestConfig) Configuration.getConfiguration())
-                    .addSufficient(name);
-        }
-
-        public static String addInstalled(int type, String name) {
-            return ((TestConfig) Configuration.getConfiguration()).add(type,
-                    name, new HashMap());
-        }
-
-        public static void clear() {
-            ((TestConfig) Configuration.getConfiguration()).entries.clear();
-            ((TestConfig) Configuration.getConfiguration()).configs.clear();
-        }
-
-        public static void addConfig(String name, Configuration conf) {
-            ((TestConfig) Configuration.getConfiguration()).configs.put(name,
-                    conf);
-        }
-
-        public static TestConfig get() {
-            return (TestConfig) Configuration.getConfiguration();
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule.<br>
-     * It has the following features:<br>
-     * <il>
-     * <li>its behaviour is managed - either on by-instance level (via a flags 
-     * passed to its ctor) ar on a global level - through the static mask
-     * 
-     * <li>the behaviour managed includes: returning a specified value 
-     * (true/false) from defined methods/ctor, or throwing an
-     * Error/RuntimeException/LoginException -either specified by user or 
-     * created dynamically - from defined methods
-     * 
-     * <li>it keeps track of instances created
-     * 
-     * <li>each instance keeps track of which method was called 
-     * </il>
-     * 
-     * The behaviour can be managed either for each particular instance - by 
-     * passing an appropriate mask into ctor, or can be managed globally - via
-     * static field {@link #staticMask}.<br>
-     * By default, all the methods return <code>true</code> (success) and do not
-     * throw anything.<br>
-     * The constatnts <b>FAIL_AT_*</b> shows where to fail. Then if 
-     * {@link staticRE} field is set, then this RuntimeException will be thrown,
-     * otherwise if {@link #staticErr} is set, then this Error will be thrown, 
-     * otherwise, if {@link #staticLE} is set, then this LoginException will be 
-     * thrown, otherwise, finally, a new LoginException will be constructed and 
-     * thrown.<br>    
-     * The constants <b>FALSE_AT_*</b> shows which method must return 
-     * <code>false</code>. 
-     * The <b><code>FAIL_AT_*</code></b> constants have priority before 
-     * <b><code>FALSE_AT_*</code></b><br>
-     * Note: if an instance executes <code>FAIL_AT_CTOR</code>, then this 
-     * instance do <b>not</b> get tracked. 
-     */
-
-    public static class TestLoginModule implements LoginModule {
-        public static final int FAIL_AT_CTOR = 0x001;
-
-        public static final int FAIL_AT_INIT = 0x002;
-
-        public static final int FAIL_AT_LOGIN = 0x004;
-
-        public static final int FAIL_AT_COMMIT = 0x008;
-
-        public static final int FAIL_AT_LOGOUT = 0x010;
-
-        public static final int FAIL_AT_ABORT = 0x020;
-
-        //
-        public static final int FALSE_AT_LOGIN = 0x040;
-
-        public static final int FALSE_AT_COMMIT = 0x080;
-
-        public static final int FALSE_AT_LOGOUT = 0x100;
-
-        public static final int FALSE_AT_ABORT = 0x200;
-
-        // A message used to construct LoginException
-        private static final String msg = "Managed test exception. Nothing serious.";
-
-        public static int staticMask = 0;
-
-        public static RuntimeException staticRE;
-
-        public static Error staticERR;
-
-        public static LoginException staticLE;
-
-        //
-        protected static ArrayList instances = new ArrayList();
-
-        private boolean initCalled;
-
-        private boolean loginCalled;
-
-        private boolean abortCalled;
-
-        private boolean commitCalled;
-
-        private boolean logoutCalled;
-
-        public CallbackHandler cbHandler;
-
-        //
-        private int mask;
-
-        private RuntimeException re;
-
-        private Error err;
-
-        private LoginException le;
-
-        /**
-         * returns <code>i</code> item from the list of tracked items.
-         */
-        static TestLoginModule get(int i) {
-            return (TestLoginModule) instances.get(i);
-        }
-
-        /**
-         * Clears the list of tracked instances.
-         */
-        static void clear() {
-            instances.clear();
-        }
-
-        /**
-         * Returns the number of items tracked.
-         */
-        static int size() {
-            return instances.size();
-        }
-
-        public TestLoginModule() {
-            this(-1, staticRE, staticERR, staticLE);
-        }
-
-        protected TestLoginModule(int mask) {
-            this(mask, null, null, null);
-        }
-
-        protected TestLoginModule(int mask, RuntimeException re) {
-            this(mask, re, null, null);
-        }
-
-        protected TestLoginModule(int mask, Error err) {
-            this(mask, null, err, null);
-        }
-
-        protected TestLoginModule(int mask, LoginException le) {
-            this(mask, null, null, le);
-        }
-
-        /**
-         * Constructs and initializes instance of the TestLoginModule.<br>
-         * If you want the instance to use {@link #staticMask} then pass 
-         * <code>-1</code> as <code>mask</code>. To fail at nowhere, pass 
-         * <code>0</code> as <code>mask</code>.<br>
-         * The appropriate <code>re</code>, <code>err</code> and 
-         * <code>le</code> will be used to throw appropriate Throwable (if any).
-         * 
-         * @param mask
-         * @param re
-         * @param err
-         * @param le
-         */
-        protected TestLoginModule(int mask, RuntimeException re, Error err,
-                LoginException le) {
-            this.mask = mask;
-            this.re = re;
-            this.err = err;
-            this.le = le;
-            boolean doit = ((mask == -1) && (staticMask & FAIL_AT_CTOR) != 0)
-                    || ((mask != -1) && (mask & FAIL_AT_CTOR) != 0);
-            if (doit) {
-                check();
-                throw new RuntimeException(msg);
-            }
-            instances.add(this);
-        }
-
-        /**
-         * Checks whether the instance variables are set and throw either 
-         * RuntimeException (checked first) or Error (checked next).<br>
-         * If none of them specified, then the method returns silently. 
-         * @throws RuntimeException
-         * @throws Error
-         */
-        private final void check() {
-            if (re != null) {
-                throw re;
-            }
-            if (err != null) {
-                throw err;
-            }
-        }
-
-        /**
-         * This method calls {@link #check()} first to check for possible 
-         * RuntimeException or Error.<br>
-         * Then, it checks whether an instance variable specifying 
-         * LoginException to throw is set. If the variable is set, then this 
-         * LoginException is thrown. Otherwise new LoginException is created
-         * and thrown.  
-         *
-         * @throws LoginException
-         */
-        private final void throw_le() throws LoginException {
-            check();
-            throw le == null ? new LoginException(msg) : le;
-        }
-
-        /**
-         * Checks whether the passed <code>msk</code> is set - either at 
-         * instance level or on the global level and returns appropriate 
-         * value.<br>
-         * If this instance's <code>mask</mask> is not set, then 
-         * {@link #staticMask} is checked. If the <code>staticMask</code> is 
-         * also not set, then the method returns <code>true</code>. If either
-         * the static mask or the instance mask is set and match the 
-         * <code>msk</code> passed, then the method returns false. 
-         * @param msk
-         * @return
-         */
-        private final boolean ret(int msk) {
-
-            if (mask == -1 && (staticMask & msk) != 0) {
-                return false;
-            }
-            if (mask != -1 && (mask & msk) != 0) {
-                return false;
-            }
-            return true;
-        }
-
-        /**
-         * See javax.security.auth.spi.LoginModule.initialize()
-         */
-        public void initialize(Subject subject,
-                CallbackHandler callbackHandler, Map sharedState, Map options) {
-
-            this.cbHandler = callbackHandler;
-            initCalled = true;
-
-            boolean doit = ((mask == -1) && (staticMask & FAIL_AT_INIT) != 0)
-                    || ((mask != -1) && (mask & FAIL_AT_INIT) != 0);
-            if (doit) {
-                check();
-                throw new RuntimeException(msg);
-            }
-        }
-
-        /**
-         * See javax.security.auth.spi.LoginModule.login()
-         */
-        public boolean login() throws LoginException {
-            loginCalled = true;
-            boolean doit = ((mask == -1) && (staticMask & FAIL_AT_LOGIN) != 0)
-                    || ((mask != -1) && (mask & FAIL_AT_LOGIN) != 0);
-            if (doit) {
-                throw_le();
-            }
-            return ret(FALSE_AT_LOGIN);
-        }
-
-        /**
-         * See javax.security.auth.spi.LoginModule.commit()
-         */
-        public boolean commit() throws LoginException {
-            commitCalled = true;
-            boolean doit = ((mask == -1) && (staticMask & FAIL_AT_COMMIT) != 0)
-                    || ((mask != -1) && (mask & FAIL_AT_COMMIT) != 0);
-            if (doit) {
-                throw_le();
-            }
-            return ret(FALSE_AT_COMMIT);
-        }
-
-        /**
-         * See javax.security.auth.spi.LoginModule.logout()
-         */
-        public boolean logout() throws LoginException {
-            logoutCalled = true;
-            boolean doit = ((mask == -1) && (staticMask & FAIL_AT_LOGOUT) != 0)
-                    || ((mask != -1) && (mask & FAIL_AT_LOGOUT) != 0);
-            if (doit) {
-                throw_le();
-            }
-            return ret(FALSE_AT_LOGOUT);
-        }
-
-        /**
-         * See javax.security.auth.spi.LoginModule.abort()
-         */
-        public boolean abort() throws LoginException {
-            abortCalled = true;
-            boolean doit = ((mask == -1) && (staticMask & FAIL_AT_ABORT) != 0)
-                    || ((mask != -1) && (mask & FAIL_AT_ABORT) != 0);
-            if (doit) {
-                throw_le();
-            }
-            return ret(FALSE_AT_ABORT);
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule whose operations are always successful.
-     */
-    public static final class TestLoginModule_Success extends TestLoginModule {
-        public TestLoginModule_Success() {
-            // '0' here means 'the mask is set, fail at nowhere'
-            super(0);
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule whose initialize() method throws 
-     * RuntimeException.
-     */
-    public static final class TestLoginModule_InitFails extends TestLoginModule {
-        public TestLoginModule_InitFails() {
-            super(FAIL_AT_INIT, new RuntimeException(
-                    "init: test runtime exception."
-                            + " don't worry about it too much."));
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule whose ctor() throws RuntimeException.
-     */
-    public static final class TestLoginModule_CtorFails extends TestLoginModule {
-        public TestLoginModule_CtorFails() {
-            super(FAIL_AT_CTOR, new RuntimeException(
-                    "ctor: test runtime exception."
-                            + " don't worry about it too much."));
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule whose commit() method throws 
-     * RuntimeException.
-     */
-    public static final class TestLoginModule_CommitFails extends
-            TestLoginModule {
-        public TestLoginModule_CommitFails() {
-            super(FAIL_AT_COMMIT, new RuntimeException(
-                    "commit: test runtime exception."
-                            + " don't worry about it too much."));
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule whose methods (but ctor) throw 
-     * LoginException.
-     */
-    public static final class TestLoginModule_Fail extends TestLoginModule {
-        public TestLoginModule_Fail() {
-            super(FAIL_AT_INIT | FAIL_AT_LOGIN | FAIL_AT_COMMIT
-                    | FAIL_AT_LOGOUT | FAIL_AT_ABORT);
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule whose methods (where applicable) return 
-     * <code>false</code>. 
-     */
-    public static final class TestLoginModule_Ignore extends TestLoginModule {
-        public TestLoginModule_Ignore() {
-            super(FALSE_AT_LOGIN | FALSE_AT_COMMIT | FALSE_AT_LOGOUT
-                    | FALSE_AT_ABORT);
-        }
-    }
-
-    /**
-     * A special-purpose CallbackHandler which keeps track of instances 
-     * created.<br>
-     */
-    public static class TestCallbackHandler implements CallbackHandler {
-        protected static ArrayList instances = new ArrayList();
-
-        /**
-         * Returns number of the instances tracked.
-         */
-        public static int size() {
-            return instances.size();
-        }
-
-        /**
-         * Clears the stored items.
-         */
-        public static void clear() {
-            instances.clear();
-        }
-
-        /**
-         * ctor.
-         */
-        public TestCallbackHandler() {
-            instances.add(this);
-        }
-
-        /**
-         * Does nothing.
-         */
-        public void handle(Callback[] callbacks) throws IOException,
-                UnsupportedCallbackException {
-
-        }
-    }
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        Configuration.setConfiguration(new TestConfig());
-        clear();
-    }
-    
-    private void clear() {
-        TestConfig.clear();
-        TestLoginModule.clear();
-        TestCallbackHandler.clear();
-        TestLoginModule.staticRE = null;
-        TestLoginModule.staticERR = null;
-        TestLoginModule.staticLE = null;
-        TestLoginModule.staticMask = 0;
-        //
-        Security.setProperty(DEFAULT_CBHANDLER_PROPERTY, "");
-    }
-
-    /**
-     * Tests LoginContext(String)
-     */
-    public void testLoginContextString() throws Exception {
-        // Must not accept nulls
-        try {
-            new LoginContext(null);
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        // Invalid names (which are not presented in Config) must not 
-        // be accepted - of no 'other' configuration exists
-        String name = "some strange and non existing name";
-        try {
-            new LoginContext(name);
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        assertTrue(TestConfig.get().wasTheNameQueried(name));
-
-        // Invalid names must be processed as 'other' if such Configuration
-        // exists
-        TestConfig conf = new TestConfig("other");
-        conf.addRequired("TestLoginModule_Success");
-        TestConfig.addConfig("other", conf);
-        name = "this strange and non existing name will be treated as 'other'";
-        new LoginContext(name);
-
-        //1st, static installed Config must be queried 
-        assertTrue(TestConfig.get().wasTheNameQueried(name));
-        //2d, the another config must be quered for other
-        assertTrue(TestConfig.get().wasTheNameQueried("other"));
-
-        // Valid names which exist but does not have eny entries must 
-        // also be accepted. Empty set will be considered as a problem 
-        // much later - at login() phase
-        new LoginContext(CONFIG_NAME);
-        //
-        Security.setProperty(DEFAULT_CBHANDLER_PROPERTY, "no such class");
-        try {
-            new LoginContext(CONFIG_NAME);
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // gut
-        }
-        String klassName = getGlobalClassName("TestCallbackHandler");
-
-        Security.setProperty(DEFAULT_CBHANDLER_PROPERTY, klassName);
-        // This also shows that the cbHandler is instantiated at the ctor
-        new LoginContext(CONFIG_NAME);
-        assertEquals(1, TestCallbackHandler.size());
-        // ugh... cant set 'null' here... 
-        Security.setProperty(DEFAULT_CBHANDLER_PROPERTY, "");
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext(String, CallbackHandler)
-     */
-    public void testLoginContextStringCallbackHandler() {
-        // Must not accept nulls as CallbackHandler, name 
-        // The exception to be thrown is LoginException and not NPE
-        try {
-            new LoginContext(CONFIG_NAME, (CallbackHandler) null);
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        try {
-            new LoginContext(null, new TestCallbackHandler());
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext(String, Subject)
-     */
-    public void testLoginContextStringSubject() {
-        // Must not accept nulls as Subject, name
-        // The exception to be thrown is LoginException and not NPE
-        try {
-            new LoginContext(CONFIG_NAME, (Subject) null);
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        try {
-            new LoginContext(null, new Subject());
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext(String, Subject, CallbackHandler)
-     */
-    public void testLoginContextStringSubjectCallbackHandler() {
-        // The exceptions to be thrown are LoginExceptions and not NPEs
-
-        // Must not accept null as Subject, CallbackHandler, name 
-        try {
-            new LoginContext(CONFIG_NAME, (Subject) null,
-                    new TestCallbackHandler());
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        try {
-            new LoginContext(CONFIG_NAME, new Subject(), null);
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        try {
-            new LoginContext(null, new Subject(), new TestCallbackHandler());
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext(String, Subject, CallbackHandler, Configuration)
-     */
-    public void testLoginContextStringSubjectCallbackHandlerConfiguration()
-            throws Exception {
-        // Must accept null everywhere, but at name
-        try {
-            new LoginContext(null, new Subject(), new TestCallbackHandler(),
-                    new TestConfig());
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        new LoginContext(CONFIG_NAME, null, null, null);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * Make sure that the proper (context) class loader is used.
-     */
-    public void testLogin_minus1() throws Exception {
-        final ArrayList requests = new ArrayList();
-        ClassLoader saveCCL = Thread.currentThread().getContextClassLoader();
-
-        ClassLoader testClassLoader = new ClassLoader() {
-            protected synchronized Class loadClass(String klassName,
-                    boolean resolve) throws ClassNotFoundException {
-                requests.add(klassName);
-                return super.loadClass(klassName, resolve);
-            }
-        };
-        Thread.currentThread().setContextClassLoader(testClassLoader);
-        String klassName = TestConfig
-                .addInstalledRequired("NoSuchClassHere");
-        try {
-            LoginContext lc = new LoginContext(CONFIG_NAME);
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // gut
-        } finally {
-            Thread.currentThread().setContextClassLoader(saveCCL);
-        }
-        // If failed, then it seems, that wrong (not context) class loader was 
-        // used - the class was not requested to load
-        assertTrue(requests.contains(klassName));
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * Second attempt to login() on context already logged, must be successful.<br>
-     * This is how the RI works.
-     */
-    public void testLogin_00() throws Exception {
-        TestConfig.addInstalledSufficient("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        lc.login();
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If no Subject provided, then new Subject created and this subject is 
-     * used for all subsequent operations.
-     */
-    public void testLogin_01() throws Exception {
-        TestConfig.addInstalledSufficient("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        Subject subj0 = lc.getSubject();
-        assertNotNull(subj0);
-        lc.logout();
-        //
-        lc.login();
-        Subject subj1 = lc.getSubject();
-        assertSame(subj0, subj1);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * init() must be called only once. 
-     */
-    public void testLogin_02_0() throws Exception {
-        TestConfig.addInstalledSufficient("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        assertEquals(1, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-
-        lc.logout();
-        assertTrue(TestLoginModule.get(0).logoutCalled);
-        //
-        TestLoginModule.get(0).loginCalled = false;
-        TestLoginModule.get(0).initCalled = false;
-
-        lc.login();
-
-        assertEquals(1, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertFalse(TestLoginModule.get(0).initCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * init() must be called only once - even if it fails first time. 
-     */
-    public void testLogin_02_1() throws Exception {
-        TestConfig.addInstalledSufficient("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_INIT;
-
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            //ok
-        }
-
-        assertEquals(1, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertFalse(TestLoginModule.get(0).loginCalled);
-        assertFalse(TestLoginModule.get(0).commitCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        assertFalse(TestLoginModule.get(0).logoutCalled);
-
-        lc.logout();
-
-        TestLoginModule.get(0).initCalled = false;
-        TestLoginModule.get(0).loginCalled = false;
-        TestLoginModule.get(0).commitCalled = false;
-        TestLoginModule.get(0).abortCalled = false;
-        TestLoginModule.get(0).logoutCalled = false;
-
-        TestLoginModule.staticMask = 0;
-        lc.login();
-
-        assertEquals(1, TestLoginModule.size());
-        assertFalse(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertFalse(TestLoginModule.get(0).abortCalled);
-        assertFalse(TestLoginModule.get(0).logoutCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If any module not found, then overall attempt must fail. 
-     * If a module fails during it's ctor/init/commit - it must be processed 
-     * the same way as if it were failing during it's login().<br>
-     * Various combinations are checked.
-     */
-    public void testLogin_03() throws Exception {
-        // A little bit sophisticated structure
-        // if variant[i][0] == -1 then: 
-        // 	- it starts a new variant
-        //	- variants[i][1] contains description for the variant started
-        //	- variants[i][2] contains expected result (true - success, false-failure) for the variant
-        Object[][] variants = new Object[][] {
-                //  
-                { new Integer(-1), "[if no class found - overall failure]",
-                        Boolean.FALSE },
-                { new Integer(OPTIONAL), "no such class" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-
-                { new Integer(-1),
-                        "[ctor failure treated as failed login() - 0] ",
-                        Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_CtorFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-
-                { new Integer(-1),
-                        "[ctor failure treated as failed login() - 1] ",
-                        Boolean.FALSE },
-                { new Integer(REQUISITE), "TestLoginModule_CtorFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-
-                { new Integer(-1),
-                        "[init failure treated as failed login() - 0]",
-                        Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_InitFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-
-                { new Integer(-1),
-                        "[init failure treated as failed login() - 1]",
-                        Boolean.FALSE },
-                { new Integer(REQUIRED), "TestLoginModule_InitFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 0", Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_Fail" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 1", Boolean.FALSE },
-                { new Integer(REQUIRED), "no such class" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 2", Boolean.FALSE },
-                { new Integer(REQUISITE), "no such class" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 3", Boolean.FALSE },
-                { new Integer(SUFFICIENT), "no such class" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 4", Boolean.FALSE },
-                { new Integer(REQUIRED), "TestLoginModule_InitFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 5", Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_InitFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Failing" },
-
-                { new Integer(-1), "simple testcase 6", Boolean.TRUE },
-                { new Integer(REQUISITE), "TestLoginModule_Success" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Failing" },
-
-                { new Integer(-1), "simple testcase 7", Boolean.FALSE },
-                { new Integer(REQUIRED), "TestLoginModule_CtorFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase 8", Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_CtorFails" },
-                { new Integer(SUFFICIENT), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_Failing" },
-
-                { new Integer(-1), "simple testcase 9", Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-                { new Integer(SUFFICIENT), "TestLoginModule_CtorFails" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase A", Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-                { new Integer(SUFFICIENT), "TestLoginModule_CommitFails" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-
-                { new Integer(-1), "simple testcase B", Boolean.TRUE },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" },
-                { new Integer(OPTIONAL), "TestLoginModule_CommitFails" },
-                { new Integer(OPTIONAL), "TestLoginModule_Success" }, };
-
-        TestConfig.clear();
-        boolean expectedResult = ((Boolean) variants[0][2]).booleanValue();
-        String caseName = variants[0][1].toString();
-
-        int startIndex = 0;
-        for (int i = 0; i < variants.length; i++) {
-            int flag = ((Integer) variants[i][0]).intValue();
-            if (flag == -1 || (i == variants.length - 1)) {
-                if (i != 0) {
-                    LoginContext lc = new LoginContext(CONFIG_NAME);
-                    try {
-                        lc.login();
-                        if (!expectedResult) {
-                            fail("must not pass here: caseStart@" + startIndex
-                                    + "; desc=" + caseName);
-                        }
-                    } catch (LoginException ex) {
-                        if (expectedResult) {
-                            fail("must not pass here: caseStart@" + startIndex
-                                    + "; desc=" + caseName);
-                        }
-                    }
-                }
-                if (i != variants.length - 1) {
-                    caseName = variants[i][1].toString();
-                    expectedResult = ((Boolean) variants[i][2]).booleanValue();
-                }
-                TestConfig.clear();
-            } else {
-                TestConfig.addInstalled(flag, variants[i][1].toString());
-            }
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If module fails during it's ctor, then it must be 
-     * created/initialized/logged next time. 
-     */
-    public void testLogin_04() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        assertEquals(0, TestLoginModule.size());
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_CTOR;
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok
-        }
-        assertEquals(0, TestLoginModule.size());
-        // fail nowhere
-        TestLoginModule.staticMask = 0;
-        lc.login(); // must be successful now
-        assertEquals(1, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If module fails during init():
-     * 		- its login() must NOT be called
-     * 		- its abort() must be called anyway.
-     */
-    public void testLogin_05() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_InitFails");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-        }
-
-        assertFalse(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If module fails during init():
-     * 		- its login() must NOT be called
-     * 		- its login() MUST be called on the next attempt
-     */
-    public void testLogin_06() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_INIT;
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok
-        }
-        assertEquals(1, TestLoginModule.size());
-        assertFalse(TestLoginModule.get(0).loginCalled);
-        assertFalse(TestLoginModule.get(0).commitCalled); // self check
-        // fail nowhere
-        TestLoginModule.staticMask = 0;
-        lc.login(); // must be successful now
-        // no new module must be created
-        assertEquals(1, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If no class found, then following modules must not be instantiated
-     */
-    public void testLogin_07() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        TestConfig.addInstalledOptional("no such class");
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            //ok
-        }
-        assertEquals(1, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        assertFalse(TestLoginModule.get(0).commitCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * RuntimeException-s (if any) must be handled and then LoginException must 
-     * be thrown
-     */
-    public void testLogin_08_0() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticRE = new RuntimeException("ctor");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        //
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_CTOR;
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * RuntimeException-s (if any) must be handled and then LoginException must 
-     * be thrown
-     */
-    public void testLogin_08_1() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticRE = new RuntimeException("init");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_INIT;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * RuntimeException-s (if any) must be handled and then LoginException must be thrown
-     */
-    public void testLogin_08_2() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticRE = new RuntimeException("login");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGIN;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * RuntimeException-s (if any) must be handled and then LoginException must be thrown
-     */
-    public void testLogin_08_3() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticRE = new RuntimeException("commit");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_COMMIT;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * Error-s (if any) must be handled and wrapped into LoginException
-     */
-    public void testLogin_09_0() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticERR = new Error("ctor");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_CTOR;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        //
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * Error-s (if any) must be handled and wrapped into LoginException
-     */
-    public void testLogin_09_1() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticERR = new Error("init");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_INIT;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * Error-s (if any) must be handled and wrapped into LoginException
-     */
-    public void testLogin_09_2() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticERR = new Error("login");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGIN;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * Error-s (if any) must be handled and wrapped into LoginException
-     */
-    public void testLogin_09_3() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticERR = new Error("commit");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_COMMIT;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // ok. the RI does not initCause() with a given RuntimeException
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * A failure during commit() must be treated exactly as a failure during 
-     * login()/whatever
-     */
-    public void testLogin_0A_0() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-        TestConfig.addInstalledOptional("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_COMMIT;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        lc.login();
-
-        assertEquals(2, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertFalse(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        assertFalse(TestLoginModule.get(1).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * see testLogin_0A_0().
-     */
-    public void testLogin_0A_1() throws Exception {
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_COMMIT;
-        TestLoginModule.staticLE = new LoginException();
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException le) {
-            assertSame(TestLoginModule.staticLE, le);
-        }
-
-        assertEquals(2, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        assertTrue(TestLoginModule.get(1).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * A failure during commit() must not stop further commit()s get called.
-     */
-    public void testLogin_0B() throws Exception {
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_COMMIT;
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        assertEquals(3, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        //
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        //
-        assertTrue(TestLoginModule.get(2).loginCalled);
-        assertTrue(TestLoginModule.get(2).commitCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * A failure during abort() must not stop further abort()s get called.
-     */
-    public void testLogin_0C() throws Exception {
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_ABORT
-                | TestLoginModule.FAIL_AT_COMMIT;
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        TestConfig.addInstalledOptional("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        assertEquals(3, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        assertTrue(TestLoginModule.get(1).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(2).loginCalled);
-        assertTrue(TestLoginModule.get(2).commitCalled);
-        assertTrue(TestLoginModule.get(2).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If any a module returns false from commit() - then nothing happens. 
-     */
-    public void testLogin_0D() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-        TestLoginModule.staticMask = TestLoginModule.FALSE_AT_COMMIT;
-        TestConfig.addInstalledRequired("TestLoginModule");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        lc.login();
-
-        assertEquals(2, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertFalse(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        assertFalse(TestLoginModule.get(1).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If any REQUIRED module returns false from login() - this does 
-     * not break the overall attempt.<br>
-     * It sounds odd, but its commit() method will also be called. 
-     */
-    public void testLogin_0E_0() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-        TestLoginModule.staticMask = TestLoginModule.FALSE_AT_LOGIN;
-        TestConfig.addInstalledRequired("TestLoginModule");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        lc.login();
-
-        assertEquals(2, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertFalse(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).initCalled);
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        assertFalse(TestLoginModule.get(1).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If any REQUISITE module returns false from login() - this does 
-     * not break the overall attempt.<br>
-     * It sounds odd, but its commit() method will be called anyway. 
-     */
-    public void testLogin_0E_1() throws Exception {
-        TestConfig.addInstalledRequisite("TestLoginModule_Success");
-        TestLoginModule.staticMask = TestLoginModule.FALSE_AT_LOGIN;
-        TestConfig.addInstalledRequisite("TestLoginModule");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        lc.login();
-
-        assertEquals(2, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertTrue(TestLoginModule.get(0).commitCalled);
-        assertFalse(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).initCalled);
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertTrue(TestLoginModule.get(1).commitCalled);
-        assertFalse(TestLoginModule.get(1).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * If any REQUIRED module fails during its login() -  
-     * then its abort() gets called anyway. 
-     */
-    public void testLogin_0F() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGIN;
-        TestConfig.addInstalledRequired("TestLoginModule");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException ex) {
-            // gut
-        }
-
-        assertEquals(2, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertFalse(TestLoginModule.get(0).commitCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        //
-        assertTrue(TestLoginModule.get(1).initCalled);
-        assertTrue(TestLoginModule.get(1).loginCalled);
-        assertFalse(TestLoginModule.get(1).commitCalled);
-        assertTrue(TestLoginModule.get(1).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.login()<br>
-     * RI investigation: check if an exception thrown from abort() method gets 
-     * rethrown, or a new LoginException is created.
-     */
-    public void testLogin_10() throws Exception {
-        TestLoginModule.staticMask = TestLoginModule.FALSE_AT_LOGIN
-                | TestLoginModule.FAIL_AT_ABORT;
-
-        TestLoginModule.staticLE = new LoginException();
-
-        TestConfig.addInstalledRequired("TestLoginModule");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-
-        try {
-            lc.login();
-        } catch (LoginException ex) {
-            // RI does not rethrow this exception, but I do. 
-            // Anyway, the login() failed - that is expected result
-            // assertSame( ex, TestLoginModule.staticLE);
-        }
-
-        assertEquals(1, TestLoginModule.size());
-        //
-        assertTrue(TestLoginModule.get(0).initCalled);
-        assertTrue(TestLoginModule.get(0).loginCalled);
-        assertFalse(TestLoginModule.get(0).commitCalled);
-        assertTrue(TestLoginModule.get(0).abortCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * Calling logout() simply invokes logout() to be called. 
-     */
-    public void testLogout_00_0() throws Exception {
-        // No modules configured - must fail in both login() and logout()
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        try {
-            lc.logout();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * Calling logout() on a context that had login() called, but is still not 
-     * logged in must be successful - as it just invokes logout() for modules 
-     */
-    public void testLogout_00_1() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGIN;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        lc.logout();
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * Calling logout() on a context which had no login() called - must fail.
-     */
-    public void testLogout_00_2() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        try {
-            lc.logout();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        assertEquals(0, TestLoginModule.size());
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * An exception thrown from inside logout() must not stop calls to other logout()s.
-     */
-    public void testLogout_01() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGOUT;
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        try {
-            lc.logout();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-        assertEquals(2, TestLoginModule.size());
-        assertTrue(TestLoginModule.get(0).logoutCalled);
-        assertTrue(TestLoginModule.get(1).logoutCalled);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * It must rethrow LoginException thrown from the logout()
-     */
-    public void testLogout_02() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGOUT;
-        TestLoginModule.staticLE = new LoginException();
-
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        try {
-            lc.logout();
-            fail("must not pass here");
-        } catch (LoginException le) {
-            assertSame(TestLoginModule.staticLE, le);
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * It must wrap RuntimeExceptions into LoginException
-     */
-    public void testLogout_03() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGOUT;
-        TestLoginModule.staticRE = new RuntimeException();
-
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        try {
-            lc.logout();
-            fail("must not pass here");
-        } catch (LoginException le) {
-            // ok
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.logout()<br>
-     * It must wrap Errors into LoginException
-     */
-    public void testLogout_04() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGOUT;
-        TestLoginModule.staticERR = new Error();
-
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        try {
-            lc.logout();
-            fail("must not pass here");
-        } catch (LoginException le) {
-            // ok
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.getSubject()<br>
-     * Must return null if no subject was provided by user an no login attempt 
-     * was made.
-     */
-    public void testGetSubject_00() throws Exception {
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        assertNull(lc.getSubject());
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.getSubject()<br>
-     * Must return subject created after succesful login.
-     */
-    public void testGetSubject_01() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule_Success");
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        lc.login();
-        assertNotNull(lc.getSubject());
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests LoginContext.getSubject()<br>
-     * Must return null until succesful login().
-     */
-    public void testGetSubject_02() throws Exception {
-        TestConfig.addInstalledRequired("TestLoginModule");
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGIN;
-        LoginContext lc = new LoginContext(CONFIG_NAME);
-        assertNull(lc.getSubject());
-        try {
-            lc.login();
-        } catch (LoginException _) {
-            // ok
-        }
-        assertNull(lc.getSubject());
-        TestLoginModule.staticMask = 0;
-        lc.login();
-        Subject saveSubject = lc.getSubject();
-        assertNotNull(saveSubject);
-        // Must return the same subject on subsequent calls
-        lc.logout();
-        lc.login();
-        assertSame(lc.getSubject(), saveSubject);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests context usage.
-     * Case 0: If no Config provided by user, then LoginContext uses 
-     * its own context to invoke LoginModule's methods.
-     */
-    public void testContextUsage_0() throws Exception {
-        Subject dummySubj = new Subject();
-        final DomainCombiner dc = new SubjectDomainCombiner(dummySubj);
-        AccessControlContext acc = new AccessControlContext(AccessController
-                .getContext(), dc);
-        PrivilegedExceptionAction action = new PrivilegedExceptionAction() {
-            public Object run() throws Exception {
-                implTestContextUsage(true, dc);
-                return null;
-            }
-        };
-        AccessController.doPrivileged(action, acc);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * Tests context usage.
-     * Case 1: If Config was provided by user, then LoginContext 
-     * uses stored user's context and performs all call to LoginModule's 
-     * methods in that context.
-     */
-    public void testContextUsage_1() throws Exception {
-        Subject dummySubj = new Subject();
-        final DomainCombiner dc = new SubjectDomainCombiner(dummySubj);
-        AccessControlContext acc = new AccessControlContext(AccessController
-                .getContext(), dc);
-        PrivilegedExceptionAction action = new PrivilegedExceptionAction() {
-            public Object run() throws Exception {
-                implTestContextUsage(false, dc);
-                return null;
-            }
-        };
-        AccessController.doPrivileged(action, acc);
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    static boolean TestLoginModule_Contexted_staticDone = false;
-
-    static boolean TestCallbackHandler_Contexted_staticDone = false;
-
-    /**
-     * A special-purpose CallbackHandler<br>
-     * with the following abilities:<br>
-     * <il>
-     * <li>it shows whether its class was initialized or not (via the external 
-     * variable <code>boolean TestCallbackHandler_Contexted_staticDone</code>)
-     * 
-     * <li>keeps track of the active security contexts for each operation - 
-     * static{}, ctor(), handle()
-     * </il> 
-     */
-    public static class TestCallbackHandler_Contexted extends
-            TestCallbackHandler {
-        public static AccessControlContext accStatic;
-
-        public AccessControlContext accCtor;
-
-        public AccessControlContext accHandle;
-
-        static {
-            accStatic = AccessController.getContext();
-            TestCallbackHandler_Contexted_staticDone = true;
-        }
-
-        /**
-         * Provides an easy access to the first CallbackHandler created.
-         */
-        public static TestCallbackHandler_Contexted item() {
-            return (TestCallbackHandler_Contexted) instances.get(0);
-        }
-
-        TestCallbackHandler_Contexted() {
-            super();
-            accCtor = AccessController.getContext();
-        }
-
-        public void handle(Callback[] cbs) {
-            accHandle = AccessController.getContext();
-        }
-    }
-
-    /**
-     * A special-purpose LoginModule<br>
-     * with the following features:<br>
-     * <il>
-     * <li>it shows whether its class was initialized or not (via the external 
-     * variable <code>boolean TestLoginModule_Contexted_staticDone</code>)
-     * 
-     * <li>keeps track of the active security contexts for each operation - 
-     * static{}, ctor(), initialize/login/commit/logout/abort
-     * 
-     * <li>it also invokes callback handler (if any) during its login() method
-     * </il> 
-     */
-    public static class TestLoginModule_Contexted extends TestLoginModule {
-        public static AccessControlContext accStatic;
-        static {
-            accStatic = AccessController.getContext();
-            TestLoginModule_Contexted_staticDone = true;
-        }
-
-        /**
-         * Provides an easy access to instances of 
-         * TestLoginModule_Contexted_staticDone.
-         */
-        public static TestLoginModule_Contexted item(int i) {
-            return (TestLoginModule_Contexted) TestLoginModule.get(i);
-        }
-
-        /**
-         * Provides an easy access to the very first instance of 
-         * TestLoginModule_Contexted_staticDone.
-         */
-        public static TestLoginModule_Contexted item() {
-            return item(0);
-        }
-        // Below are AccessControlContext-s for the appropriate operations:
-        public AccessControlContext accCtor;
-
-        public AccessControlContext accInit;
-
-        public AccessControlContext accLogin;
-
-        public AccessControlContext accCommit;
-
-        public AccessControlContext accLogout;
-
-        public AccessControlContext accAbort;
-
-        public TestLoginModule_Contexted() {
-            super();
-            accCtor = AccessController.getContext();
-        }
-
-        public void initialize(Subject subject,
-                CallbackHandler callbackHandler, Map sharedState, Map options) {
-            accInit = AccessController.getContext();
-            super.initialize(subject, callbackHandler, sharedState, options);
-        }
-
-        public boolean login() throws LoginException {
-            accLogin = AccessController.getContext();
-            if (cbHandler != null) {
-                try {
-                    cbHandler.handle(null);
-                } catch (UnsupportedCallbackException _) {
-                    throw (LoginException) new LoginException().initCause(_);
-                } catch (IOException _) {
-                    throw (LoginException) new LoginException().initCause(_);
-                }
-            }
-            return super.login();
-        }
-
-        public boolean commit() throws LoginException {
-            accCommit = AccessController.getContext();
-            return super.commit();
-        }
-
-        public boolean logout() throws LoginException {
-            accLogout = AccessController.getContext();
-            return super.logout();
-        }
-
-        public boolean abort() throws LoginException {
-            accAbort = AccessController.getContext();
-            return super.abort();
-        }
-    }
-    /**
-     * The real implementatio of TestContextUsage_0 and TestContextUsage_1 
-     * methods.
-     * @param useInstalledConfig
-     * @param dc - which domain combiner to test for
-     * @throws Exception
-     */
-    private void implTestContextUsage(boolean useInstalledConfig,
-            DomainCombiner dc) throws Exception {
-
-        // the class was not loaded/initialized yet. it's legal to test statics
-        boolean checkModuleStatic = !TestLoginModule_Contexted_staticDone;
-        boolean checkCBHandlerStatic = !TestCallbackHandler_Contexted_staticDone;
-        //        //_FIXME: debug
-        //        if( checkModuleStatic ) {
-        //            System.err.println("module static was checked. r u happy ? "+useInstalledConfig);
-        //        }
-        //        if( checkCBHandlerStatic ) {
-        //            System.err.println("handler static was checked. r u happy ? "+useInstalledConfig);
-        //        }
-        //        //~fixme
-        TestConfig.addInstalledRequired("TestLoginModule_Contexted");
-
-        //
-        //CallbackHandler cbHandler = new TestCallbackHandler_Contexted();
-        // The property will be cleared at setUp()
-        Security.setProperty(DEFAULT_CBHANDLER_PROPERTY,
-                getGlobalClassName("TestCallbackHandler_Contexted"));
-
-        LoginContext lc = new LoginContext(CONFIG_NAME, null, null,
-                useInstalledConfig ? null : TestConfig.get());
-        lc.login();
-        lc.logout();
-        //
-        assertEquals(1, TestCallbackHandler.size());
-
-        // now, get abort() called
-        TestLoginModule.staticMask = TestLoginModule.FAIL_AT_LOGIN;
-        try {
-            lc.login();
-            fail("must not pass here");
-        } catch (LoginException _) {
-            // gut
-        }
-
-        DomainCombiner match = useInstalledConfig ? null : dc;
-        //
-        if (checkModuleStatic) {
-            assertSame(TestLoginModule_Contexted.accStatic.getDomainCombiner(),
-                    match);
-        }
-        //
-        assertSame(
-                TestLoginModule_Contexted.item().accCtor.getDomainCombiner(),
-                match);
-        //
-        assertSame(
-                TestLoginModule_Contexted.item().accInit.getDomainCombiner(),
-                match);
-        //
-        assertSame(TestLoginModule_Contexted.item().accLogin
-                .getDomainCombiner(), match);
-        //
-        assertSame(TestLoginModule_Contexted.item().accCommit
-                .getDomainCombiner(), match);
-        //
-        assertSame(TestLoginModule_Contexted.item().accLogout
-                .getDomainCombiner(), match);
-        //
-        assertSame(TestLoginModule_Contexted.item().accAbort
-                .getDomainCombiner(), match);
-
-        // handle() must be called from the wrapper, so it must be 'dc' and not 
-        // 'match' here  
-        assertSame(TestCallbackHandler_Contexted.item().accHandle
-                .getDomainCombiner(), dc);
-
-        // ctor() for the Handler is called somewhere in 
-        // LoginContext.LoginContext().
-        // It seems it's always get called from inside the powerful context 
-        // of LoginContext, so it's always 'null' here - they seem to use 
-        // doPriv(action) there
-        assertSame(TestCallbackHandler_Contexted.item().accCtor
-                .getDomainCombiner(), null);
-
-        if (useInstalledConfig) {
-            assertNotNull(TestLoginModule_Contexted.item().cbHandler);
-            assertNotSame(TestCallbackHandler_Contexted.item(),
-                    TestLoginModule_Contexted.item().cbHandler);
-
-            if (checkCBHandlerStatic) {
-                assertSame(TestCallbackHandler_Contexted.accStatic
-                        .getDomainCombiner(), match);
-            }
-        } else {
-            assertSame(TestCallbackHandler_Contexted.item(),
-                    TestLoginModule_Contexted.item().cbHandler);
-        }
-    }
-
-    /** 
-     * Just a small helper function which takes a list of AuthPermission
-     * instances and looks up through it for the given <code>name</code>. 
-     * @return <code>true</code> is the name is in the list, 
-     * <code>false</code> otherwise. 
-     */
-    private static boolean lookupAuthPermission(ArrayList al, String name) {
-        for (int i = 0; i < al.size(); i++) {
-            Permission p = (Permission) al.get(i);
-            if (p instanceof AuthPermission && name.equals(p.getName())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Tests for the proper usage of SecurityManager.
-     */
-    public void testSecurityManagerUsage() throws Exception {
-        // 1. create a special-purpose SecurityManager which keeps track 
-        // of Permissions checked
-        final ArrayList requests = new ArrayList();
-        // a list of permissions allowed - just to make sure I'll be able to 
-        // set security manager back.
-        final ArrayList allowedPerms = new ArrayList();
-        //
-        allowedPerms.add(new RuntimePermission("setIO"));
-        allowedPerms.add(new RuntimePermission("setSecurityManager"));
-        //
-        SecurityManager sm = new SecurityManager() {
-            public void checkPermission(Permission p) {
-                requests.add(p);
-                for (int i = 0; i < allowedPerms.size(); i++) {
-                    Permission good = (Permission) allowedPerms.get(i);
-                    if (good.equals(p)) {
-                        return;
-                    }
-                }
-                super.checkPermission(p);
-            }
-        };
-        // 2. Prepare a low-priority ProtectionDomain, and then run all the 
-        // tests in this PD. This need to be done, as the test's class normally 
-        // reside in the system pd, so all sm.checkXXX() will succeed which is
-        // not good for the goals of the test.
-        CodeSource cs = new CodeSource(new URL(
-                "http://127.0.0.1/no/such/path/i/do/believe."),
-                (java.security.cert.Certificate[]) null);
-        // the returned is empty set of permissions
-        PermissionCollection pc = Policy.getPolicy().getPermissions(cs);
-        ProtectionDomain[] pds = new ProtectionDomain[] { new ProtectionDomain(
-                cs, pc) };
-        AccessControlContext acc = new AccessControlContext(pds);
-
-        try {
-            System.setSecurityManager(sm);
-
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    implTestSecurityManagerUsage(requests, allowedPerms);
-                    return null;
-                }
-            }, acc);
-        } finally {
-            System.setSecurityManager(null);
-        }
-        // additional cleanup to make it PerfTests compatible
-        clear();
-    }
-
-    /**
-     * The real machinery of the testSecurityManagerUsage.<br>
-     * Tests that the appropriate AuthPermission(createLoginContext.${name})
-     * and AuthPermission(createLoginContext.other) get checked in the 
-     * proper order.
-     * @param requests
-     * @param allowedPerms
-     */
-    private void implTestSecurityManagerUsage(ArrayList requests,
-            ArrayList allowedPerms) {
-        String configPermName = "createLoginContext." + CONFIG_NAME;
-        String otherPermName = "createLoginContext.other";
-        String dummyName = "no such name";
-        String dummyPermName = "createLoginContext." + dummyName;
-
-        try {
-            new LoginContext(CONFIG_NAME);
-            fail("must not pass here");
-        } catch (LoginException _) {
-            fail("no, no, no. Throw SecurityException instead");
-        } catch (SecurityException se) {
-            // gut
-        }
-        // the real CONFIG must be requested
-        assertTrue(lookupAuthPermission(requests, configPermName));
-        // 'other' must not
-        assertFalse(lookupAuthPermission(requests, otherPermName));
-        //
-        // now check whether 'other' was also checked
-        //
-        requests.clear();
-        allowedPerms.add(new AuthPermission(dummyPermName));
-        try {
-            new LoginContext(dummyName);
-            fail("must not pass here - 1.");
-        } catch (LoginException _) {
-            fail("no, no, no. Throw SecurityException instead");
-        } catch (SecurityException se) {
-            // gut
-        }
-        // both must be checked
-        assertTrue(lookupAuthPermission(requests, dummyPermName));
-        assertTrue(lookupAuthPermission(requests, otherPermName));
-    }
-
-}
+/*
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+* @author Alexander V. Astapchuk
+* @version $Revision$
+*/
+
+package javax.security.auth.login;
+
+import java.io.IOException;
+import java.net.URL;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.CodeSource;
+import java.security.DomainCombiner;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Policy;
+import java.security.PrivilegedExceptionAction;
+import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
+import java.security.Security;
+
+import javax.security.auth.AuthPermission;
+import javax.security.auth.Subject;
+import javax.security.auth.SubjectDomainCombiner;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.spi.LoginModule;
+
+import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Unit tests for LoginContext
+ */
+public class LoginContextTest_1 extends TestCase {
+
+    private static final String CONFIG_NAME = "testConfiguration";
+
+    private static final String DEFAULT_CBHANDLER_PROPERTY = "auth.login.defaultCallbackHandler";
+
+    private static final int OPTIONAL = 0;
+
+    private static final int REQUIRED = 1;
+
+    private static final int REQUISITE = 2;
+
+    private static final int SUFFICIENT = 3;
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(LoginContextTest_1.class);
+    }
+
+    /**
+     * Converts short (local) class names (like TestLoginModule) into the 
+     * global (fully qualified) ones.<br>
+     * For example:<br>
+     * TestLoginModule => javax.security.auth.login.LoginContextTest$TestLoginModule
+     * @param shortName
+     * @return fully qualified name
+     */
+    private static String getGlobalClassName(String shortName) {
+        return LoginContextTest_1.class.getName() + "$" + shortName;
+    }
+
+    /**
+     * Maps an integer value into appropriate LoginModuleControlFlag.
+     * @param flag
+     * @return
+     */
+    private static LoginModuleControlFlag mapControlFlag(int flag) {
+        switch (flag) {
+        case OPTIONAL:
+            return LoginModuleControlFlag.OPTIONAL;
+        case REQUIRED:
+            return LoginModuleControlFlag.REQUIRED;
+        case REQUISITE:
+            return LoginModuleControlFlag.REQUISITE;
+        case SUFFICIENT:
+            return LoginModuleControlFlag.SUFFICIENT;
+        }
+        throw new Error("Unknown flag:" + flag);
+    }
+
+    /**
+     * A special purpose Configuration.<br>
+     * Special functions are:<br>
+     * <il>
+     * <li>it keeps track of the configuration names requested via 
+     * getAppConfigurationEntry - see {@link #wasTheNameQueried(String)}
+     * <li>can dynamically add modules - see 
+     * add{Optional|Required|Requisite|Sufficient}
+     * <li>with a presumption that the statically installed Configuration 
+     * is also of type TestConfig, allows to dynamically add modules to that
+     * installed Configuration - see addInstalled{*}.
+     * <li>can handle several Configurations with a different names for the 
+     * {@link #getAppConfigurationEntry(String)} - see 
+     * {@link #addConfig(String, Configuration)} (again, with a presumption that
+     * the Configuration.getConfiguration() is instanceof TestConfig )  
+     * </il>
+     */
+    private static final class TestConfig extends Configuration {
+        private String name;
+
+        private ArrayList entries = new ArrayList();
+
+        // A map 'name'=>'some specific configuration'
+        private HashMap configs = new HashMap();
+
+        // An array which keeps track of the configuration names requested.
+        private ArrayList requests = new ArrayList();
+
+        public TestConfig() {
+        }
+
+        public TestConfig(String name) {
+            this.name = name;
+        }
+

[... 2074 lines stripped ...]