jdk/test/java/awt/FontClass/CreateFont/CreateFontArrayTest.java
author prr
Fri, 01 Apr 2016 09:52:13 -0700
changeset 37547 440b85d574c8
parent 36899 e766024a0873
permissions -rw-r--r--
8153272: [pit] Tag @run requires "main" in java/awt/FontClass/CreateFont/CreateFontArrayTest.java Reviewed-by: yan

/*
 * 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 8153272
 * @summary Test createFont APIs
 * @run main 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();
            }
        }
    }
}