1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes* @author Stepan M. Mishura
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes*/
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.auth.tests.javax.security.auth.login;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Security;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.ArrayList;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.HashMap;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Hashtable;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Map;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Properties;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.Subject;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.callback.Callback;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.callback.CallbackHandler;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.login.AppConfigurationEntry;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.login.Configuration;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.login.LoginContext;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.login.LoginException;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.spi.LoginModule;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.auth.tests.support.TestUtils;
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.Support_Exec;
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Tests LoginContext class
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class LoginContextTest extends TestCase {
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // system property to specify another login configuration file
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final String AUTH_LOGIN_CONFIG = "java.security.auth.login.config";
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final String moduleName = "moduleName";
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private final Subject subject = new Subject();
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private final MyCallbackHandler handler = new MyCallbackHandler();
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Configuration.setConfiguration(new MyConfig());
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: valid app. name
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: no exceptions
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String() throws Exception {
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // configuration contains requested login module
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName);
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Requested module", MyConfig.getLastAppName() == moduleName);
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //FIXME lazy subject initialization? should it be initialized in ctor?
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull("Instantiated subject", context.getSubject());
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null app. name)
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String_NullApp() {
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(null);
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: app. name absent in the current configuration
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String_NoApp() {
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // configuration doesn't contain requested application name
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.resetConfiguration();
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName);
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("Default module", "other", MyConfig.getLastAppName());
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: configuration contains requested login module and
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             default callback handler is specified via security
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             property but its class is not accessible
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String_InaccessibleCallbackHandler() {
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler",
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    "absentCallBackhandlerClassName");
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName);
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Default module",
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    MyConfig.getLastAppName() == moduleName);
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //FIXME how to reset security property correctly?
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: configuration contains requested login module and
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             default callback handler is specified via security
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             property but its class doesn't implement
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             CallbackHandler interface
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String_InvalidCallbackHandler() throws Exception {
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler",
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    LoginContextTest.class.getName());
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName);
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected ClassCastException");
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassCastException e) {
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //FIXME how to reset security property correctly?
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: creation of default callback handler
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String_InitCallbackHandler() throws Exception {
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checks initialization of specified callback handler
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyCallbackHandler.initialized = false;
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .setProperty("auth.login.defaultCallbackHandler",
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            MyCallbackHandler.class.getName());
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName);
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Initialization", MyCallbackHandler.initialized);
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //FIXME how to reset security property correctly?
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(java.lang.String)
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: parameters for login module initialization
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *               are created in the constructor above
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: not null subject, null callback handler or
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *           wrapped default callback handler, not null shared
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *           state and not null options.
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_String_LoginModuleInitialize() throws Exception {
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable<String, Object> options = new Hashtable<String, Object>();
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // add required module to the current configuration
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.addRequired("MyLoginModule", options);
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // reset initialized login modules list
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule.reset();
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName);
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // only one module must be created
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Number of modules", 1, MyLoginModule.list.size());
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule module = MyLoginModule.list.get(0);
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context instantiates subject object itself.
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Subject", module.subject);
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("getSubject", module.subject == context.getSubject());
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context doesn't have callback handler
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull("Handler", module.handler);
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with shared state object
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Shared state", module.sharedState);
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with module's options
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Option references", module.options != options);
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Option objects", module.options, options);
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checks initialization of specified callback handler
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule.reset();
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .setProperty("auth.login.defaultCallbackHandler",
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            MyCallbackHandler.class.getName());
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            context = new LoginContext(moduleName);
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            context.login();
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // TODO how to test default callback handler wrapping for LoginContext(java.lang.String)?
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // FIXME wrap a handler
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //assertFalse("Handler", MyLoginModule.handler.getClass().equals(
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //        MyCallbackHandler.class));
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // FIXME how to reset security property correctly?
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, CallbackHandler)
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: are valid
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: no exceptions
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringCallbackHandler() throws Exception {
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName, handler);
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Requested module", MyConfig.getLastAppName() == moduleName);
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //FIXME lazy subject initialization? should it be initialized in ctor?
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull("Instantiated subject", context.getSubject());
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, CallbackHandler)
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null app. name)
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringCallbackHandler_NullApp() {
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(null, handler);
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, CallbackHandler)
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null callback handler)
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringCallbackHandler_NullCallbackHandler() {
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, (CallbackHandler) null);
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, CallbackHandler)
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: app. name absent in the current configuration
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringCallbackHandler_NoApp() {
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // configuration doesn't contain requested application name
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.resetConfiguration();
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, handler);
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("Default module", "other", MyConfig.getLastAppName());
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, CallbackHandler)
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: configuration contains requested login module and
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             default callback handler is specified via security property
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: no default callback handler initialization
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringCallbackHandler_NoInit() throws Exception {
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checks initialization of specified callback handler
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyCallbackHandler.initialized = false;
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .setProperty("auth.login.defaultCallbackHandler",
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            MyCallbackHandler.class.getName());
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, handler);
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse("Initialization", MyCallbackHandler.initialized);
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //FIXME how to reset security property correctly?
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, CallbackHandler)
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: parameters for login module initialization
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *               are created in the constructor above
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: not null subject, wrapped provided callback handler,
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *           not null shared state and not null options.
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringCallbackHandler_LoginModuleInitialize()
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws Exception {
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable<String, Object> options = new Hashtable<String, Object>();
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // add required module to the current configuration
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.addRequired("MyLoginModule", options);
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // reset initialized login modules list
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule.reset();
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName, handler);
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // only one module must be created
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Number of modules", 1, MyLoginModule.list.size());
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule module = MyLoginModule.list.get(0);
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context instantiates subject object itself.
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Subject", module.subject);
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("getSubject", module.subject == context.getSubject());
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //  TODO how to test callback handler wrapping for LoginContext(String, CallbackHandler)?
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // FIXME wrap a handler
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //assertFalse("Handler", MyLoginModule.handler.getClass().equals(
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //        handler.getClass()));
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with shared state object
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Shared state", module.sharedState);
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with module's options
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Option references", module.options != options);
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Option objects", module.options, options);
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: are valid
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: no exceptions
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject() throws Exception {
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName, subject);
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Requested module", MyConfig.getLastAppName() == moduleName);
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Instantiated subject", context.getSubject() == subject);
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null app. name)
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject_NullApp() {
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(null, subject);
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null subject)
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject_NullSubject() {
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, (Subject) null);
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: app. name absent in the current configuration
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject_NoApp() throws Exception {
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.resetConfiguration();
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, subject);
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("Default module", "other", MyConfig.getLastAppName());
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: configuration contains requested login module and
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             default callback handler is specified via security
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *             property but its class is not accessible
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject_InaccessibleCallbackHandler() {
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler",
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    "absentCallBackhandlerClassName");
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, subject);
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Default module",
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    MyConfig.getLastAppName() == moduleName);
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // FIXME how to reset security property correctly?
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: creation of default callback handler
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject_InitCallbackHandler()
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws Exception {
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checks initialization of specified callback handler
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyCallbackHandler.initialized = false;
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .setProperty("auth.login.defaultCallbackHandler",
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            MyCallbackHandler.class.getName());
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, subject);
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Initialization", MyCallbackHandler.initialized);
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // FIXME how to reset security property correctly?
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject)
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: parameters for login module initialization
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *               are created in the constructor above
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: provided subject, null callback handler or
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *           wrapped default callback handler, not null shared
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *           state and not null options.
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubject_LoginModuleInitialize()
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws Exception {
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable<String, Object> options = new Hashtable<String, Object>();
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // add required module to the current configuration
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.addRequired("MyLoginModule", options);
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // reset initialized login modules list
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule.reset();
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName, subject);
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // only one module must be created
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Number of modules", 1, MyLoginModule.list.size());
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule module = MyLoginModule.list.get(0);
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context has provided subject
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Subject", module.subject == subject);
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("getSubject", module.subject == context.getSubject());
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context doesn't have callback handler
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull("Handler", module.handler);
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with shared state object
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Shared state", module.sharedState);
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with module's options
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Option references", module.options != options);
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Option objects", module.options, options);
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checks initialization of specified callback handler
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule.reset();
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .setProperty("auth.login.defaultCallbackHandler",
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            MyCallbackHandler.class.getName());
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            context = new LoginContext(moduleName, subject);
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            context.login();
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // TODO how to test callback handler wrapping for LoginContext(String, Subject)?
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // FIXME wrap a handler
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //assertFalse("Handler", MyLoginModule.handler.getClass().equals(
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //        MyCallbackHandler.class));
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.setProperty("auth.login.defaultCallbackHandler", "");
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject, CallbackHandler)
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: are valid
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: no exceptions
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubjectCallbackHandler() throws Exception {
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName, subject, handler);
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Requested module", MyConfig.getLastAppName() == moduleName);
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Instantiated subject", context.getSubject() == subject);
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject, CallbackHandler)
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null app. name)
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubjectCallbackHandler_NullApp() {
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(null, subject, handler);
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject, CallbackHandler)
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null subject)
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubjectCallbackHandler_NullSubject() {
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, null, handler);
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject, CallbackHandler)
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Parameters: invalid (null callback handler)
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubjectCallbackHandler_NullCallbackHandler() {
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, subject, null);
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject, CallbackHandler)
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: app. name absent in the current configuration
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubjectCallbackHandler_NoApp() {
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // configuration doesn't contain requested login module
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.resetConfiguration();
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new LoginContext(moduleName, subject, handler);
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals("Default module", "other", MyConfig.getLastAppName());
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor: LoginContext(String, Subject, CallbackHandler)
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: parameters for login module initialization
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *               are created in the constructor above
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: provided subject, wrapped default callback handler,
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *           not null shared state and not null options.
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLC_StringSubjectCallbackHandler_LoginModuleInitialize()
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws Exception {
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable<String, Object> options = new Hashtable<String, Object>();
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // add required module to the current configuration
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.addRequired("MyLoginModule", options);
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // reset initialized login modules list
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule.reset();
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName, subject, handler);
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // only one module must be created
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Number of modules", 1, MyLoginModule.list.size());
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyLoginModule module = MyLoginModule.list.get(0);
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context has provided subject
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Subject", module.subject == subject);
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("getSubject", module.subject == context.getSubject());
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //  TODO how to test callback handler wrapping for LoginContext(String, Subject, CallbackHandler)?
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // FIXME wrap a handler
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //assertFalse("Handler", MyLoginModule.handler.getClass().equals(
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //        handler.getClass()));
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with shared state object
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Shared state", module.sharedState);
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login context provides login module with module's options
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Option references", module.options != options);
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Option objects", module.options, options);
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Method: LoginContext.login()
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Precondition: returned list of login modules is empty
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Expected: LoginException
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLogin_EmptyModulesList() throws Exception {
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName);
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            context.login();
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected LoginException");
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (LoginException e) {
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Method: LoginContext.login()
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLogin_() throws Exception {
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable options = new Hashtable();
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // add required module to the current configuration
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyConfig.addRequired("MyLoginModule", options);
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext(moduleName);
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    */
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testLogout() {
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO Implement logout().
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testGetSubject() {
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO Implement getSubject().
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test failed login
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests javax.security.auth.login.LoginContext
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_LoginContext_defaultConfigProvider() throws Exception {
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test: LoginContext constructor fails because there are no config
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // files to be read (the test is modification of test case
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // in ConfigurationTest)
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // no login.config.url.N security properties should be set
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String javaSecurityFile = TestUtils
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .createJavaPropertiesFile(new Properties());
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // tmp user home to avoid presence of ${user.home}/.java.login.config
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String tmpUserHome = System.getProperty("java.io.tmpdir")
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + File.separatorChar + "tmpUserHomeForLoginContextTest";
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File dir = new File(tmpUserHome);
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (!dir.exists()) {
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            dir.mkdirs();
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            dir.deleteOnExit();
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String javaLoginConfig = tmpUserHome + File.separatorChar
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + ".java.login.config";
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("There should be no login config file: " + javaLoginConfig,
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new File(javaLoginConfig).exists());
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] arg = new String[] { "-Duser.home=" + tmpUserHome,
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "-Djava.security.properties=" + javaSecurityFile,
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NoConfigFileToBeRead.class.getName() };
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Support_Exec.execJava(arg, null, true);
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class NoConfigFileToBeRead {
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // the test is based on assumption that security properties
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // login.config.url.N are unset and there is no file
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // ${user.home}/.java.login.config
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static void main(String[] args) throws LoginException {
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //reset path to alternative configuration file
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            TestUtils.setSystemProperty(AUTH_LOGIN_CONFIG, null);
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Configuration.setConfiguration(null); // reset default config
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // Regression for HARMONY-771
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new LoginContext("0");
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("No expected SecurityException");
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (SecurityException e) {
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests javax.security.auth.login.LoginContext.login()
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_login_resourcesLeakage() throws Exception {
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // This is a compatibility test.
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // The test verifies that LoginContext allows to invoke login() method
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // multiple times without invoking logout() before. In testing scenario
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // each login() invocation adds new credentials to the passed subject.
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Configuration.setConfiguration(new Configuration() {
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            @Override
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return new AppConfigurationEntry[] { new AppConfigurationEntry(
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        MyModule.class.getName(),
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        LoginModuleControlFlag.REQUIRED,
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        new HashMap<String, Object>()) };
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            @Override
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void refresh() {
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        });
832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LoginContext context = new LoginContext("moduleName", new Subject());
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        context.login();
837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Subject subject = context.getSubject();
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(2, subject.getPrivateCredentials().size());
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(2, subject.getPublicCredentials().size());
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MyModule implements LoginModule {
845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Subject sub;
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean abort() throws LoginException {
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean commit() throws LoginException {
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            sub.getPrivateCredentials().add(new Object());
854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void initialize(Subject arg0, CallbackHandler arg1,
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Map<String, ?> arg2, Map<String, ?> arg3) {
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            sub = arg0;
860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean login() throws LoginException {
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            sub.getPublicCredentials().add(new Object());
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean logout() throws LoginException {
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static class MyConfig extends Configuration {
873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
874561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private String appName;
875561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
876561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private ArrayList<AppConfigurationEntry> entries;
877561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
878561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MyConfig() {
879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            entries = new ArrayList<AppConfigurationEntry>();
880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public AppConfigurationEntry[] getAppConfigurationEntry(String applicationName) {
884561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            appName = applicationName;
885561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (entries != null) {
886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (entries.size() == 0) {
887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return new AppConfigurationEntry[0];
888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
889561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                AppConfigurationEntry[] appEntries = new AppConfigurationEntry[entries.size()];
890561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                entries.toArray(appEntries);
891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return appEntries;
892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
894561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
895561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
896561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void refresh() {
898561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
899561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
900561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
901561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Returns the last application name requested by LoginContext constructor
902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         *
903561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @return the last application name
904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
905561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static String getLastAppName() {
906561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return ((MyConfig) Configuration.getConfiguration()).appName;
907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Reset configuration.
911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         *
912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * After invocation the configuration doesn't have login modules
913561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * and the method Configuration.getAppConfigurationEntry(String)
914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * always returns null;
915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static void resetConfiguration() {
917561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ((MyConfig) Configuration.getConfiguration()).entries = null;
918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Appends required login module to the current configuration
922561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
923561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static void addRequired(String name, Map<String, ?> options) {
924561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ArrayList<AppConfigurationEntry> list = ((MyConfig) Configuration.getConfiguration()).entries;
925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            AppConfigurationEntry entry = new AppConfigurationEntry(
927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    LoginContextTest.class.getName() + '$' + name,
928561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    options);
930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            list.add(entry);
932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MyCallbackHandler implements CallbackHandler {
936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static boolean initialized;
938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MyCallbackHandler() {
940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            initialized = true;
941561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
942561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
943561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void handle(Callback[] callbacks) {
944561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
945561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
946561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
947561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MyLoginModule implements LoginModule {
948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static ArrayList<MyLoginModule> list = new ArrayList<MyLoginModule>();
950561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static void reset() {
952561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            list = new ArrayList<MyLoginModule>();
953561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
954561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
955561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean aborted;
956561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean commited;
958561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
959561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean initialized;
960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
961561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean logined;
962561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
963561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean logouted;
964561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
965561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Subject subject;
966561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public CallbackHandler handler;
968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
969561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Map<String, ?> sharedState;
970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
971561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Map<String, ?> options;
972561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
973561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MyLoginModule() {
974561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            list.add(this);
975561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean abort() throws LoginException {
978561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (!initialized || !logined) {
980561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new AssertionError(
981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        "MUST initialize and try to login first before abort");
982561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
983561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aborted = true;
984561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
986561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
987561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean commit() throws LoginException {
988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
989561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (!initialized || !logined) {
990561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new AssertionError(
991561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        "MUST initialize and try to login first before abort");
992561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
993561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            commited = true;
994561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
995561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
996561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
997561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void initialize(Subject subject, CallbackHandler handler,
998561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Map<String, ?> sharedState, Map<String, ?> options) {
999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (logined || commited || aborted) {
1001561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new AssertionError("MUST be initialized first");
1002561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1003561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.subject = subject;
1005561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.handler = handler;
1006561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.sharedState = sharedState;
1007561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.options = options;
1008561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1009561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            initialized = true;
1010561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1011561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1012561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean login() throws LoginException {
1013561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1014561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (!initialized) {
1015561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new AssertionError("MUST be initialized first");
1016561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1017561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (commited || aborted) {
1018561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new AssertionError(
1019561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        "MUST try to login first before commit/abort");
1020561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1021561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            logined = true;
1022561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
1023561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1024561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1025561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean logout() throws LoginException {
1026561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            logouted = true;
1027561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
1028561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1029561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1030561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1031561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestLoginModule implements LoginModule {
1032561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1033561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean abort() throws LoginException {
1034561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
1035561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1036561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1037561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean commit() throws LoginException {
1038561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
1039561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1040561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1041561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void initialize(Subject arg0, CallbackHandler arg1, Map<String, ?> arg2,
1042561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Map<String, ?> arg3) {
1043561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1044561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1045561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean login() throws LoginException {
1046561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
1047561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1048561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1049561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean logout() throws LoginException {
1050561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
1051561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1052561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1053561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1054