8151654: Additional modular test for "auth.login.defaultCallbackHandler"
Reviewed-by: mchung, weijun
This commit is contained in:
parent
d39fdb1811
commit
1e34f70a1d
@ -63,8 +63,7 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
"TestSecurityProviderClient.java");
|
"TestSecurityProviderClient.java");
|
||||||
private static final String C_PKG = "client";
|
private static final String C_PKG = "client";
|
||||||
private static final String C_JAR_NAME = C_PKG + JAR_EXTN;
|
private static final String C_JAR_NAME = C_PKG + JAR_EXTN;
|
||||||
private static final String MC_DEPENDS_ON_AUTO_SERVICE_JAR_NAME = MODULAR
|
private static final String MCN_JAR_NAME = MODULAR + C_PKG + "N" + JAR_EXTN;
|
||||||
+ C_PKG + AUTO + JAR_EXTN;
|
|
||||||
private static final String MC_JAR_NAME = MODULAR + C_PKG + JAR_EXTN;
|
private static final String MC_JAR_NAME = MODULAR + C_PKG + JAR_EXTN;
|
||||||
|
|
||||||
private static final Path BUILD_DIR = Paths.get(".").resolve("build");
|
private static final Path BUILD_DIR = Paths.get(".").resolve("build");
|
||||||
@ -72,7 +71,7 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
private static final Path S_BUILD_DIR = COMPILE_DIR.resolve(S_PKG);
|
private static final Path S_BUILD_DIR = COMPILE_DIR.resolve(S_PKG);
|
||||||
private static final Path S_WITH_META_DESCR_BUILD_DIR = COMPILE_DIR.resolve(
|
private static final Path S_WITH_META_DESCR_BUILD_DIR = COMPILE_DIR.resolve(
|
||||||
S_PKG + DESCRIPTOR);
|
S_PKG + DESCRIPTOR);
|
||||||
private static final Path C_BUILD_DIR = COMPILE_DIR.resolve(C_PKG);
|
private static final Path C_BLD_DIR = COMPILE_DIR.resolve(C_PKG);
|
||||||
private static final Path M_BASE_PATH = BUILD_DIR.resolve("mbase");
|
private static final Path M_BASE_PATH = BUILD_DIR.resolve("mbase");
|
||||||
private static final Path ARTIFACTS_DIR = BUILD_DIR.resolve("artifacts");
|
private static final Path ARTIFACTS_DIR = BUILD_DIR.resolve("artifacts");
|
||||||
|
|
||||||
@ -88,8 +87,7 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
private static final Path C_ARTIFACTS_DIR = ARTIFACTS_DIR.resolve(C_PKG);
|
private static final Path C_ARTIFACTS_DIR = ARTIFACTS_DIR.resolve(C_PKG);
|
||||||
private static final Path C_JAR = C_ARTIFACTS_DIR.resolve(C_JAR_NAME);
|
private static final Path C_JAR = C_ARTIFACTS_DIR.resolve(C_JAR_NAME);
|
||||||
private static final Path MC_JAR = C_ARTIFACTS_DIR.resolve(MC_JAR_NAME);
|
private static final Path MC_JAR = C_ARTIFACTS_DIR.resolve(MC_JAR_NAME);
|
||||||
private static final Path MC_DEPENDS_ON_AUTO_SERVICE_JAR = C_ARTIFACTS_DIR
|
private static final Path MCN_JAR = C_ARTIFACTS_DIR.resolve(MCN_JAR_NAME);
|
||||||
.resolve(MC_DEPENDS_ON_AUTO_SERVICE_JAR_NAME);
|
|
||||||
|
|
||||||
private static final String MAIN = C_PKG + ".TestSecurityProviderClient";
|
private static final String MAIN = C_PKG + ".TestSecurityProviderClient";
|
||||||
private static final String S_INTERFACE = "java.security.Provider";
|
private static final String S_INTERFACE = "java.security.Provider";
|
||||||
@ -102,8 +100,6 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
|
|
||||||
private static final boolean WITH_S_DESCR = true;
|
private static final boolean WITH_S_DESCR = true;
|
||||||
private static final boolean WITHOUT_S_DESCR = false;
|
private static final boolean WITHOUT_S_DESCR = false;
|
||||||
private static final String CLASS_NOT_FOUND_MSG = "NoClassDefFoundError:"
|
|
||||||
+ " provider/TestSecurityProvider";
|
|
||||||
private static final String PROVIDER_NOT_FOUND_MSG = "Unable to find Test"
|
private static final String PROVIDER_NOT_FOUND_MSG = "Unable to find Test"
|
||||||
+ " Security Provider";
|
+ " Security Provider";
|
||||||
private static final String CAN_NOT_ACCESS_MSG = "cannot access class";
|
private static final String CAN_NOT_ACCESS_MSG = "cannot access class";
|
||||||
@ -126,10 +122,10 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
boolean useCLoader = CLASS_LOADER.equals(mechanism);
|
boolean useCLoader = CLASS_LOADER.equals(mechanism);
|
||||||
boolean useSLoader = SERVICE_LOADER.equals(mechanism);
|
boolean useSLoader = SERVICE_LOADER.equals(mechanism);
|
||||||
String[] args = new String[]{mechanism};
|
String[] args = new String[]{mechanism};
|
||||||
//PARAMETER ORDERS -
|
// PARAMETER ORDERS -
|
||||||
//client Module Type, Service Module Type,
|
// Client Module Type, Service Module Type,
|
||||||
//Service META Descriptor Required,
|
// If Service META Descriptor Required,
|
||||||
//Expected Failure message, mech used to find the provider
|
// Expected Failure message, mechanism used to find the provider
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
||||||
@ -138,7 +134,8 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
WITH_S_DESCR, ((useCLoader) ? CAN_NOT_ACCESS_MSG
|
WITH_S_DESCR, ((useCLoader) ? CAN_NOT_ACCESS_MSG
|
||||||
: NO_FAILURE), args));
|
: NO_FAILURE), args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
||||||
WITHOUT_S_DESCR, CLASS_NOT_FOUND_MSG, args));
|
WITHOUT_S_DESCR, ((useCLoader) ? CAN_NOT_ACCESS_MSG
|
||||||
|
: PROVIDER_NOT_FOUND_MSG), args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
||||||
WITH_S_DESCR, ((useCLoader) ? CAN_NOT_ACCESS_MSG
|
WITH_S_DESCR, ((useCLoader) ? CAN_NOT_ACCESS_MSG
|
||||||
: NO_FAILURE), args));
|
: NO_FAILURE), args));
|
||||||
@ -150,11 +147,12 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.EXPLICIT,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.EXPLICIT,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.EXPLICIT,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.EXPLICIT,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITHOUT_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
||||||
WITHOUT_S_DESCR, CLASS_NOT_FOUND_MSG, args));
|
WITHOUT_S_DESCR,
|
||||||
|
(useCLoader) ? NO_FAILURE : PROVIDER_NOT_FOUND_MSG, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
||||||
@ -168,7 +166,8 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
||||||
WITHOUT_S_DESCR, CLASS_NOT_FOUND_MSG, args));
|
WITHOUT_S_DESCR,
|
||||||
|
(useCLoader) ? NO_FAILURE : PROVIDER_NOT_FOUND_MSG, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
||||||
@ -191,22 +190,23 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
done &= CompilerUtils.compile(S_SRC, S_BUILD_DIR);
|
done &= CompilerUtils.compile(S_SRC, S_BUILD_DIR);
|
||||||
done &= CompilerUtils.compile(S_SRC, S_WITH_META_DESCR_BUILD_DIR);
|
done &= CompilerUtils.compile(S_SRC, S_WITH_META_DESCR_BUILD_DIR);
|
||||||
done &= createMetaInfServiceDescriptor(S_META_DESCR_FPATH, S_IMPL);
|
done &= createMetaInfServiceDescriptor(S_META_DESCR_FPATH, S_IMPL);
|
||||||
//Generate regular/modular jars with(out) META-INF
|
// Generate modular/regular jars with(out) META-INF
|
||||||
//Service descriptor
|
// service descriptor
|
||||||
generateJar(true, MODULE_TYPE.EXPLICIT, MS_JAR, S_BUILD_DIR, false);
|
generateJar(true, MODULE_TYPE.EXPLICIT, MS_JAR, S_BUILD_DIR, false);
|
||||||
generateJar(true, MODULE_TYPE.EXPLICIT, MS_WITH_DESCR_JAR,
|
generateJar(true, MODULE_TYPE.EXPLICIT, MS_WITH_DESCR_JAR,
|
||||||
S_WITH_META_DESCR_BUILD_DIR, false);
|
S_WITH_META_DESCR_BUILD_DIR, false);
|
||||||
generateJar(true, MODULE_TYPE.UNNAMED, S_JAR, S_BUILD_DIR, false);
|
generateJar(true, MODULE_TYPE.UNNAMED, S_JAR, S_BUILD_DIR, false);
|
||||||
generateJar(true, MODULE_TYPE.UNNAMED, S_WITH_DESCRIPTOR_JAR,
|
generateJar(true, MODULE_TYPE.UNNAMED, S_WITH_DESCRIPTOR_JAR,
|
||||||
S_WITH_META_DESCR_BUILD_DIR, false);
|
S_WITH_META_DESCR_BUILD_DIR, false);
|
||||||
//Generate regular/modular(depends on explicit/auto Service)
|
// Compile client source codes.
|
||||||
//jars for client
|
done &= CompilerUtils.compile(C_SRC, C_BLD_DIR, "-cp",
|
||||||
done &= CompilerUtils.compile(C_SRC, C_BUILD_DIR, "-cp",
|
|
||||||
S_JAR.toFile().getCanonicalPath());
|
S_JAR.toFile().getCanonicalPath());
|
||||||
generateJar(false, MODULE_TYPE.EXPLICIT, MC_JAR, C_BUILD_DIR, true);
|
// Generate modular client jar with explicit dependency
|
||||||
generateJar(false, MODULE_TYPE.EXPLICIT,
|
generateJar(false, MODULE_TYPE.EXPLICIT, MC_JAR, C_BLD_DIR, true);
|
||||||
MC_DEPENDS_ON_AUTO_SERVICE_JAR, C_BUILD_DIR, false);
|
// Generate modular client jar without any dependency
|
||||||
generateJar(false, MODULE_TYPE.UNNAMED, C_JAR, C_BUILD_DIR, false);
|
generateJar(false, MODULE_TYPE.EXPLICIT, MCN_JAR, C_BLD_DIR, false);
|
||||||
|
// Generate regular client jar
|
||||||
|
generateJar(false, MODULE_TYPE.UNNAMED, C_JAR, C_BLD_DIR, false);
|
||||||
System.out.format("%nArtifacts generated successfully? %s", done);
|
System.out.format("%nArtifacts generated successfully? %s", done);
|
||||||
if (!done) {
|
if (!done) {
|
||||||
throw new RuntimeException("Artifacts generation failed");
|
throw new RuntimeException("Artifacts generation failed");
|
||||||
@ -244,10 +244,9 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
|
|
||||||
OutputAnalyzer output = null;
|
OutputAnalyzer output = null;
|
||||||
try {
|
try {
|
||||||
|
// For automated/explicit module types, copy the corresponding
|
||||||
//For automated/explicit module type copy the corresponding
|
// jars to module base folder, which will be considered as
|
||||||
//jars to module base folder, which will be considered as
|
// module base path during execution.
|
||||||
//module base path during execution.
|
|
||||||
if (!(cModuleType == MODULE_TYPE.UNNAMED
|
if (!(cModuleType == MODULE_TYPE.UNNAMED
|
||||||
&& sModuletype == MODULE_TYPE.UNNAMED)) {
|
&& sModuletype == MODULE_TYPE.UNNAMED)) {
|
||||||
copyJarsToModuleBase(cModuleType, cJarPath, M_BASE_PATH);
|
copyJarsToModuleBase(cModuleType, cJarPath, M_BASE_PATH);
|
||||||
@ -262,15 +261,14 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
String cPath = buildClassPath(cModuleType, cJarPath, sModuletype,
|
String cPath = buildClassPath(cModuleType, cJarPath, sModuletype,
|
||||||
sJarPath);
|
sJarPath);
|
||||||
|
|
||||||
Map<String, String> VM_ARGS = getVMArgs(sModuletype, args);
|
Map<String, String> vmArgs = getVMArgs(sModuletype,
|
||||||
|
getModuleName(sModuletype, sJarPath, S_PKG), args);
|
||||||
output = ProcessTools.executeTestJava(
|
output = ProcessTools.executeTestJava(
|
||||||
getJavaCommand(cmBasePath, cPath, mName, MAIN, VM_ARGS,
|
getJavaCommand(cmBasePath, cPath, mName, MAIN, vmArgs,
|
||||||
args)).outputTo(System.out).errorTo(System.out);
|
args)).outputTo(System.out).errorTo(System.out);
|
||||||
} finally {
|
} finally {
|
||||||
//clean module path so that the modulepath can hold only
|
// Clean module path to hold required jars for next run.
|
||||||
//the required jars for next run.
|
|
||||||
cleanModuleBasePath(M_BASE_PATH);
|
cleanModuleBasePath(M_BASE_PATH);
|
||||||
System.out.println("--------------------------------------------");
|
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@ -297,11 +295,12 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Choose corresponding client jar to use dependent module
|
||||||
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
||||||
if (dependsOnServiceModule) {
|
if (dependsOnServiceModule) {
|
||||||
return MC_JAR;
|
return MC_JAR;
|
||||||
} else {
|
} else {
|
||||||
return MC_DEPENDS_ON_AUTO_SERVICE_JAR;
|
return MCN_JAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return C_JAR;
|
return C_JAR;
|
||||||
@ -313,13 +312,16 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
* VM argument required for the test.
|
* VM argument required for the test.
|
||||||
*/
|
*/
|
||||||
private Map<String, String> getVMArgs(MODULE_TYPE sModuletype,
|
private Map<String, String> getVMArgs(MODULE_TYPE sModuletype,
|
||||||
String... args) throws IOException {
|
String addModName, String... args) throws IOException {
|
||||||
final Map<String, String> VM_ARGS = new LinkedHashMap<>();
|
final Map<String, String> vmArgs = new LinkedHashMap<>();
|
||||||
VM_ARGS.put("-Duser.language=", "en");
|
vmArgs.put("-Duser.language=", "en");
|
||||||
VM_ARGS.put("-Duser.region=", "US");
|
vmArgs.put("-Duser.region=", "US");
|
||||||
//If mechanism selected to find the provider through
|
if (addModName != null && sModuletype == MODULE_TYPE.AUTO) {
|
||||||
//Security.getProvider() then use providerName/ProviderClassName based
|
vmArgs.put("-addmods ", addModName);
|
||||||
//on modular/regular provider jar in security configuration file.
|
}
|
||||||
|
// If mechanism selected to find the provider through
|
||||||
|
// Security.getProvider() then use providerName/ProviderClassName based
|
||||||
|
// on modular/regular provider jar in security configuration file.
|
||||||
if (args != null && args.length > 0 && SECURITY_PROP.equals(args[0])) {
|
if (args != null && args.length > 0 && SECURITY_PROP.equals(args[0])) {
|
||||||
if (sModuletype == MODULE_TYPE.UNNAMED) {
|
if (sModuletype == MODULE_TYPE.UNNAMED) {
|
||||||
Files.write(SECURE_PROP_EXTN, ("security.provider.10=" + S_IMPL)
|
Files.write(SECURE_PROP_EXTN, ("security.provider.10=" + S_IMPL)
|
||||||
@ -328,10 +330,10 @@ public class SecurityProviderModularTest extends ModularTest {
|
|||||||
Files.write(SECURE_PROP_EXTN, "security.provider.10=TEST"
|
Files.write(SECURE_PROP_EXTN, "security.provider.10=TEST"
|
||||||
.getBytes());
|
.getBytes());
|
||||||
}
|
}
|
||||||
VM_ARGS.put("-Djava.security.properties=", SECURE_PROP_EXTN.toFile()
|
vmArgs.put("-Djava.security.properties=", SECURE_PROP_EXTN.toFile()
|
||||||
.getCanonicalPath());
|
.getCanonicalPath());
|
||||||
}
|
}
|
||||||
return VM_ARGS;
|
return vmArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ public abstract class ModularTest {
|
|||||||
|
|
||||||
String testName = new StringJoiner("_").add(cModuleType.toString())
|
String testName = new StringJoiner("_").add(cModuleType.toString())
|
||||||
.add(sModuletype.toString()).add(
|
.add(sModuletype.toString()).add(
|
||||||
(addMetaDesc) ? "DESCRIPTOR" : "NO_DESCRIPTOR")
|
(addMetaDesc) ? "WITH_SERVICE" : "NO_SERVICE")
|
||||||
.toString();
|
.toString();
|
||||||
|
|
||||||
System.out.format("%nStarting Test case: '%s'", testName);
|
System.out.format("%nStarting Test case: '%s'", testName);
|
||||||
@ -165,10 +165,12 @@ public abstract class ModularTest {
|
|||||||
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
||||||
System.out.format(" %nGenerating ModuleDescriptor object");
|
System.out.format(" %nGenerating ModuleDescriptor object");
|
||||||
builder = new Builder(moduleName).exports(pkg);
|
builder = new Builder(moduleName).exports(pkg);
|
||||||
if (isService) {
|
if (isService && serviceInterface != null && serviceImpl != null) {
|
||||||
builder.provides(serviceInterface, serviceImpl);
|
builder.provides(serviceInterface, serviceImpl);
|
||||||
} else {
|
} else {
|
||||||
builder.uses(serviceInterface);
|
if (serviceInterface != null) {
|
||||||
|
builder.uses(serviceInterface);
|
||||||
|
}
|
||||||
if (depends) {
|
if (depends) {
|
||||||
builder.requires(serviceModuleName);
|
builder.requires(serviceModuleName);
|
||||||
}
|
}
|
||||||
@ -261,7 +263,7 @@ public abstract class ModularTest {
|
|||||||
String jarName = jarPath.toFile().getName();
|
String jarName = jarPath.toFile().getName();
|
||||||
return (moduleType == MODULE_TYPE.EXPLICIT) ? mName
|
return (moduleType == MODULE_TYPE.EXPLICIT) ? mName
|
||||||
: ((moduleType == MODULE_TYPE.AUTO) ? jarName.substring(0,
|
: ((moduleType == MODULE_TYPE.AUTO) ? jarName.substring(0,
|
||||||
jarName.indexOf(JAR_EXTN)) : "");
|
jarName.indexOf(JAR_EXTN)) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
package login;
|
||||||
|
|
||||||
|
import java.security.Principal;
|
||||||
|
import javax.security.auth.login.LoginContext;
|
||||||
|
import javax.security.auth.login.LoginException;
|
||||||
|
import com.sun.security.auth.UnixPrincipal;
|
||||||
|
|
||||||
|
public class JaasClientWithDefaultHandler {
|
||||||
|
|
||||||
|
private static final String USER_NAME = "testUser";
|
||||||
|
private static final String LOGIN_CONTEXT = "ModularLoginConf";
|
||||||
|
private static final String CBH_PROP = "auth.login.defaultCallbackHandler";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
java.security.Security.setProperty(CBH_PROP, args[0]);
|
||||||
|
LoginContext lc = new LoginContext(LOGIN_CONTEXT);
|
||||||
|
lc.login();
|
||||||
|
checkPrincipal(lc, true);
|
||||||
|
lc.logout();
|
||||||
|
checkPrincipal(lc, false);
|
||||||
|
} catch (LoginException le) {
|
||||||
|
throw new RuntimeException(le);
|
||||||
|
}
|
||||||
|
System.out.println("Test passed.");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Verify principal for the test user.
|
||||||
|
*/
|
||||||
|
private static void checkPrincipal(LoginContext loginContext,
|
||||||
|
boolean principalShouldExist) {
|
||||||
|
if (!principalShouldExist) {
|
||||||
|
if (loginContext.getSubject().getPrincipals().size() != 0) {
|
||||||
|
throw new RuntimeException("Test failed. Principal was not "
|
||||||
|
+ "cleared.");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (Principal p : loginContext.getSubject().getPrincipals()) {
|
||||||
|
if (p instanceof UnixPrincipal
|
||||||
|
&& USER_NAME.equals(p.getName())) {
|
||||||
|
//Proper principal was found, return.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException("Test failed. UnixPrincipal "
|
||||||
|
+ USER_NAME + " expected.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -59,8 +59,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
private static final Path C_SRC = SRC.resolve("JaasClient.java");
|
private static final Path C_SRC = SRC.resolve("JaasClient.java");
|
||||||
private static final String C_PKG = "client";
|
private static final String C_PKG = "client";
|
||||||
private static final String C_JAR_NAME = C_PKG + JAR_EXTN;
|
private static final String C_JAR_NAME = C_PKG + JAR_EXTN;
|
||||||
private static final String MC_DEPENDS_ON_AUTO_SERVICE_JAR_NAME = MODULAR
|
private static final String MCN_JAR_NAME = MODULAR + C_PKG + "N" + JAR_EXTN;
|
||||||
+ C_PKG + AUTO + JAR_EXTN;
|
|
||||||
private static final String MC_JAR_NAME = MODULAR + C_PKG + JAR_EXTN;
|
private static final String MC_JAR_NAME = MODULAR + C_PKG + JAR_EXTN;
|
||||||
|
|
||||||
private static final Path BUILD_DIR = Paths.get(".").resolve("build");
|
private static final Path BUILD_DIR = Paths.get(".").resolve("build");
|
||||||
@ -68,7 +67,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
private static final Path S_BUILD_DIR = COMPILE_DIR.resolve(S_PKG);
|
private static final Path S_BUILD_DIR = COMPILE_DIR.resolve(S_PKG);
|
||||||
private static final Path S_WITH_META_DESCR_BUILD_DIR = COMPILE_DIR.resolve(
|
private static final Path S_WITH_META_DESCR_BUILD_DIR = COMPILE_DIR.resolve(
|
||||||
S_PKG + DESCRIPTOR);
|
S_PKG + DESCRIPTOR);
|
||||||
private static final Path C_BUILD_DIR = COMPILE_DIR.resolve(C_PKG);
|
private static final Path C_BLD_DIR = COMPILE_DIR.resolve(C_PKG);
|
||||||
private static final Path M_BASE_PATH = BUILD_DIR.resolve("mbase");
|
private static final Path M_BASE_PATH = BUILD_DIR.resolve("mbase");
|
||||||
private static final Path ARTIFACTS_DIR = BUILD_DIR.resolve("artifacts");
|
private static final Path ARTIFACTS_DIR = BUILD_DIR.resolve("artifacts");
|
||||||
|
|
||||||
@ -83,8 +82,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
private static final Path C_ARTIFACTS_DIR = ARTIFACTS_DIR.resolve(C_PKG);
|
private static final Path C_ARTIFACTS_DIR = ARTIFACTS_DIR.resolve(C_PKG);
|
||||||
private static final Path C_JAR = C_ARTIFACTS_DIR.resolve(C_JAR_NAME);
|
private static final Path C_JAR = C_ARTIFACTS_DIR.resolve(C_JAR_NAME);
|
||||||
private static final Path MC_JAR = C_ARTIFACTS_DIR.resolve(MC_JAR_NAME);
|
private static final Path MC_JAR = C_ARTIFACTS_DIR.resolve(MC_JAR_NAME);
|
||||||
private static final Path MC_DEPENDS_ON_AUTO_SERVICE_JAR = C_ARTIFACTS_DIR
|
private static final Path MCN_JAR = C_ARTIFACTS_DIR.resolve(MCN_JAR_NAME);
|
||||||
.resolve(MC_DEPENDS_ON_AUTO_SERVICE_JAR_NAME);
|
|
||||||
|
|
||||||
private static final String MAIN = C_PKG + ".JaasClient";
|
private static final String MAIN = C_PKG + ".JaasClient";
|
||||||
private static final String S_INTERFACE
|
private static final String S_INTERFACE
|
||||||
@ -99,10 +97,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
|
|
||||||
private static final boolean WITH_S_DESCR = true;
|
private static final boolean WITH_S_DESCR = true;
|
||||||
private static final boolean WITHOUT_S_DESCR = false;
|
private static final boolean WITHOUT_S_DESCR = false;
|
||||||
private static final String LOGIN_MODULE_NOT_FOUND_MSG
|
|
||||||
= "No LoginModule found";
|
|
||||||
private static final String NO_FAILURE = null;
|
private static final String NO_FAILURE = null;
|
||||||
private static final Map<String, String> VM_ARGS = new LinkedHashMap<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates Test specific input parameters.
|
* Generates Test specific input parameters.
|
||||||
@ -112,10 +107,10 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
|
|
||||||
List<List<Object>> params = new ArrayList<>();
|
List<List<Object>> params = new ArrayList<>();
|
||||||
String[] args = new String[]{};
|
String[] args = new String[]{};
|
||||||
//PARAMETER ORDERS -
|
// PARAMETER ORDERS -
|
||||||
//client Module Type, Service Module Type,
|
// Client Module Type, Service Module Type,
|
||||||
//Service META Descriptor Required,
|
// If Service META descriptor Required,
|
||||||
//Expected Failure message, mechanism used to find the provider
|
// Expected Failure message, Client arguments
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
||||||
@ -123,7 +118,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
||||||
WITHOUT_S_DESCR, LOGIN_MODULE_NOT_FOUND_MSG, args));
|
WITHOUT_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
||||||
@ -136,7 +131,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
||||||
WITHOUT_S_DESCR, LOGIN_MODULE_NOT_FOUND_MSG, args));
|
WITHOUT_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
||||||
@ -149,7 +144,7 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
||||||
WITHOUT_S_DESCR, LOGIN_MODULE_NOT_FOUND_MSG, args));
|
WITHOUT_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
||||||
WITH_S_DESCR, NO_FAILURE, args));
|
WITH_S_DESCR, NO_FAILURE, args));
|
||||||
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
||||||
@ -166,29 +161,25 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
|
|
||||||
boolean done = true;
|
boolean done = true;
|
||||||
try {
|
try {
|
||||||
VM_ARGS.put("-Duser.language=", "en");
|
|
||||||
VM_ARGS.put("-Duser.region", "US");
|
|
||||||
VM_ARGS.put("-Djava.security.auth.login.config=", SRC.resolve(
|
|
||||||
"jaas.conf").toFile().getCanonicalPath());
|
|
||||||
|
|
||||||
done = CompilerUtils.compile(S_SRC, S_BUILD_DIR);
|
done = CompilerUtils.compile(S_SRC, S_BUILD_DIR);
|
||||||
done &= CompilerUtils.compile(S_SRC, S_WITH_META_DESCR_BUILD_DIR);
|
done &= CompilerUtils.compile(S_SRC, S_WITH_META_DESCR_BUILD_DIR);
|
||||||
done &= createMetaInfServiceDescriptor(S_META_DESCR_FPATH, S_IMPL);
|
done &= createMetaInfServiceDescriptor(S_META_DESCR_FPATH, S_IMPL);
|
||||||
//Generate regular/modular jars with(out) META-INF
|
// Generate modular/regular jars with(out) META-INF
|
||||||
//service descriptor
|
// service descriptor
|
||||||
generateJar(true, MODULE_TYPE.EXPLICIT, MS_JAR, S_BUILD_DIR, false);
|
generateJar(true, MODULE_TYPE.EXPLICIT, MS_JAR, S_BUILD_DIR, false);
|
||||||
generateJar(true, MODULE_TYPE.EXPLICIT, MS_WITH_DESCR_JAR,
|
generateJar(true, MODULE_TYPE.EXPLICIT, MS_WITH_DESCR_JAR,
|
||||||
S_WITH_META_DESCR_BUILD_DIR, false);
|
S_WITH_META_DESCR_BUILD_DIR, false);
|
||||||
generateJar(true, MODULE_TYPE.UNNAMED, S_JAR, S_BUILD_DIR, false);
|
generateJar(true, MODULE_TYPE.UNNAMED, S_JAR, S_BUILD_DIR, false);
|
||||||
generateJar(true, MODULE_TYPE.UNNAMED, S_WITH_DESCRIPTOR_JAR,
|
generateJar(true, MODULE_TYPE.UNNAMED, S_WITH_DESCRIPTOR_JAR,
|
||||||
S_WITH_META_DESCR_BUILD_DIR, false);
|
S_WITH_META_DESCR_BUILD_DIR, false);
|
||||||
//Generate regular/modular(depends on explicit/auto service)
|
// Compile client source codes.
|
||||||
//jars for client
|
done &= CompilerUtils.compile(C_SRC, C_BLD_DIR);
|
||||||
done &= CompilerUtils.compile(C_SRC, C_BUILD_DIR);
|
// Generate modular client jar with explicit dependency
|
||||||
generateJar(false, MODULE_TYPE.EXPLICIT, MC_JAR, C_BUILD_DIR, true);
|
generateJar(false, MODULE_TYPE.EXPLICIT, MC_JAR, C_BLD_DIR, true);
|
||||||
generateJar(false, MODULE_TYPE.EXPLICIT,
|
// Generate modular client jar without any dependency
|
||||||
MC_DEPENDS_ON_AUTO_SERVICE_JAR, C_BUILD_DIR, false);
|
generateJar(false, MODULE_TYPE.EXPLICIT, MCN_JAR, C_BLD_DIR, false);
|
||||||
generateJar(false, MODULE_TYPE.UNNAMED, C_JAR, C_BUILD_DIR, false);
|
// Generate regular client jar
|
||||||
|
generateJar(false, MODULE_TYPE.UNNAMED, C_JAR, C_BLD_DIR, false);
|
||||||
System.out.format("%nArtifacts generated successfully? %s", done);
|
System.out.format("%nArtifacts generated successfully? %s", done);
|
||||||
if (!done) {
|
if (!done) {
|
||||||
throw new RuntimeException("Artifact generation failed");
|
throw new RuntimeException("Artifact generation failed");
|
||||||
@ -226,9 +217,9 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
|
|
||||||
OutputAnalyzer output = null;
|
OutputAnalyzer output = null;
|
||||||
try {
|
try {
|
||||||
//For automated/explicit module type copy the corresponding
|
// For automated/explicit module types, copy the corresponding
|
||||||
//jars to module base folder, which will be considered as
|
// jars to module base folder, which will be considered as
|
||||||
//module base path during execution.
|
// module base path during execution.
|
||||||
if (!(cModuleType == MODULE_TYPE.UNNAMED
|
if (!(cModuleType == MODULE_TYPE.UNNAMED
|
||||||
&& sModuletype == MODULE_TYPE.UNNAMED)) {
|
&& sModuletype == MODULE_TYPE.UNNAMED)) {
|
||||||
copyJarsToModuleBase(cModuleType, cJarPath, M_BASE_PATH);
|
copyJarsToModuleBase(cModuleType, cJarPath, M_BASE_PATH);
|
||||||
@ -237,20 +228,19 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
|
|
||||||
System.out.format("%nExecuting java client with required"
|
System.out.format("%nExecuting java client with required"
|
||||||
+ " custom service in class/module path.");
|
+ " custom service in class/module path.");
|
||||||
String mName = getModuleName(cModuleType, cJarPath,
|
String mName = getModuleName(cModuleType, cJarPath, C_PKG);
|
||||||
C_PKG);
|
|
||||||
Path cmBasePath = (cModuleType != MODULE_TYPE.UNNAMED
|
Path cmBasePath = (cModuleType != MODULE_TYPE.UNNAMED
|
||||||
|| sModuletype != MODULE_TYPE.UNNAMED) ? M_BASE_PATH : null;
|
|| sModuletype != MODULE_TYPE.UNNAMED) ? M_BASE_PATH : null;
|
||||||
String cPath = buildClassPath(cModuleType, cJarPath, sModuletype,
|
String cPath = buildClassPath(cModuleType, cJarPath, sModuletype,
|
||||||
sJarPath);
|
sJarPath);
|
||||||
|
Map<String, String> vmArgs = getVMArgs(sModuletype,
|
||||||
|
getModuleName(sModuletype, sJarPath, S_PKG));
|
||||||
output = ProcessTools.executeTestJava(
|
output = ProcessTools.executeTestJava(
|
||||||
getJavaCommand(cmBasePath, cPath, mName, MAIN, VM_ARGS,
|
getJavaCommand(cmBasePath, cPath, mName, MAIN, vmArgs,
|
||||||
args)).outputTo(System.out).errorTo(System.out);
|
args)).outputTo(System.out).errorTo(System.out);
|
||||||
} finally {
|
} finally {
|
||||||
//clean module path so that the modulepath can hold only
|
// Clean module path to hold required jars for next run.
|
||||||
//the required jars for next run.
|
|
||||||
cleanModuleBasePath(M_BASE_PATH);
|
cleanModuleBasePath(M_BASE_PATH);
|
||||||
System.out.println("--------------------------------------------");
|
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@ -260,9 +250,9 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
* based on client/service module type.
|
* based on client/service module type.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Path findJarPath(boolean service, MODULE_TYPE moduleType,
|
public Path findJarPath(boolean isService, MODULE_TYPE moduleType,
|
||||||
boolean addMetaDesc, boolean dependsOnServiceModule) {
|
boolean addMetaDesc, boolean dependsOnServiceModule) {
|
||||||
if (service) {
|
if (isService) {
|
||||||
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
||||||
if (addMetaDesc) {
|
if (addMetaDesc) {
|
||||||
return MS_WITH_DESCR_JAR;
|
return MS_WITH_DESCR_JAR;
|
||||||
@ -277,11 +267,12 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Choose corresponding client jar using dependent module
|
||||||
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
||||||
if (dependsOnServiceModule) {
|
if (dependsOnServiceModule) {
|
||||||
return MC_JAR;
|
return MC_JAR;
|
||||||
} else {
|
} else {
|
||||||
return MC_DEPENDS_ON_AUTO_SERVICE_JAR;
|
return MCN_JAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return C_JAR;
|
return C_JAR;
|
||||||
@ -289,4 +280,20 @@ public class JaasModularClientTest extends ModularTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VM argument required for the test.
|
||||||
|
*/
|
||||||
|
private Map<String, String> getVMArgs(MODULE_TYPE sModuletype,
|
||||||
|
String addModName) throws IOException {
|
||||||
|
final Map<String, String> vmArgs = new LinkedHashMap<>();
|
||||||
|
vmArgs.put("-Duser.language=", "en");
|
||||||
|
vmArgs.put("-Duser.region=", "US");
|
||||||
|
vmArgs.put("-Djava.security.auth.login.config=", SRC.resolve(
|
||||||
|
"jaas.conf").toFile().getCanonicalPath());
|
||||||
|
if (addModName != null && sModuletype == MODULE_TYPE.AUTO) {
|
||||||
|
vmArgs.put("-addmods ", addModName);
|
||||||
|
}
|
||||||
|
return vmArgs;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.module.ModuleDescriptor;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import jdk.testlibrary.ProcessTools;
|
||||||
|
import jdk.testlibrary.OutputAnalyzer;
|
||||||
|
import org.testng.annotations.BeforeTest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @bug 8151654
|
||||||
|
* @library /lib/testlibrary
|
||||||
|
* @library /java/security/modules
|
||||||
|
* @build CompilerUtils JarUtils
|
||||||
|
* @summary Test custom JAAS callback handler with all possible modular option.
|
||||||
|
* @run testng JaasModularDefaultHandlerTest
|
||||||
|
*/
|
||||||
|
public class JaasModularDefaultHandlerTest extends ModularTest {
|
||||||
|
|
||||||
|
private static final Path S_SRC = SRC.resolve("TestCallbackHandler.java");
|
||||||
|
private static final String MODULAR = "M";
|
||||||
|
private static final String S_PKG = "handler";
|
||||||
|
private static final String S_JAR_NAME = S_PKG + JAR_EXTN;
|
||||||
|
private static final String MS_JAR_NAME = MODULAR + S_PKG + JAR_EXTN;
|
||||||
|
private static final String HANDLER = S_PKG + ".TestCallbackHandler";
|
||||||
|
|
||||||
|
private static final Path C_SRC
|
||||||
|
= SRC.resolve("JaasClientWithDefaultHandler.java");
|
||||||
|
private static final Path CL_SRC = SRC.resolve("TestLoginModule.java");
|
||||||
|
private static final String C_PKG = "login";
|
||||||
|
private static final String C_JAR_NAME = C_PKG + JAR_EXTN;
|
||||||
|
private static final String MCN_JAR_NAME
|
||||||
|
= MODULAR + C_PKG + "NoMUse" + JAR_EXTN;
|
||||||
|
private static final String MC_JAR_NAME = MODULAR + C_PKG + JAR_EXTN;
|
||||||
|
|
||||||
|
private static final Path BUILD_DIR = Paths.get(".").resolve("build");
|
||||||
|
private static final Path COMPILE_DIR = BUILD_DIR.resolve("bin");
|
||||||
|
private static final Path S_BUILD_DIR = COMPILE_DIR.resolve(S_PKG);
|
||||||
|
private static final Path C_BLD_DIR = COMPILE_DIR.resolve(C_PKG);
|
||||||
|
private static final Path M_BASE_PATH = BUILD_DIR.resolve("mbase");
|
||||||
|
private static final Path ARTIFACTS_DIR = BUILD_DIR.resolve("artifacts");
|
||||||
|
|
||||||
|
private static final Path S_ARTIFACTS_DIR = ARTIFACTS_DIR.resolve(S_PKG);
|
||||||
|
private static final Path S_JAR = S_ARTIFACTS_DIR.resolve(S_JAR_NAME);
|
||||||
|
private static final Path MS_JAR = S_ARTIFACTS_DIR.resolve(MS_JAR_NAME);
|
||||||
|
|
||||||
|
private static final Path C_ARTIFACTS_DIR = ARTIFACTS_DIR.resolve(C_PKG);
|
||||||
|
private static final Path C_JAR = C_ARTIFACTS_DIR.resolve(C_JAR_NAME);
|
||||||
|
private static final Path MC_JAR = C_ARTIFACTS_DIR.resolve(MC_JAR_NAME);
|
||||||
|
private static final Path MCN_JAR = C_ARTIFACTS_DIR.resolve(MCN_JAR_NAME);
|
||||||
|
|
||||||
|
private static final String MAIN = C_PKG + ".JaasClientWithDefaultHandler";
|
||||||
|
private static final List<String> M_REQUIRED = Arrays.asList("java.base",
|
||||||
|
"jdk.security.auth");
|
||||||
|
|
||||||
|
private static final String CLASS_NOT_FOUND_MSG
|
||||||
|
= "java.lang.ClassNotFoundException: handler.TestCallbackHandler";
|
||||||
|
private static final String NO_FAILURE = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates Test specific input parameters.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object[][] getTestInput() {
|
||||||
|
|
||||||
|
List<List<Object>> params = new ArrayList<>();
|
||||||
|
String[] args = new String[]{HANDLER};
|
||||||
|
// PARAMETER ORDERS -
|
||||||
|
// Client Module Type, Service Module Type,
|
||||||
|
// Service META Descriptor Required,
|
||||||
|
// Expected Failure message, Client arguments
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.EXPLICIT,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.AUTO,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.EXPLICIT, MODULE_TYPE.UNNAMED,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.EXPLICIT,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.AUTO, MODULE_TYPE.UNNAMED,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.EXPLICIT,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.AUTO,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
params.add(Arrays.asList(MODULE_TYPE.UNNAMED, MODULE_TYPE.UNNAMED,
|
||||||
|
false, NO_FAILURE, args));
|
||||||
|
return params.stream().map(p -> p.toArray()).toArray(Object[][]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pre-compile and generate the artifacts required to run this test before
|
||||||
|
* running each test cases.
|
||||||
|
*/
|
||||||
|
@BeforeTest
|
||||||
|
public void buildArtifacts() {
|
||||||
|
|
||||||
|
boolean done = true;
|
||||||
|
try {
|
||||||
|
done = CompilerUtils.compile(S_SRC, S_BUILD_DIR);
|
||||||
|
// Generate modular/regular handler jars.
|
||||||
|
generateJar(true, MODULE_TYPE.EXPLICIT, MS_JAR, S_BUILD_DIR, false);
|
||||||
|
generateJar(true, MODULE_TYPE.UNNAMED, S_JAR, S_BUILD_DIR, false);
|
||||||
|
// Compile client source codes.
|
||||||
|
done &= CompilerUtils.compile(C_SRC, C_BLD_DIR);
|
||||||
|
done &= CompilerUtils.compile(CL_SRC, C_BLD_DIR);
|
||||||
|
// Generate modular client jar with explicit dependency
|
||||||
|
generateJar(false, MODULE_TYPE.EXPLICIT, MC_JAR, C_BLD_DIR, true);
|
||||||
|
// Generate modular client jar without any dependency
|
||||||
|
generateJar(false, MODULE_TYPE.EXPLICIT, MCN_JAR, C_BLD_DIR, false);
|
||||||
|
// Generate regular client jar
|
||||||
|
generateJar(false, MODULE_TYPE.UNNAMED, C_JAR, C_BLD_DIR, false);
|
||||||
|
System.out.format("%nArtifacts generated successfully? %s", done);
|
||||||
|
if (!done) {
|
||||||
|
throw new RuntimeException("Artifact generation failed");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate modular/regular jar based on module type for this test.
|
||||||
|
*/
|
||||||
|
private void generateJar(boolean isService, MODULE_TYPE moduleType,
|
||||||
|
Path jar, Path compilePath, boolean depends) throws IOException {
|
||||||
|
|
||||||
|
ModuleDescriptor mDescriptor = null;
|
||||||
|
if (isService) {
|
||||||
|
mDescriptor = generateModuleDescriptor(isService, moduleType, S_PKG,
|
||||||
|
S_PKG, null, null, null, M_REQUIRED, depends);
|
||||||
|
} else {
|
||||||
|
mDescriptor = generateModuleDescriptor(isService, moduleType, C_PKG,
|
||||||
|
C_PKG, null, null, S_PKG, M_REQUIRED, depends);
|
||||||
|
}
|
||||||
|
generateJar(mDescriptor, jar, compilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds Logic for the test client. This method will get called with each
|
||||||
|
* test parameter.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public OutputAnalyzer executeTestClient(MODULE_TYPE cModuleType,
|
||||||
|
Path cJarPath, MODULE_TYPE sModuletype, Path sJarPath,
|
||||||
|
String... args) throws Exception {
|
||||||
|
|
||||||
|
OutputAnalyzer output = null;
|
||||||
|
try {
|
||||||
|
// For automated/explicit module types, copy the corresponding
|
||||||
|
// jars to module base folder, which will be considered as
|
||||||
|
// module base path during execution.
|
||||||
|
if (!(cModuleType == MODULE_TYPE.UNNAMED
|
||||||
|
&& sModuletype == MODULE_TYPE.UNNAMED)) {
|
||||||
|
copyJarsToModuleBase(cModuleType, cJarPath, M_BASE_PATH);
|
||||||
|
copyJarsToModuleBase(sModuletype, sJarPath, M_BASE_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.format("%nExecuting java client with required"
|
||||||
|
+ " custom service in class/module path.");
|
||||||
|
String mName = getModuleName(cModuleType, cJarPath, C_PKG);
|
||||||
|
Path cmBasePath = (cModuleType != MODULE_TYPE.UNNAMED
|
||||||
|
|| sModuletype != MODULE_TYPE.UNNAMED) ? M_BASE_PATH : null;
|
||||||
|
String cPath = buildClassPath(cModuleType, cJarPath, sModuletype,
|
||||||
|
sJarPath);
|
||||||
|
Map<String, String> vmArgs = getVMArgs(sModuletype, cModuleType,
|
||||||
|
getModuleName(sModuletype, sJarPath, S_PKG));
|
||||||
|
output = ProcessTools.executeTestJava(
|
||||||
|
getJavaCommand(cmBasePath, cPath, mName, MAIN, vmArgs,
|
||||||
|
args)).outputTo(System.out).errorTo(System.out);
|
||||||
|
} finally {
|
||||||
|
// Clean module path to hold required jars for next run.
|
||||||
|
cleanModuleBasePath(M_BASE_PATH);
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decide the pre-generated client/service jar path for each test case
|
||||||
|
* based on client/service module type.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Path findJarPath(boolean depends, MODULE_TYPE moduleType,
|
||||||
|
boolean addMetaDesc, boolean dependsOnServiceModule) {
|
||||||
|
if (depends) {
|
||||||
|
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
||||||
|
return MS_JAR;
|
||||||
|
} else {
|
||||||
|
return S_JAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Choose corresponding client jar using dependent module
|
||||||
|
if (moduleType == MODULE_TYPE.EXPLICIT) {
|
||||||
|
if (dependsOnServiceModule) {
|
||||||
|
return MC_JAR;
|
||||||
|
} else {
|
||||||
|
return MCN_JAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return C_JAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VM argument required for the test.
|
||||||
|
*/
|
||||||
|
private Map<String, String> getVMArgs(MODULE_TYPE sModuletype,
|
||||||
|
MODULE_TYPE cModuleType, String addModName) throws IOException {
|
||||||
|
final Map<String, String> vmArgs = new LinkedHashMap<>();
|
||||||
|
vmArgs.put("-Duser.language=", "en");
|
||||||
|
vmArgs.put("-Duser.region=", "US");
|
||||||
|
vmArgs.put("-Djava.security.auth.login.config=", SRC.resolve(
|
||||||
|
"jaas.conf").toFile().getCanonicalPath());
|
||||||
|
if (addModName != null
|
||||||
|
&& !(cModuleType == MODULE_TYPE.EXPLICIT
|
||||||
|
&& sModuletype == MODULE_TYPE.EXPLICIT)) {
|
||||||
|
vmArgs.put("-addmods ", addModName);
|
||||||
|
}
|
||||||
|
return vmArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
package handler;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import javax.security.auth.callback.Callback;
|
||||||
|
import javax.security.auth.callback.CallbackHandler;
|
||||||
|
import javax.security.auth.callback.NameCallback;
|
||||||
|
import javax.security.auth.callback.PasswordCallback;
|
||||||
|
import javax.security.auth.callback.UnsupportedCallbackException;
|
||||||
|
|
||||||
|
public class TestCallbackHandler implements CallbackHandler {
|
||||||
|
|
||||||
|
private static final String USER_NAME = "testUser";
|
||||||
|
private static final String PASSWORD = "testPassword";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(Callback[] callbacks) throws IOException,
|
||||||
|
UnsupportedCallbackException {
|
||||||
|
System.out.println("TestCallbackHandler will get resolved through"
|
||||||
|
+ " auth.login.defaultCallbackHandler property.");
|
||||||
|
for (Callback callback : callbacks) {
|
||||||
|
if (callback instanceof NameCallback) {
|
||||||
|
((NameCallback) callback).setName(USER_NAME);
|
||||||
|
} else if (callback instanceof PasswordCallback) {
|
||||||
|
((PasswordCallback) callback).setPassword(
|
||||||
|
PASSWORD.toCharArray());
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedCallbackException(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user