/*
 * Copyright (c) 2004, 2008, 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.
 */

import java.io.*;
import java.awt.*;

public class DeleteFont {

    public static void main(String args[]) throws Exception {

        String font = "A.ttf";
        String sep = System.getProperty("file.separator");
        String testSrc = System.getenv("TESTSRC");
        if (testSrc != null) {
            font = testSrc + sep + font;
        }
        System.out.println("Using font file: " + font);
        FileInputStream fis = new FileInputStream(font);
        Font f = Font.createFont(Font.TRUETYPE_FONT, fis);
        f.toString();
        f.deriveFont(Font.BOLD);
        f.canDisplay('X');

       InputStream in = new InputStream() {
            public int read() {
                throw new RuntimeException();
            }
        };
        boolean gotException = false;
        try {
           Font.createFont(java.awt.Font.TRUETYPE_FONT, in);
        } catch (IOException e) {
            gotException = true;
        }
        if (!gotException) {
            throw new RuntimeException("No expected IOException");
        }
        badRead(-2, Font.TRUETYPE_FONT);
        badRead(8193, Font.TRUETYPE_FONT);

        badRead(-2, Font.TYPE1_FONT);
        badRead(8193, Font.TYPE1_FONT);

        // Make sure GC has a chance to clean up before we exit.
        System.gc(); System.gc();
    }

    static void badRead(final int retval, int fontType) {
        int num = 2;
        byte[] buff = new byte[16*8192]; // Multiple of 8192 is important.
        for (int ct=0; ct<num; ++ct) {
            try {
                Font.createFont(
                    fontType,
                    new ByteArrayInputStream(buff) {
                        @Override
                        public int read(byte[] buff, int off, int len) {
                            int read = super.read(buff, off, len);
                            return read<0 ? retval : read;
                        }
                    }
                );
            } catch (Throwable exc) {
                //exc.printStackTrace();
            }
        }
    }
}

