1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/*
* Copyright (c) 2018, 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.io.File;
import java.lang.module.Configuration;
import java.lang.module.ModuleDescriptor;
import java.util.List;
import java.util.Set;
import sun.hotspot.WhiteBox;
//
// Test archived system module graph when open archive heap objects are mapped:
//
public class CheckArchivedModuleApp {
static WhiteBox wb;
public static void main(String args[]) throws Exception {
wb = WhiteBox.getWhiteBox();
if (!wb.areOpenArchiveHeapObjectsMapped()) {
System.out.println("Archived open_archive_heap objects are not mapped.");
System.out.println("This may happen during normal operation. Test Skipped.");
return;
}
if (args.length != 2) {
throw new RuntimeException(
"FAILED. Incorrect argument length: " + args.length);
}
boolean expectArchivedDescriptors = "yes".equals(args[0]);
boolean expectArchivedConfiguration = "yes".equals(args[1]);
// -XX:+EnableJVMCI adds extra system modules, in which case the system
// module objects are not archived.
Boolean enableJVMCI = wb.getBooleanVMFlag("EnableJVMCI");
if (enableJVMCI != null && enableJVMCI) {
expectArchivedDescriptors = false;
expectArchivedConfiguration = false;
}
checkModuleDescriptors(expectArchivedDescriptors);
checkConfiguration(expectArchivedConfiguration);
checkEmptyConfiguration(expectArchivedConfiguration);
}
private static void checkModuleDescriptors(boolean expectArchivedDescriptors) {
Set<Module> modules = ModuleLayer.boot().modules();
for (Module m : modules) {
ModuleDescriptor md = m.getDescriptor();
String name = md.name();
if (expectArchivedDescriptors) {
if (wb.isShared(md)) {
System.out.println(name + " is archived. Expected.");
} else {
throw new RuntimeException(
"FAILED. " + name + " is not archived. Expect archived.");
}
} else {
if (!wb.isShared(md)) {
System.out.println(name + " is not archived. Expected.");
} else {
throw new RuntimeException(
"FAILED. " + name + " is archived. Expect not archived.");
}
}
}
}
private static void checkEmptyConfiguration(boolean expectArchivedConfiguration) {
// Configuration.EMPTY_CONFIGURATION uses the singletons,
// ListN.EMPTY_LIST, SetN.EMPTY_SET and MapN.EMPTY_MAP in
// ImmutableCollections for the 'parents', 'modules' and
// 'graph' fields. The ImmutableCollections singletons
// can be accessed via List.of(), Set.of() and Map.of() APIs.
// Configuration public APIs also allow access to the
// EMPTY_CONFIGURATION's 'parents' and 'modules'. When the
// archived java heap data is enabled at runtime, make sure
// the EMPTY_CONFIGURATION.parents and EMPTY_CONFIGURATION.modules
// are the archived ImmutableCollections singletons.
Configuration emptyCf = Configuration.empty();
List emptyCfParents = emptyCf.parents();
Set emptyCfModules = emptyCf.modules();
if (expectArchivedConfiguration) {
if (emptyCfParents == List.of() &&
wb.isShared(emptyCfParents)) {
System.out.println("Empty Configuration has expected parents.");
} else {
throw new RuntimeException(
"FAILED. Unexpected parents for empty Configuration.");
}
if (emptyCfModules == Set.of() &&
wb.isShared(emptyCfModules)) {
System.out.println("Empty Configuration has expected module set.");
} else {
throw new RuntimeException(
"FAILED. Unexpected module set for empty Configuration.");
}
}
}
private static void checkConfiguration(boolean expectArchivedConfiguration) {
Configuration cf = ModuleLayer.boot().configuration();
if (expectArchivedConfiguration) {
if (wb.isShared(cf)) {
System.out.println("Boot layer configuration is archived. Expected.");
} else {
throw new RuntimeException(
"FAILED. Boot layer configuration is not archived.");
}
} else {
if (!wb.isShared(cf)) {
System.out.println("Boot layer configuration is not archived. Expected.");
} else {
throw new RuntimeException(
"FAILED. Boot layer configuration is archived.");
}
}
}
}
|