1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.lang;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.BufferedReader;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File;
239b576d3f8644c08e7534eecf2e5ef356dd53ab4cShubham Ajmeraimport java.io.FileOutputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStreamReader;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ProcessManagerTest extends TestCase {
30f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Thread thread = null;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Process process = null;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    boolean isThrown = false;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCat() throws IOException, InterruptedException {
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] commands = { "cat" };
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Process process = Runtime.getRuntime().exec(commands, null, null);
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        OutputStream out = process.getOutputStream();
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String greeting = "Hello, World!";
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.write(greeting.getBytes());
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.write('\n');
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.close();
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(greeting, readLine(process));
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
47f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
486a6b612286976cc185c898803fe51e4e062bd9ebBrett Chabot    // BrokenTest: Sporadic failures in CTS, but not in CoreTestRunner
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testSleep() throws IOException {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] commands = { "sleep", "1" };
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        process = Runtime.getRuntime().exec(commands, null, null);
52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        try {
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(0, process.waitFor());
54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch(InterruptedException ie) {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("InterruptedException was thrown.");
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isThrown = false;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        thread = new Thread() {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void run() {
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String[] commands = { "sleep", "1000"};
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    process = Runtime.getRuntime().exec(commands, null, null);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IOException e1) {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    fail("IOException was thrown.");
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    process.waitFor();
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    fail("InterruptedException was not thrown.");
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch(InterruptedException ie) {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    isThrown = true;
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
76f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
77f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        Thread interruptThread = new Thread() {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void run() {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    sleep(10);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch(InterruptedException ie) {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    fail("InterruptedException was thrown in " +
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            "the interruptThread.");
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                thread.interrupt();
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        thread.start();
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        interruptThread.start();
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            interruptThread.join();
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (InterruptedException e) {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("InterruptedException was thrown.");
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Thread.sleep(100);
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch(InterruptedException ie) {
98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
100f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        thread.interrupt();
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //process.destroy();
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Thread.sleep(100);
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch(InterruptedException ie) {
106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
108f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(isThrown);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testPwd() throws IOException, InterruptedException {
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] commands = { "sh", "-c", "pwd" };
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Process process = Runtime.getRuntime().exec(
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                commands, null, new File("/"));
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        logErrors(process);
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("/", readLine(process));
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testEnvironment() throws IOException, InterruptedException {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] commands = { "sh", "-c", "echo $FOO" };
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Remember to set the path so we can find sh.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] environment = { "FOO=foo", "PATH=" + System.getenv("PATH") };
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Process process = Runtime.getRuntime().exec(
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                commands, environment, null);
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        logErrors(process);
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("foo", readLine(process));
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    String readLine(Process process) throws IOException {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream in = process.getInputStream();
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return reader.readLine();
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void logErrors(final Process process) throws IOException {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Thread thread = new Thread() {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void run() {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                InputStream in = process.getErrorStream();
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                BufferedReader reader
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        = new BufferedReader(new InputStreamReader(in));
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String line;
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    while ((line = reader.readLine()) != null) {
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        System.err.println(line);
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IOException e) {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    e.printStackTrace();
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        thread.setDaemon(true);
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        thread.start();
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testHeavyLoad() {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int i;
1596539d2364df3a3c8488ecadc42014280c194a9c5Jorg Pleumann        for (i = 0; i < 100; i++)
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            stuff();
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static void stuff() {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Runtime rt = Runtime.getRuntime();
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Process proc = rt.exec("ls");
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            proc.waitFor();
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            proc = null;
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.err.println("Failure: " + ex);
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(ex);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        rt.gc();
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        rt = null;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1779b576d3f8644c08e7534eecf2e5ef356dd53ab4cShubham Ajmera    FileOutputStream out;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCloseNonStandardFds()
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException, InterruptedException {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] commands = { "ls", "/proc/self/fd" };
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Process process = Runtime.getRuntime().exec(commands, null, null);
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int before = countLines(process);
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1869b576d3f8644c08e7534eecf2e5ef356dd53ab4cShubham Ajmera        File tmpFile = File.createTempFile("testCloseNonStandardFds", ".txt");
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Open a new fd.
1889b576d3f8644c08e7534eecf2e5ef356dd53ab4cShubham Ajmera        this.out = new FileOutputStream(tmpFile);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            process = Runtime.getRuntime().exec(commands, null, null);
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int after = countLines(process);
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Assert that the new fd wasn't open in the second run.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(before, after);
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
1979b576d3f8644c08e7534eecf2e5ef356dd53ab4cShubham Ajmera            this.out.close();
1989b576d3f8644c08e7534eecf2e5ef356dd53ab4cShubham Ajmera            tmpFile.delete();
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Counts lines of input from the given process. Equivalent to "wc -l".
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int countLines(Process process) throws IOException {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        logErrors(process);
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream in = process.getInputStream();
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int count = 0;
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (reader.readLine() != null) {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count++;
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return count;
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testInvalidCommand()
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException, InterruptedException {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String[] commands = { "doesnotexist" };
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Runtime.getRuntime().exec(commands, null, null);
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) { /* expected */ }
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
224