--- /dev/null 2018-06-17 23:18:20.806999507 +0800 +++ new/test/lib/testlibrary/jdk/testlibrary/jfr/FileHelper.java 2019-01-29 11:06:00.404441673 +0800 @@ -0,0 +1,124 @@ +/* + * 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.testlibrary.jfr; + +import java.io.File; +import java.io.IOException; +import java.nio.file.AccessDeniedException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordingFile; +import jdk.testlibrary.Asserts; + +/** + * Common helper class. + */ +public class FileHelper { + + public static Path getDest(String subPath) throws IOException { + Path path = Paths.get(subPath + "/test.jfr"); + Path parent = path.getParent(); + if (parent == null) { + throw new IOException("No parent cound be found for path " + subPath); + } + Files.createDirectories(parent); + return path; + } + + public static Path createLongDir(Path root) throws IOException { + final int minPathLength = 400; + StringBuilder buff = new StringBuilder(); + buff.append(root.toString()); + while (buff.length() < minPathLength) { + buff.append("/veryLongPath012345678901234567890123456789"); + } + Path path = Paths.get(buff.toString()); + System.out.println("long dir=" + path); + Files.createDirectories(path); + return path; + } + + public static Path getDestReadOnly(String subPath) throws IOException { + final Path path = getDest(subPath); + Path parent = path.getParent(); + if (parent == null) { + throw new IOException("No parent cound be found for path " + subPath); + } + parent.toFile().setReadOnly(); + return path; + } + + public static Path createReadOnlyFile(Path path) throws IOException { + final Path createdPath = Files.createFile(path); + createdPath.toFile().setReadOnly(); + return createdPath; + } + + public static Path createReadOnlyDir(Path path) throws IOException { + final Path createdPath = Files.createDirectories(path); + createdPath.toFile().setReadOnly(); + return createdPath; + } + + public static Path getDestNotExist() { + return Paths.get(".", "thisDirDoesNotExist/test.jfr"); + } + + public static boolean isReadOnlyPath(Path path) throws IOException { + // Files.isWritable(path) can not really be trusted. At least not on Windows. + // If path is a directory, we try to create a new file in it. + if (Files.isDirectory(path)) { + try { + Path f = Files.createFile(Paths.get(path.toString(), "dummyFileToCheckReadOnly")); + System.out.printf("Dir is not read-only, created %s, exists=%b%n", f, Files.exists(f)); + return false; + } catch (AccessDeniedException e) { + System.out.printf("'%s' verified read-only by %s%n", path, e.toString()); + return true; + } + } else { + boolean isReadOnly = !Files.isWritable(path); + System.out.format("isReadOnly '%s': %b%n", path, isReadOnly); + return isReadOnly; + } + } + + public static void verifyRecording(File file) throws Exception { + Asserts.assertTrue(file.exists(), file.getAbsolutePath() + " does not exist"); + Asserts.assertTrue(file.isFile(), file.getAbsolutePath() + " is not a file"); + Asserts.assertGreaterThan(file.length(), 0L, "Size of recording is 0."); + List events = RecordingFile.readAllEvents(file.toPath()); + for (RecordedEvent event : events) { + System.out.printf("First event in recording '%s':%n%s", file.getName(), event); + return; + } + Asserts.fail("No events in file " + file.getName()); + } + +}