2017-11-28 04:21:34 +00:00
/ *
2020-09-13 14:45:12 +00:00
* Copyright ( c ) 2014 , 2020 , Oracle and / or its affiliates . All rights reserved .
2017-11-28 04:21:34 +00:00
* 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 .
*
* /
/ *
2017-12-04 16:59:47 +00:00
* @test
2018-04-30 20:59:05 +00:00
* @summary If - Djava . system . class . loader = xxx is specified in command - line , disable archived non - system classes
2017-12-04 16:59:47 +00:00
* @requires vm . cds
* @library / test / lib
* @compile test - classes / TestClassLoader . java
* @compile test - classes / ReportMyLoader . java
* @compile test - classes / TrySwitchMyLoader . java
2018-10-02 21:32:33 +00:00
* @run driver SpecifySysLoaderProp
2017-11-28 04:21:34 +00:00
* /
import java.io.* ;
import jdk.test.lib.process.OutputAnalyzer ;
public class SpecifySysLoaderProp {
public static void main ( String [ ] args ) throws Exception {
JarBuilder . build ( " sysloader " , " TestClassLoader " , " ReportMyLoader " , " TrySwitchMyLoader " ) ;
String jarFileName = " sysloader.jar " ;
String appJar = TestCommon . getTestJar ( jarFileName ) ;
TestCommon . testDump ( appJar , TestCommon . list ( " ReportMyLoader " ) ) ;
2023-03-10 17:11:48 +00:00
String warning = " Archived non-system classes are disabled because the java.system.class.loader property is specified " ;
2017-11-28 04:21:34 +00:00
// (0) Baseline. Do not specify -Djava.system.class.loader
// The test class should be loaded from archive
2018-02-14 15:08:25 +00:00
TestCommon . run (
2017-11-28 04:21:34 +00:00
" -verbose:class " ,
" -cp " , appJar ,
2018-02-14 15:08:25 +00:00
" ReportMyLoader " )
. assertNormalExit ( " [class,load] ReportMyLoader source: shared objects file " ,
" ReportMyLoader's loader = jdk.internal.loader.ClassLoaders$AppClassLoader@ " ) ;
2017-11-28 04:21:34 +00:00
// (1) Try to execute the archive with -Djava.system.class.loader=no.such.Klass,
// it should fail
2018-02-14 15:08:25 +00:00
TestCommon . run (
2017-11-28 04:21:34 +00:00
" -cp " , appJar ,
" -Djava.system.class.loader=no.such.Klass " ,
2018-02-14 15:08:25 +00:00
" ReportMyLoader " )
. assertAbnormalExit ( output - > {
output . shouldContain ( warning ) ;
output . shouldContain ( " ClassNotFoundException: no.such.Klass " ) ;
} ) ;
2017-11-28 04:21:34 +00:00
// (2) Try to execute the archive with -Djava.system.class.loader=TestClassLoader,
2018-04-30 20:59:05 +00:00
// it should run, but archived non-system classes should be disabled
2018-02-14 15:08:25 +00:00
TestCommon . run (
2017-11-28 04:21:34 +00:00
" -verbose:class " ,
" -cp " , appJar ,
2020-09-13 14:45:12 +00:00
" -Xlog:cds " ,
2017-11-28 04:21:34 +00:00
" -Djava.system.class.loader=TestClassLoader " ,
2018-02-14 15:08:25 +00:00
" ReportMyLoader " )
. assertNormalExit ( " ReportMyLoader's loader = jdk.internal.loader.ClassLoaders$AppClassLoader@ " , //<-this is still printed because TestClassLoader simply delegates to Launcher$AppLoader, but ...
" TestClassLoader.called = true " , //<-but this proves that TestClassLoader was indeed called.
" TestClassLoader: loadClass( \" ReportMyLoader \" , " ) //<- this also proves that TestClassLoader was indeed called.
. assertNormalExit ( output - > {
2017-11-28 04:21:34 +00:00
output . shouldMatch ( " .class,load. TestClassLoader source: file: " ) ;
output . shouldMatch ( " .class,load. ReportMyLoader source: file:.* " + jarFileName ) ;
2020-09-13 14:45:12 +00:00
output . shouldContain ( " full module graph: disabled due to incompatible property: java.system.class.loader= " ) ;
2018-02-14 15:08:25 +00:00
} ) ;
2017-11-28 04:21:34 +00:00
// (3) Try to change the java.system.class.loader programmatically after
// the app's main method is executed. This should have no effect in terms of
// changing or switching the actual system class loader that's already in use.
2018-02-14 15:08:25 +00:00
TestCommon . run (
2017-11-28 04:21:34 +00:00
" -verbose:class " ,
" -cp " , appJar ,
2018-02-14 15:08:25 +00:00
" TrySwitchMyLoader " )
. assertNormalExit ( " [class,load] ReportMyLoader source: shared objects file " ,
" TrySwitchMyLoader's loader = jdk.internal.loader.ClassLoaders$AppClassLoader@ " ,
" ReportMyLoader's loader = jdk.internal.loader.ClassLoaders$AppClassLoader@ " ,
" TestClassLoader.called = false " ) ;
2017-11-28 04:21:34 +00:00
}
}