jdk/test/java/awt/FontClass/CreateFont/CreateFontArrayTest.java
changeset 36899 e766024a0873
child 37547 440b85d574c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/CreateFont/CreateFontArrayTest.java	Tue Mar 22 14:46:48 2016 -0700
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+/*
+ * @test
+ * @bug 8055463
+ * @summary Test createFont APIs
+ * @run CreateFontArrayTest
+ */
+
+import java.awt.Font;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+/*
+ * This test pokes around in platform folders/directories to try
+ * to find some fonts with which to test. It will do different things
+ * on different platforms and may not do anything at all if the platform
+ * directories aren't where it expects. For example if /usr/share/fonts
+ * is not used on a particular Linux distro or on Windows the fonts are
+ * not in c:\windows\fonts (which would be the right place on 99.99% of
+ * systems you will find today.
+ * It ought to be very reliable but it is not 100% guaranteed.
+ * Failure to find fonts to test is 'not a product bug'.
+ * Fonts on a system having different content than we expect based on
+ * file extension is also 'not a product bug'.
+ * The former will cause silent success, the latter may cause 'noisy' failure
+ * and the test would then need to be dialled back to be more cautious.
+ */
+
+public class CreateFontArrayTest {
+
+    public static void main(String[] args) throws Exception {
+        test(".ttc", 2, -1, true);
+        test(".ttf", 1,  1, true);
+        test(".otf", 1,  1, true);
+        test(".pfa", 0,  0, false);
+        test(".pfb", 0,  0, false);
+    }
+
+    static File getPlatformFontFolder(String ext) throws Exception {
+        boolean recurse = false;
+        String folder = null;
+        String os = System.getProperty("os.name");
+        if (os.startsWith("Win")) {
+            folder = "c:\\windows\\fonts";
+        } else if (os.startsWith("Linux")) {
+            folder = "/usr/share/fonts";
+            recurse = true; // need to dig to find fonts.
+        } else if (os.startsWith("Mac")) {
+            // Disabled until createFont can handle mac font names.
+            //folder = "/Library/Fonts";
+        }
+        if (folder == null) {
+            return null;
+        }
+        File dir = new File(folder);
+        if (!dir.exists() || !dir.isDirectory()) {
+            return null;
+        }
+        // Have a root.
+        if (!recurse) {
+            return dir;
+        }
+
+        // If "recurse" is set, try to find a sub-folder which contains
+        // fonts with the specified extension
+        return findSubFolder(dir, ext);
+    }
+
+    static File findSubFolder(File folder, String ext) {
+        File[] files =
+            folder.listFiles(f -> f.getName().toLowerCase().endsWith(ext));
+        if (files != null && files.length > 0) {
+            return folder;
+        }
+        File[] subdirs = folder.listFiles(f -> f.isDirectory());
+        for (File f : subdirs) {
+            File subfolder = findSubFolder(f, ext);
+            if (subfolder != null) {
+                return subfolder;
+            }
+        }
+        return null;
+    }
+
+    static void test(String ext, int min, int max,
+                     boolean expectSuccess ) throws Exception {
+
+        File dir = getPlatformFontFolder(ext);
+        if (dir == null) {
+            System.out.println("No folder to test for " + ext);
+            return;
+        }
+        File[] files =
+            dir.listFiles(f -> f.getName().toLowerCase().endsWith(ext));
+        if (files == null || files.length == 0) {
+            System.out.println("No files to test for " + ext);
+            return;
+        }
+        System.out.println("Create from file " + files[0]);
+        Font[] fonts = null;
+        try {
+            fonts = Font.createFonts(files[0]);
+            System.out.println("createFont from file returned " + fonts);
+        } catch (Exception e) {
+            if (expectSuccess) {
+                throw new RuntimeException("Unexpected exception", e);
+            } else {
+                System.out.println("Got expected exception " + e);
+                return;
+            }
+        }
+        for (Font f : fonts) {
+            System.out.println(ext + " component : " + f);
+        }
+        if (fonts.length < min) {
+            throw new RuntimeException("Expected at least " + min +
+                                       " but got " + fonts.length);
+        }
+        if (max > 0 && fonts.length > max) {
+            throw new RuntimeException("Expected no more than " + max +
+                                       " but got " + fonts.length);
+        }
+        FileInputStream fis = null;
+        try {
+            System.out.println("Create from stream " + files[0]);
+            fis = new FileInputStream(files[0]);
+            InputStream s = new BufferedInputStream(fis);
+            fonts = null;
+            try {
+                fonts = Font.createFonts(s);
+                System.out.println("createFont from stream returned " + fonts);
+            } catch (Exception e) {
+                if (expectSuccess) {
+                    throw new RuntimeException("Unexpected exception", e);
+                } else {
+                    System.out.println("Got expected exception " + e);
+                    return;
+                }
+            }
+            for (Font f : fonts) {
+                System.out.println(ext + " component : " + f);
+            }
+            if (fonts.length < min) {
+                throw new RuntimeException("Expected at least " + min +
+                                           " but got " + fonts.length);
+            }
+            if (max > 0 && fonts.length > max) {
+                throw new RuntimeException("Expected no more than " + max +
+                                           " but got " + fonts.length);
+            }
+        } finally {
+            if (fis != null) {
+                fis.close();
+            }
+        }
+    }
+}