blob: 4dbff501d39b1344d8b9ff67b6bb10b473db9f18 [file] [log] [blame]
/*
* 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();
}
}
}
}