8202284: FileChannel and FileOutpuStream variants of AtomicAppend should fail silently on macOS >= 10.13
authorbpb
Mon, 30 Apr 2018 13:40:39 -0700
changeset 49930 3aaaa5370999
parent 49929 f38329fe8055
child 49931 840e26123940
8202284: FileChannel and FileOutpuStream variants of AtomicAppend should fail silently on macOS >= 10.13 Reviewed-by: chegar
test/jdk/java/io/FileOutputStream/AtomicAppend.java
test/jdk/java/nio/channels/FileChannel/AtomicAppend.java
test/lib/jdk/test/lib/Platform.java
--- a/test/jdk/java/io/FileOutputStream/AtomicAppend.java	Mon Apr 30 21:17:37 2018 +0200
+++ b/test/jdk/java/io/FileOutputStream/AtomicAppend.java	Mon Apr 30 13:40:39 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -25,6 +25,9 @@
  * @test
  * @bug 6631352
  * @summary Check that appends are atomic
+ * @library /test/lib
+ * @build jdk.test.lib.Platform
+ * @run main AtomicAppend
  */
 
 import java.io.File;
@@ -33,6 +36,8 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import jdk.test.lib.Platform;
+
 public class AtomicAppend {
     // Before the fix for
     // 6631352: Implement atomic append mode using FILE_APPEND_DATA (win)
@@ -73,7 +78,17 @@
         if (x == null ? y == null : x.equals(y)) pass();
         else fail(x + " not equal to " + y);}
     public static void main(String[] args) throws Throwable {
-        new AtomicAppend().instanceMain(args);}
+        if (Platform.isOSX()) {
+            final String version = "10.13";
+            int ineq = Platform.compareOsVersion(version);
+            if (ineq >= 0) {
+                System.out.format("Skipping test for macOS version %s >= %s%n",
+                    Platform.getOsVersion(), version);
+                return;
+            }
+        }
+        new AtomicAppend().instanceMain(args);
+    }
     void instanceMain(String[] args) throws Throwable {
         try {test(args);} catch (Throwable t) {unexpected(t);}
         System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
--- a/test/jdk/java/nio/channels/FileChannel/AtomicAppend.java	Mon Apr 30 21:17:37 2018 +0200
+++ b/test/jdk/java/nio/channels/FileChannel/AtomicAppend.java	Mon Apr 30 13:40:39 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -24,6 +24,9 @@
 /*
  * @test
  * @summary Check that appends are atomic
+ * @library /test/lib
+ * @build jdk.test.lib.Platform
+ * @run main AtomicAppend
  * @key randomness
  */
 
@@ -40,6 +43,8 @@
 import java.nio.file.Files;
 import static java.nio.file.StandardOpenOption.*;
 
+import jdk.test.lib.Platform;
+
 public class AtomicAppend {
     static final Random rand = new Random();
 
@@ -76,6 +81,15 @@
     }
 
     public static void main(String[] args) throws Throwable {
+        if (Platform.isOSX()) {
+            final String version = "10.13";
+            int ineq = Platform.compareOsVersion(version);
+            if (ineq >= 0) {
+                System.out.format("Skipping test for macOS version %s >= %s%n",
+                    Platform.getOsVersion(), version);
+                return;
+            }
+        }
         final int nThreads = 16;
         final int writes = 1000;
         final File file = File.createTempFile("foo", null);
--- a/test/lib/jdk/test/lib/Platform.java	Mon Apr 30 21:17:37 2018 +0200
+++ b/test/lib/jdk/test/lib/Platform.java	Mon Apr 30 13:40:39 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -26,12 +26,17 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 public class Platform {
     public  static final String vmName      = System.getProperty("java.vm.name");
     public  static final String vmInfo      = System.getProperty("java.vm.info");
     private static final String osVersion   = System.getProperty("os.version");
+    private static       String[] osVersionTokens;
     private static       int osVersionMajor = -1;
     private static       int osVersionMinor = -1;
     private static final String osName      = System.getProperty("os.name");
@@ -124,12 +129,12 @@
 
     // Os version support.
     private static void init_version() {
+        osVersionTokens = osVersion.split("\\.");
         try {
-            final String[] tokens = osVersion.split("\\.");
-            if (tokens.length > 0) {
-                osVersionMajor = Integer.parseInt(tokens[0]);
-                if (tokens.length > 1) {
-                    osVersionMinor = Integer.parseInt(tokens[1]);
+            if (osVersionTokens.length > 0) {
+                osVersionMajor = Integer.parseInt(osVersionTokens[0]);
+                if (osVersionTokens.length > 1) {
+                    osVersionMinor = Integer.parseInt(osVersionTokens[1]);
                 }
             }
         } catch (NumberFormatException e) {
@@ -137,6 +142,10 @@
         }
     }
 
+    public static String getOsVersion() {
+        return osVersion;
+    }
+
     // Returns major version number from os.version system property.
     // E.g. 5 on Solaris 10 and 3 on SLES 11.3 (for the linux kernel version).
     public static int getOsVersionMajor() {
@@ -151,6 +160,45 @@
         return osVersionMinor;
     }
 
+    /**
+     * Compares the platform version with the supplied version. The
+     * version must be of the form a[.b[.c[.d...]]] where a, b, c, d, ...
+     * are decimal integers.
+     *
+     * @throws NullPointerException if the parameter is null
+     * @throws NumberFormatException if there is an error parsing either
+     *         version as split into component strings
+     * @return -1, 0, or 1 according to whether the platform version is
+     *         less than, equal to, or greater than the supplied version
+     */
+    public static int compareOsVersion(String version) {
+        if (osVersionTokens == null) init_version();
+
+        Objects.requireNonNull(version);
+
+        List<Integer> s1 = Arrays
+            .stream(osVersionTokens)
+            .map(Integer::valueOf)
+            .collect(Collectors.toList());
+        List<Integer> s2 = Arrays
+            .stream(version.split("\\."))
+            .map(Integer::valueOf)
+            .collect(Collectors.toList());
+
+        int count = Math.max(s1.size(), s2.size());
+        for (int i = 0; i < count; i++) {
+            int i1 = i < s1.size() ? s1.get(i) : 0;
+            int i2 = i < s2.size() ? s2.get(i) : 0;
+            if (i1 > i2) {
+                return 1;
+            } else if (i2 > i1) {
+                return -1;
+            }
+        }
+
+        return 0;
+    }
+
     public static boolean isDebugBuild() {
         return (jdkDebug.toLowerCase().contains("debug"));
     }