--- /dev/null 2018-06-17 23:18:20.806999507 +0800 +++ new/test/jdk/jfr/event/gc/collection/GCGarbageCollectionUtil.java 2019-01-29 11:02:38.670336773 +0800 @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2013, 2019, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 jdk.jfr.event.gc.collection; + +import static jdk.testlibrary.Asserts.assertGreaterThan; +import static jdk.testlibrary.Asserts.assertTrue; + +import java.io.File; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordingFile; +import jdk.testlibrary.jfr.AppExecutorHelper; +import jdk.testlibrary.jfr.Events; +import jdk.testlibrary.OutputAnalyzer; + + +/** + * Class to verify GarbageCollection event. + * It starts the application provoking GCGarbageCollection with enabled JFR, + * collects events and verify the 'name' and 'cause' fields to be expected. + * It's supposed to be invoked from tests. + */ +public class GCGarbageCollectionUtil { + private final static String EVENT_SETTINGS_FILE = + System.getProperty("test.src", ".") + File.separator + "gc-testsettings.jfc"; + + /** + * Verifies the 'name' and 'cause' fields of received events to be expected. + * @param testID - a string to identify test + * @param testFlags - VM flags including GC to start the app + * @param gcNames - expected values for the 'name' field + * @param gcCauses - expected values for the 'cause' field + * @throws Exception in case of any failure + */ + public static void test(String testID, String[] testFlags, + String[] gcNames, String... gcCauses) throws Exception { + + String jfrFile = testID + ".jfr"; + + List summaryFlags = new ArrayList<>(); + Collections.addAll(summaryFlags, testFlags); + summaryFlags.add("-Xmx100m"); + summaryFlags.add("-XX:+UnlockExperimentalVMOptions"); + summaryFlags.add("-XX:-UseFastUnorderedTimeStamps"); + summaryFlags.add("-verbose:gc"); + + + String args[] = {}; + OutputAnalyzer analyzer = AppExecutorHelper.executeAndRecord(EVENT_SETTINGS_FILE, jfrFile, + (String[])summaryFlags.toArray(new String[0]), AppGCProvoker.class.getName(), args); + analyzer.shouldHaveExitValue(0); + + Set gcValidNames = new HashSet<>(); + for (String n: gcNames) { + gcValidNames.add(n); + } + Set gcValidCauses = new HashSet<>(); + for (String n: gcCauses) { + gcValidCauses.add(n); + } + + int total = 0; + for (RecordedEvent event : RecordingFile.readAllEvents(Paths.get(jfrFile))) { + total++; + System.out.println("Event: " + event); + + final String name = Events.assertField(event, "name").notEmpty().getValue(); + assertTrue(gcValidNames.contains(name), "GC name '" + name + "' not in the valid list" + gcValidNames); + + final String cause = Events.assertField(event, "cause").notEmpty().getValue(); + assertTrue(gcValidCauses.contains(cause), "GC cause '" + cause + "' not in the valid causes" + gcValidCauses); + } + assertGreaterThan(total, 0, "Expected at least one event"); + } +}