1/*
2 * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 4680945 4873419
27 * @summary Check process exit code
28 * @author kladko, Martin Buchholz
29 */
30
31import java.io.File;
32
33public class ExitValue
34{
35
36    public static String join(String separator, String[] elts) {
37        String result = elts[0];
38        for (int i = 1; i < elts.length; ++i)
39            result = result + separator + elts[i];
40        return result;
41    }
42
43    public static void checkExitValue(String[] commandArgs,
44                                      int expectedExitValue)
45        throws Exception
46    {
47        if (! (new File(commandArgs[0]).exists()))
48            return;
49
50        System.out.println("Running command: " + join(" ", commandArgs));
51        Process proc = Runtime.getRuntime().exec(commandArgs);
52        int val;
53        byte[] buf = new byte[4096];
54        int n = proc.getErrorStream().read(buf);
55        if (n > 0)
56            throw new Exception
57                ("Unexpected stderr: "
58                 + new String(buf, 0, n, "ASCII"));
59        if ((val = proc.waitFor()) != expectedExitValue)
60            throw new Exception
61                ("waitFor() returned unexpected value " + val);
62        if ((val = proc.exitValue()) != expectedExitValue)
63            throw new Exception
64                ("exitValue() returned unexpected value " + val);
65    }
66
67    public static void checkPosixShellExitValue(String posixShellProgram,
68                                                int expectedExitValue)
69        throws Exception
70    {
71        checkExitValue(new String[] { UnixCommands.sh(), "-c", posixShellProgram },
72                       expectedExitValue);
73    }
74
75    static final int EXIT_CODE = 5;
76
77    public static void main(String[] args) throws Exception {
78        if (! UnixCommands.isUnix) {
79            System.out.println("For UNIX only");
80            return;
81        }
82        UnixCommands.ensureCommandsAvailable("sh", "true", "kill");
83
84        String java = join(File.separator, new String []
85            { System.getProperty("java.home"), "bin", "java" });
86
87        checkExitValue(new String[]
88            { java,
89              "-classpath", System.getProperty("test.classes", "."),
90              "ExitValue$Run", String.valueOf(EXIT_CODE)
91            }, EXIT_CODE);
92
93        checkExitValue(new String[] { UnixCommands.findCommand("true") }, 0);
94
95        checkPosixShellExitValue("exit", 0);
96
97        checkPosixShellExitValue("exit 7", 7);
98
99        int sigoffset = UnixCommands.isSunOS ? 0 : 128;
100        checkPosixShellExitValue(UnixCommands.kill() + " -9 $$", sigoffset+9);
101    }
102
103    public static class Run {
104        public static void main (String[] argv) {
105            System.exit(Integer.parseInt(argv[0]));
106        }
107    }
108}
109