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