1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.api.java.lang;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20b441085db130d5bee561b8baec829bee50068b27Jorg Pleumannimport dalvik.annotation.BrokenTest;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ProcessTest extends junit.framework.TestCase {
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
29229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.lang.Process#getInputStream()
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getInputStream() {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Test for:
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //Object[] execArgs = Support_Exec.execJava2(
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //        new String[] { "tests.support.Support_AvailTest" }, null,
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //        true);
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //Process proc = (Process) execArgs[0];
38f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            String[] commands = { "sleep", "1"};
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Process proc = Runtime.getRuntime().exec(commands, null, null);
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            OutputStream os = proc.getOutputStream();
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // first number indicates total stream length
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // second number indicates length of data after second space
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this will allow us to verify length at start, middle, and end
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            os.write("10 5 abcde".getBytes());
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            os.close();
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream is = proc.getInputStream();
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            StringBuffer msg = new StringBuffer("");
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (true) {
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int c = is.read();
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (c == -1)
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                msg.append((char) c);
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            is.close();
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            proc.waitFor();
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //Support_Exec.checkStderr(execArgs);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            proc.destroy();
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("true", msg.toString(), msg.toString());
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException executing avail test: " + e);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (InterruptedException e) {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("InterruptedException executing avail test: " + e);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
71229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.lang.Process#getOutputStream()
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getOutputStream() {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            String[] commands = { "sleep", "1"};
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Process proc = Runtime.getRuntime().exec(commands, null, null);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            OutputStream os = proc.getOutputStream();
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // send data, and check if it is echoed back correctly
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String str1 = "Some data for testing communication between processes\n";
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String str2 = "More data that serves the same purpose.\n";
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String str3 = "Here is some more data.\n";
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            os.write(str1.getBytes());
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Thread.sleep(2000);
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (InterruptedException e) {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                e.printStackTrace();
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            os.close();
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream is = proc.getInputStream();
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            StringBuffer msg = new StringBuffer("");
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (true) {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int c = is.read();
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (c == -1)
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                msg.append((char) c);
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            is.close();
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            proc.waitFor();
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //Support_Exec.checkStderr(execArgs);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            proc.destroy();
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String org = str1;
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String recvd = msg.toString();
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Doesn't pass on RI
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // assertTrue("Data returned did not match data sent. Received: '"
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //        + recvd + "' sent: '" + org + "'", recvd.equals(org));
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException executing avail test: " + e);
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (InterruptedException e) {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("InterruptedException executing avail test: " + e);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_exitValue() {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
115f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            String[] commands = { "ls" };
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Process process = Runtime.getRuntime().exec(commands, null, null);
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Thread.sleep(5000);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch(Exception e) {
120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue(process.exitValue() == 0);
123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String[] commandsSleep = { "sleep", "3" };
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            process = Runtime.getRuntime().exec(commandsSleep, null, null);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            process.destroy();
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Thread.sleep(5000);
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {}
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue(process.exitValue() != 0);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            process = Runtime.getRuntime().exec(commandsSleep, null, null);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                process.exitValue();
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalThreadStateException was not thrown.");
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch(IllegalThreadStateException itse) {
137f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes               //expected
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException was thrown.");
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_Constructor() {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ProcessClass pc = new ProcessClass();
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(pc.exitValue() == 0);
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
148f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
149b441085db130d5bee561b8baec829bee50068b27Jorg Pleumann    @BrokenTest("Sporadic timeouts in CTS, but not in CoreTestRunner")
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_destroy() {
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        String[] commands = { "ls"};
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Process process = Runtime.getRuntime().exec(commands, null, null);
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            process.destroy();
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException was thrown.");
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
159f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setUp() {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void tearDown() {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void doneSuite() {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
168f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class ProcessClass extends Process {
170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ProcessClass() {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super();
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void destroy() {
177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int exitValue() {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO Auto-generated method stub
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public InputStream getErrorStream() {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public InputStream getInputStream() {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public OutputStream getOutputStream() {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int waitFor() throws InterruptedException {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO Auto-generated method stub
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
209