/* * 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(); } } } }