1 /*
   2  * Copyright (c) 2002, 2019, 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 
  31 import java.io.File;
  32 
  33 public 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 }