File: CheckArchivedModuleApp.java

package info (click to toggle)
openjdk-11-jre-dcevm 11.0.12%2B7-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 221,052 kB
  • sloc: java: 1,360,115; cpp: 832,709; ansic: 209,376; xml: 62,473; sh: 8,122; asm: 3,279; python: 1,661; javascript: 942; makefile: 382; sed: 172; perl: 114
file content (142 lines) | stat: -rw-r--r-- 5,908 bytes parent folder | download | duplicates (8)
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.");
            }
        }
    }
}