| package com.android.monkeyrunner; |
| |
| import org.python.core.Py; |
| import org.python.core.PyObject; |
| import org.python.util.PythonInterpreter; |
| import org.python.util.InteractiveConsole; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.FileInputStream; |
| import java.lang.RuntimeException; |
| import java.util.Properties; |
| |
| |
| /** |
| * Runs Jython based scripts. |
| */ |
| public class ScriptRunner { |
| |
| /** The "this" scope object for scripts. */ |
| private final Object scope; |
| private final String variable; |
| |
| /** Private constructor. */ |
| private ScriptRunner(Object scope, String variable) { |
| this.scope = scope; |
| this.variable = variable; |
| } |
| |
| /** Creates a new instance for the given scope object. */ |
| public static ScriptRunner newInstance(Object scope, String variable) { |
| return new ScriptRunner(scope, variable); |
| } |
| |
| /** |
| * Runs the specified Jython script. First runs the initialization script to |
| * preload the appropriate client library version. |
| */ |
| public static void run(String scriptfilename) { |
| try { |
| initPython(); |
| PythonInterpreter python = new PythonInterpreter(); |
| |
| python.execfile(scriptfilename); |
| } catch(Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| |
| /** Initialize the python interpreter. */ |
| private static void initPython() { |
| Properties props = new Properties(); |
| // Default is 'message' which displays sys-package-mgr bloat |
| // Choose one of error,warning,message,comment,debug |
| props.setProperty("python.verbose", "error"); |
| props.setProperty("python.path", System.getProperty("java.class.path")); |
| PythonInterpreter.initialize(System.getProperties(), props, new String[] {""}); |
| } |
| |
| /** |
| * Create and run a console using a new python interpreter for the test |
| * associated with this instance. |
| */ |
| public void console() throws IOException { |
| initPython(); |
| InteractiveConsole python = new InteractiveConsole(); |
| initInterpreter(python, scope, variable); |
| python.interact(); |
| } |
| |
| /** |
| * Start an interactive python interpreter using the specified set of local |
| * variables. Use this to interrupt a running test script with a prompt: |
| * |
| * @param locals |
| */ |
| public static void console(PyObject locals) { |
| initPython(); |
| InteractiveConsole python = new InteractiveConsole(locals); |
| python.interact(); |
| } |
| |
| /** |
| * Initialize a python interpreter. |
| * |
| * @param python |
| * @param scope |
| * @throws IOException |
| */ |
| public static void initInterpreter(PythonInterpreter python, Object scope, String variable) |
| throws IOException { |
| // Store the current test case as the this variable |
| python.set(variable, scope); |
| } |
| } |