/*
 * Copyright 2003-2004 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/* @test
 * @bug 4189011 5019303
 * @summary Test opening over 2048 files
 * @run main/timeout=300 ManyFiles
 */

import java.io.*;
import java.util.*;

public class ManyFiles {
    static int count;
    static List files = new ArrayList();
    static List streams = new ArrayList();
    static int NUM_FILES = 2050;

    public static void main(String args[]) throws Exception {
        // Linux does not yet allow opening this many files; Solaris
        // 8 requires an explicit allocation of more file descriptors
        // to succeed. Since this test is written to check for a
        // Windows capability it is much simpler to only run it
        // on that platform.
        String osName = System.getProperty("os.name");
        if (osName.startsWith("Linux")||osName.startsWith("SunOS"))
            return;

        for (int n = 0; n < NUM_FILES; n++) {
            File f = new File("file" + count++);
            files.add(f);
            streams.add(new FileOutputStream(f));
        }

        Iterator i = streams.iterator();
        while(i.hasNext()) {
            FileOutputStream fos = (FileOutputStream)i.next();
            fos.close();
        }

        i = files.iterator();
        while(i.hasNext()) {
            File f = (File)i.next();
            f.delete();
        }
    }
}
