Return-Path: Delivered-To: apmail-incubator-harmony-commits-archive@www.apache.org Received: (qmail 55118 invoked from network); 9 Jun 2006 10:57:35 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 9 Jun 2006 10:57:35 -0000 Received: (qmail 37700 invoked by uid 500); 9 Jun 2006 10:57:35 -0000 Delivered-To: apmail-incubator-harmony-commits-archive@incubator.apache.org Received: (qmail 37668 invoked by uid 500); 9 Jun 2006 10:57:34 -0000 Mailing-List: contact harmony-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: harmony-dev@incubator.apache.org Delivered-To: mailing list harmony-commits@incubator.apache.org Received: (qmail 37651 invoked by uid 99); 9 Jun 2006 10:57:34 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Jun 2006 03:57:34 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Jun 2006 03:57:31 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 98B271A9842; Fri, 9 Jun 2006 03:57:11 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r413011 [2/3] - /incubator/harmony/enhanced/classlib/trunk/modules/auth/src/test/java/common/javax/security/auth/login/LoginContextTest_1.java Date: Fri, 09 Jun 2006 10:57:10 -0000 To: harmony-commits@incubator.apache.org From: smishura@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060609105711.98B271A9842@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N 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.
- * For example:
- * 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.
- * Special functions are:
- * - *
  • it keeps track of the configuration names requested via - * getAppConfigurationEntry - see {@link #wasTheNameQueried(String)} - *
  • can dynamically add modules - see - * add{Optional|Required|Requisite|Sufficient} - *
  • with a presumption that the statically installed Configuration - * is also of type TestConfig, allows to dynamically add modules to that - * installed Configuration - see addInstalled{*}. - *
  • 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 ) - * - */ - 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.
    - * It has the following features:
    - * - *
  • 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 - * - *
  • 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 - * - *
  • it keeps track of instances created - * - *
  • each instance keeps track of which method was called - * - * - * 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}.
    - * By default, all the methods return true (success) and do not - * throw anything.
    - * The constatnts FAIL_AT_* 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.
    - * The constants FALSE_AT_* shows which method must return - * false. - * The FAIL_AT_* constants have priority before - * FALSE_AT_*
    - * Note: if an instance executes FAIL_AT_CTOR, then this - * instance do not 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 i 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.
    - * If you want the instance to use {@link #staticMask} then pass - * -1 as mask. To fail at nowhere, pass - * 0 as mask.
    - * The appropriate re, err and - * le 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).
    - * 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.
    - * 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 msk is set - either at - * instance level or on the global level and returns appropriate - * value.
    - * If this instance's mask is not set, then - * {@link #staticMask} is checked. If the staticMask is - * also not set, then the method returns true. If either - * the static mask or the instance mask is set and match the - * msk 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 - * false. - */ - 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.
    - */ - 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()
    - * 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()
    - * Second attempt to login() on context already logged, must be successful.
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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().
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * If any REQUIRED module returns false from login() - this does - * not break the overall attempt.
    - * 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()
    - * If any REQUISITE module returns false from login() - this does - * not break the overall attempt.
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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()
    - * 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
    - * with the following abilities:
    - * - *
  • it shows whether its class was initialized or not (via the external - * variable boolean TestCallbackHandler_Contexted_staticDone) - * - *
  • keeps track of the active security contexts for each operation - - * static{}, ctor(), handle() - * - */ - 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
    - * with the following features:
    - * - *
  • it shows whether its class was initialized or not (via the external - * variable boolean TestLoginModule_Contexted_staticDone) - * - *
  • keeps track of the active security contexts for each operation - - * static{}, ctor(), initialize/login/commit/logout/abort - * - *
  • it also invokes callback handler (if any) during its login() method - * - */ - 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 name. - * @return true is the name is in the list, - * false 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.
    - * 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.
    + * For example:
    + * 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.
    + * Special functions are:
    + * + *
  • it keeps track of the configuration names requested via + * getAppConfigurationEntry - see {@link #wasTheNameQueried(String)} + *
  • can dynamically add modules - see + * add{Optional|Required|Requisite|Sufficient} + *
  • with a presumption that the statically installed Configuration + * is also of type TestConfig, allows to dynamically add modules to that + * installed Configuration - see addInstalled{*}. + *
  • 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 ) + * + */ + 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 ...]