Home | History | Annotate | Download | only in lang
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package tests.api.java.lang;
     19 
     20 import java.io.File;
     21 import java.io.IOException;
     22 import java.io.InputStream;
     23 import java.io.OutputStream;
     24 import java.util.ArrayList;
     25 
     26 public class ProcessTest extends junit.framework.TestCase {
     27 
     28   public void test_55017() throws Exception {
     29     ArrayList<Process> children = new ArrayList<Process>();
     30     for (int i = 0; i < 256; ++i) {
     31       try {
     32         children.add(Runtime.getRuntime().exec(new String[] { "/system/bin/does-not-exist" }, null, null));
     33         System.gc();
     34       } catch (IOException expected) {
     35       }
     36     }
     37     assertEquals(0, children.size());
     38 
     39     boolean onDevice = new File("/system/bin").exists();
     40     String[] psCommand = onDevice ? new String[] { "ps" } : new String[] { "ps", "s" };
     41     Process ps = Runtime.getRuntime().exec(psCommand, null, null);
     42     int zombieCount = 0;
     43     for (String line : readAndCloseStream(ps.getInputStream()).split("\n")) {
     44       if (line.contains(" Z ") || line.contains(" Z+ ")) {
     45           ++zombieCount;
     46       }
     47     }
     48     assertEquals(0, zombieCount);
     49   }
     50 
     51   public void test_getOutputStream() throws Exception {
     52     String[] commands = { "cat", "-"};
     53     Process p = Runtime.getRuntime().exec(commands, null, null);
     54     OutputStream os = p.getOutputStream();
     55     // send data, and check if it is echoed back correctly
     56     String str1 = "Some data for testing communication between processes\n";
     57     String str2 = "More data that serves the same purpose.\n";
     58     String str3 = "Here is some more data.\n";
     59     os.write(str1.getBytes());
     60     try {
     61       Thread.sleep(1000);
     62     } catch (InterruptedException e) {
     63       e.printStackTrace();
     64     }
     65     os.write(str2.getBytes());
     66     os.write(str3.getBytes());
     67     os.close();
     68 
     69     String received = readAndCloseStream(p.getInputStream());
     70     assertEquals(str1 + str2 + str3, received);
     71 
     72     String stderr = readAndCloseStream(p.getErrorStream());
     73     assertEquals("", stderr);
     74 
     75     p.waitFor();
     76     p.destroy();
     77   }
     78 
     79   public void test_getErrorStream() throws Exception {
     80     String[] commands = { "cat", "--no-such-option"};
     81     Process p = Runtime.getRuntime().exec(commands, null, null);
     82 
     83     p.getOutputStream().close();
     84 
     85     String received = readAndCloseStream(p.getInputStream());
     86     assertEquals("", received);
     87 
     88     String stderr = readAndCloseStream(p.getErrorStream());
     89     assertTrue(stderr, stderr.contains("unrecognized option") || stderr.contains("invalid option"));
     90 
     91     p.waitFor();
     92     p.destroy();
     93   }
     94 
     95   private String readAndCloseStream(InputStream is) throws IOException {
     96     StringBuffer result = new StringBuffer();
     97     while (true) {
     98       int c = is.read();
     99       if (c == -1) {
    100         break;
    101       }
    102       result.append((char) c);
    103     }
    104     is.close();
    105     return result.toString();
    106   }
    107 
    108   public void test_exitValue() throws Exception {
    109     String[] commands = { "ls" };
    110     Process process = Runtime.getRuntime().exec(commands, null, null);
    111     process.waitFor();
    112     assertEquals(0, process.exitValue());
    113 
    114     String[] commandsSleep = { "sleep", "3000" };
    115     process = Runtime.getRuntime().exec(commandsSleep, null, null);
    116     process.destroy();
    117     process.waitFor(); // destroy is asynchronous.
    118     assertTrue(process.exitValue() != 0);
    119 
    120     process = Runtime.getRuntime().exec(new String[] { "sleep", "3000" }, null, null);
    121     try {
    122       process.exitValue();
    123       fail();
    124     } catch(IllegalThreadStateException expected) {
    125     }
    126   }
    127 
    128   public void test_destroy() throws Exception {
    129     String[] commands = { "ls"};
    130     Process process = Runtime.getRuntime().exec(commands, null, null);
    131     process.destroy();
    132     process.destroy();
    133     process.destroy();
    134   }
    135 }
    136