/*
 * Copyright (c) 2005, 2017, 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.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;

public class DeleteOnExitTest {
    public static void main(String[] args) throws IOException {
        ByteArrayInputStream is =
            new ByteArrayInputStream(new byte[100]);
        ByteArrayOutputStream os =
            new ByteArrayOutputStream();

        String tmp = System.getProperty("java.io.tmpdir", ".");
        System.out.println("tmp: " + tmp);

        // count number of files before test
        ImageIO.setUseCache(true);
        ImageIO.setCacheDirectory(new File(tmp));

        File tmpDir = ImageIO.getCacheDirectory();
        System.out.println("tmpDir is " + tmpDir);
        int fnum_before = tmpDir.list().length;
        System.out.println("Files before test: " + fnum_before);

        ImageInputStream iis =
            ImageIO.createImageInputStream(is);
        System.out.println("iis = " + iis);

        ImageInputStream iis2 =
            ImageIO.createImageInputStream(is);

        ImageOutputStream ios =
            ImageIO.createImageOutputStream(os);
        System.out.println("ios = " + ios);

        ImageOutputStream ios2 =
            ImageIO.createImageOutputStream(os);

        iis2.close();
        ios2.close();
        int fnum_after = tmpDir.list().length;
        System.out.println("Files after test: " + fnum_after);

        if (fnum_before == fnum_after) {
            throw new RuntimeException("Test failed: cache was not used.");
        }
    }
}
