• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2package dot.junit;
3
4import java.io.File;
5import java.io.FileOutputStream;
6import java.io.IOException;
7import java.io.InputStream;
8import java.util.Scanner;
9
10public class DeviceUtil {
11
12    private static boolean DEBUG = System.getProperty("cts.vm-tests.debug") != null;
13
14    /**
15     * Executes the command and its arguments in a native process.
16     *
17     * @param commandAndArgs a string array to be passed containing the
18     *            executable and its arguments
19     * @param okIndicator if not null, this String must occur in the stdout of
20     *            the executable (since only checking for the return code is not
21     *            sufficient e.g. for adb shell cmd)
22     * @throws Exception thrown by the underlying command in case of an error.
23     */
24    public static void digestCommand(String[] commandAndArgs, String okIndicator) {
25        RuntimeException re = null;
26        try {
27            String c = "";
28            for (int i = 0; i < commandAndArgs.length; i++) {
29                c += commandAndArgs[i] + " ";
30            }
31            if (DEBUG) System.out.print("com: " + c);
32            StringBuilder sb = new StringBuilder();
33            ProcessBuilder pb = new ProcessBuilder(commandAndArgs).redirectErrorStream(true);
34            Process p = pb.start();
35
36            InputStream is = p.getInputStream();
37            Scanner scanner = new Scanner(is);
38            int retCode = p.waitFor();
39            while (scanner.hasNextLine()) {
40                sb.append(scanner.nextLine());
41            }
42            scanner.close();
43            if (retCode != 0 || (okIndicator != null && !sb.toString().contains(okIndicator))) {
44                String msg = sb.toString() + "\nreturn code: " + retCode;
45                re = new RuntimeException(msg);
46                if (DEBUG) System.out.println("-> error! msg:"+msg);
47            } else {
48                if (DEBUG) System.out.println(" -> " + retCode);
49            }
50        } catch (Exception e) {
51            throw new RuntimeException("Exception occurred: " + e.getClass().getName() + ", msg:"
52                    + e.getMessage());
53        } finally {
54            if (re != null) {
55                throw re;
56            }
57        }
58    }
59
60    public static String createFilePath(String testName) throws IOException {
61        // e.g. /dot/junit/opcodes/add_double/d/T_add_double_1.jar
62        FileOutputStream fos = null;
63        InputStream is = null;
64        File f;
65        try {
66            is = DeviceUtil.class.getResourceAsStream("/tests/" + testName);
67            if (is == null) {
68                throw new RuntimeException("could not find resource /tests" + testName
69                        + " in classpath");
70            }
71            f = File.createTempFile("cts-adbpush-", ".jar");
72            int len = 4096;
73            byte[] bytes = new byte[len];
74            fos = new FileOutputStream(f);
75            int b;
76            while ((b = is.read(bytes)) > 0) {
77                fos.write(bytes, 0, b);
78            }
79        } finally {
80            if (is != null) {
81                is.close();
82            }
83            if (fos != null) {
84                fos.close();
85            }
86        }
87        return f.getAbsolutePath();
88    }
89
90    public static void adbPush(String source, String target)
91            throws IOException {
92        DeviceUtil.digestCommand(new String[] {"adb", "push",
93            DeviceUtil.createFilePath(source), target}, null);
94    }
95
96    public static void adbExec(String classpath, String mainclass) {
97        DeviceUtil.digestCommand(new String[] {"adb", "shell",
98               "dalvikvm", "-Xint:portable", "-Xmx512M",
99               "-Xss32K", "-Djava.io.tmpdir=/data/local/tmp",
100               "-classpath", classpath, mainclass,
101               "&&", "echo", "mk_dalvikvmok" }, "mk_dalvikvmok");
102    }
103
104
105}
106