--- /dev/null 2015-07-25 05:49:27.889711346 -0700 +++ new/test/java/security/jigsaw/jaas/JaasModularClientTest.java 2015-10-13 23:00:06.983945642 -0700 @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2015, 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.lang.module.ModuleDescriptor; +import jdk.testlibrary.ProcessTools; +import jdk.testlibrary.OutputAnalyzer; + +/** + * @test + * @bug 8078813 + * @library /jdk/jigsaw/lib + * @library /lib/testlibrary + * @library /java/security/jigsaw + * @summary Test custom JAAS module with all possible modular option. The test + * includes different combination of JAAS client/login modules + * interaction with or without service description. The different + * module types used here are, + * STRICT - Modules have module descriptor(module-info.java) defining + * the module. + * AUTO - Are regular jar files but provided in MODULE_PATH instead + * of CLASS_PATH. + * UNNAMED - Are regular jar but provided through CLASS_PATH. + * @run main JaasModularClientTest + */ +public class JaasModularClientTest extends JigsawCommon { + + private static final String TEST_SRC = System.getProperty("test.src"); + private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); + private static final String SERVICE_MODULE_NAME = "jaasloginmodule"; + private static final Path SERVICE_SRC_DIR + = SRC_DIR.resolve(SERVICE_MODULE_NAME); + private static final String SERVICE_PKG = "login"; + private static final String SERVICE_JAR = SERVICE_PKG + ".jar"; + private static final String CLIENT_MODULE_NAME = "jaasclientmodule"; + private static final Path CLIENT_SRC_DIR + = SRC_DIR.resolve(CLIENT_MODULE_NAME); + private static final String CLIENT_PKG = "client"; + private static final String CLIENT_JAR = CLIENT_PKG + ".jar"; + private static final String JAR_DIR = "jar"; + private static final String JAR_MODULE = "jarmodule"; + private static final Path BUILD_DIR = Paths.get(".").resolve("build"); + private static final String MAIN_CLASS = CLIENT_PKG + ".JaasClient"; + private static final String LOGIN_SERVICE_INTERFACE + = "javax.security.auth.spi.LoginModule"; + private static final String SERVICE_IMPL = SERVICE_PKG + ".TestLoginModule"; + private static final List REQUIRED_MODULES + = Arrays.asList("java.base", "jdk.security.auth"); + private static final Path META_SERVICE_DESCRIPTOR + = Paths.get("META-INF").resolve("services") + .resolve(LOGIN_SERVICE_INTERFACE); + private static final boolean WITH_SERVICE_DESCRIPTOR = true; + private static final boolean WITHOUT_SERVICE_DESCRIPTOR = false; + private static final boolean PASS = true; + private static final String EXPECTED_FAILURE = "No LoginModule found"; + private static final String NO_FAILURE = null; + private static final Map VM_ARGS = new LinkedHashMap<>(); + + public static void main(String[] args) { + + boolean success = true; + + //PARAMETER ORDERS - + //client Module Type, Service Module Type, + //Service META Descriptor Required, Expected Result + success &= runTest(MODULE_TYPE.STRICT, MODULE_TYPE.STRICT, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.STRICT, MODULE_TYPE.STRICT, + WITHOUT_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.STRICT, MODULE_TYPE.AUTO, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.STRICT, MODULE_TYPE.AUTO, + WITHOUT_SERVICE_DESCRIPTOR, PASS, EXPECTED_FAILURE); + success &= runTest(MODULE_TYPE.STRICT, MODULE_TYPE.UN_NAMED, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.STRICT, MODULE_TYPE.UN_NAMED, + WITHOUT_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + + success &= runTest(MODULE_TYPE.AUTO, MODULE_TYPE.STRICT, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.AUTO, MODULE_TYPE.STRICT, + WITHOUT_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.AUTO, MODULE_TYPE.AUTO, + WITHOUT_SERVICE_DESCRIPTOR, PASS, EXPECTED_FAILURE); + success &= runTest(MODULE_TYPE.AUTO, MODULE_TYPE.UN_NAMED, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.AUTO, MODULE_TYPE.UN_NAMED, + WITHOUT_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + + success &= runTest(MODULE_TYPE.UN_NAMED, MODULE_TYPE.STRICT, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.UN_NAMED, MODULE_TYPE.STRICT, + WITHOUT_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.UN_NAMED, MODULE_TYPE.AUTO, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.UN_NAMED, MODULE_TYPE.AUTO, + WITHOUT_SERVICE_DESCRIPTOR, PASS, EXPECTED_FAILURE); + success &= runTest(MODULE_TYPE.UN_NAMED, MODULE_TYPE.UN_NAMED, + WITH_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + success &= runTest(MODULE_TYPE.UN_NAMED, MODULE_TYPE.UN_NAMED, + WITHOUT_SERVICE_DESCRIPTOR, PASS, NO_FAILURE); + + if (!success) { + throw new RuntimeException("Atleast one test failed."); + } + } + + public static boolean runTest(MODULE_TYPE clientModuleType, + MODULE_TYPE serviceModuletype, boolean addMetaInfDescriptor, + boolean expectedResult, String expectedFailure) { + + boolean result = true; + try { + VM_ARGS.put("-Djava.security.auth.login.config=", + (CLIENT_SRC_DIR.resolve(CLIENT_PKG).resolve("jaas.conf") + .toRealPath().toString())); + + String baseFolderName = (clientModuleType + "_") + + (serviceModuletype + "_") + + ((addMetaInfDescriptor) ? "DESCRIPTOR" : "NO_DESCRIPTOR"); + Path baseFolderPath = BUILD_DIR.resolve(baseFolderName); + Path clientCompilePath = baseFolderPath.resolve(CLIENT_MODULE_NAME); + Path serviceCompilePath + = baseFolderPath.resolve(SERVICE_MODULE_NAME); + Path jarPath = baseFolderPath.resolve(JAR_DIR); + Path clientJarFilePath + = (clientModuleType != MODULE_TYPE.UN_NAMED) + ? jarPath.resolve(JAR_MODULE).resolve(CLIENT_JAR) + : jarPath.resolve(CLIENT_JAR); + Path serviceJarFilePath + = (serviceModuletype != MODULE_TYPE.UN_NAMED) + ? jarPath.resolve(JAR_MODULE).resolve(SERVICE_JAR) + : jarPath.resolve(SERVICE_JAR); + System.out.println(String.format( + "Started Test case type '%s'", baseFolderName)); + + ModuleDescriptor serviceModuleDescriptor + = generateServiceModuleDescriptor(serviceModuletype, + SERVICE_MODULE_NAME, SERVICE_PKG, + LOGIN_SERVICE_INTERFACE, SERVICE_IMPL, + REQUIRED_MODULES); + ModuleDescriptor clientModuleDescriptor + = generateClientModuleDescriptor( + clientModuleType, serviceModuletype, + CLIENT_MODULE_NAME, CLIENT_PKG, + LOGIN_SERVICE_INTERFACE, SERVICE_MODULE_NAME, + REQUIRED_MODULES); + System.out.println(String.format( + "Service Descriptor '%s'", serviceModuleDescriptor)); + System.out.println(String.format( + "Client Descriptor '%s'", clientModuleDescriptor)); + + compileAndCreateJar(SERVICE_SRC_DIR, serviceCompilePath, + serviceJarFilePath, serviceModuleDescriptor, + addMetaInfDescriptor, SERVICE_IMPL, + META_SERVICE_DESCRIPTOR); + compileAndCreateJar(CLIENT_SRC_DIR, clientCompilePath, + clientJarFilePath, clientModuleDescriptor, + false, null, null); + + System.out.println("Started executing java client with required" + + " custom service"); + String moduleName = (clientModuleType == MODULE_TYPE.STRICT) + ? CLIENT_MODULE_NAME + : ((clientModuleType == MODULE_TYPE.AUTO) + ? CLIENT_PKG : ""); + OutputAnalyzer output = ProcessTools.executeTestJava( + getJavaCommand(clientModuleType, serviceModuletype, + clientJarFilePath, serviceJarFilePath, moduleName, + MAIN_CLASS, VM_ARGS)) + .outputTo(System.out) + .errorTo(System.out); + + if (output.getExitValue() != 0) { + if (expectedFailure != null + && output.getOutput().contains(expectedFailure)) { + System.out.println("PASS: Test is expected to fail here."); + System.out.println("------------------------------------"); + } else { + throw new RuntimeException("Unexpected failure occured."); + } + } + } catch (Exception e) { + e.printStackTrace(System.out); + result = false; + } + + return (expectedResult == result); + } + +}