Bug 985537: add runEmulatorShell to Marionette. r=mdas

This commit is contained in:
Vicamo Yang 2014-03-20 13:01:25 +08:00
parent 6112be1a5c
commit 9c9126f41e
7 changed files with 60 additions and 3 deletions

View File

@ -225,6 +225,10 @@ class Emulator(object):
self._get_telnet_response() self._get_telnet_response()
return self._get_telnet_response(command) return self._get_telnet_response(command)
def _run_shell(self, args):
args.insert(0, 'shell')
return self._run_adb(args).split('\r\n')
def close(self): def close(self):
if self.is_running and self._emulator_launched: if self.is_running and self._emulator_launched:
self.proc.kill() self.proc.kill()

View File

@ -608,8 +608,16 @@ class Marionette(object):
# Process any emulator commands that are sent from a script # Process any emulator commands that are sent from a script
# while it's executing. # while it's executing.
while response.get("emulator_cmd"): while True:
response = self._handle_emulator_cmd(response) if response.get("emulator_cmd"):
response = self._handle_emulator_cmd(response)
continue;
if response.get("emulator_shell"):
response = self._handle_emulator_shell(response)
continue;
break;
if response_key in response: if response_key in response:
return response[response_key] return response[response_key]
@ -626,6 +634,16 @@ class Marionette(object):
"id": response.get("id"), "id": response.get("id"),
"result": result}) "result": result})
def _handle_emulator_shell(self, response):
args = response.get("emulator_shell")
if not isinstance(args, list) or not self.emulator:
raise MarionetteException(
"No emulator in this test to run shell command against")
result = self.emulator._run_shell(args)
return self.client.send({"name": "emulatorCmdResult",
"id": response.get("id"),
"result": result})
def _handle_error(self, response): def _handle_error(self, response):
if 'error' in response and isinstance(response['error'], dict): if 'error' in response and isinstance(response['error'], dict):
status = response['error'].get('status', 500) status = response['error'].get('status', 500)

View File

@ -17,6 +17,14 @@ class TestEmulatorContent(MarionetteTestCase):
"""); """);
self.assertEqual(result, expected) self.assertEqual(result, expected)
def test_emulator_shell(self):
self.marionette.set_script_timeout(10000)
expected = ["Hello World!", ""]
result = self.marionette.execute_async_script("""
runEmulatorShell(["echo", "Hello World!"], marionetteScriptFinished)
""");
self.assertEqual(result, expected)
def test_emulator_order(self): def test_emulator_order(self):
self.marionette.set_script_timeout(10000) self.marionette.set_script_timeout(10000)
self.assertRaises(MarionetteException, self.assertRaises(MarionetteException,

View File

@ -163,6 +163,7 @@ FrameManager.prototype = {
messageManager.addWeakMessageListener("Marionette:shareData", this.server); messageManager.addWeakMessageListener("Marionette:shareData", this.server);
messageManager.addWeakMessageListener("Marionette:register", this.server); messageManager.addWeakMessageListener("Marionette:register", this.server);
messageManager.addWeakMessageListener("Marionette:runEmulatorCmd", this.server); messageManager.addWeakMessageListener("Marionette:runEmulatorCmd", this.server);
messageManager.addWeakMessageListener("Marionette:runEmulatorShell", this.server);
messageManager.addWeakMessageListener("Marionette:switchToModalOrigin", this.server); messageManager.addWeakMessageListener("Marionette:switchToModalOrigin", this.server);
messageManager.addWeakMessageListener("Marionette:switchToFrame", this.server); messageManager.addWeakMessageListener("Marionette:switchToFrame", this.server);
messageManager.addWeakMessageListener("Marionette:switchedToFrame", this.server); messageManager.addWeakMessageListener("Marionette:switchedToFrame", this.server);
@ -190,6 +191,7 @@ FrameManager.prototype = {
messageManager.removeWeakMessageListener("Marionette:shareData", this.server); messageManager.removeWeakMessageListener("Marionette:shareData", this.server);
messageManager.removeWeakMessageListener("Marionette:register", this.server); messageManager.removeWeakMessageListener("Marionette:register", this.server);
messageManager.removeWeakMessageListener("Marionette:runEmulatorCmd", this.server); messageManager.removeWeakMessageListener("Marionette:runEmulatorCmd", this.server);
messageManager.removeWeakMessageListener("Marionette:runEmulatorShell", this.server);
messageManager.removeWeakMessageListener("Marionette:switchToFrame", this.server); messageManager.removeWeakMessageListener("Marionette:switchToFrame", this.server);
messageManager.removeWeakMessageListener("Marionette:switchedToFrame", this.server); messageManager.removeWeakMessageListener("Marionette:switchedToFrame", this.server);
messageManager.removeWeakMessageListener("MarionetteFrame:handleModal", this); messageManager.removeWeakMessageListener("MarionetteFrame:handleModal", this);

View File

@ -2019,6 +2019,14 @@ function runEmulatorCmd(cmd, callback) {
_emu_cb_id += 1; _emu_cb_id += 1;
} }
function runEmulatorShell(args, callback) {
if (callback) {
_emu_cbs[_emu_cb_id] = callback;
}
sendAsyncMessage("Marionette:runEmulatorShell", {emulator_shell: args, id: _emu_cb_id});
_emu_cb_id += 1;
}
function emulatorCmdResult(msg) { function emulatorCmdResult(msg) {
let message = msg.json; let message = msg.json;
if (!sandbox) { if (!sandbox) {

View File

@ -2128,6 +2128,17 @@ MarionetteServerConnection.prototype = {
this._emu_cb_id += 1; this._emu_cb_id += 1;
}, },
runEmulatorShell: function runEmulatorShell(args, callback) {
if (callback) {
if (!this._emu_cbs) {
this._emu_cbs = {};
}
this._emu_cbs[this._emu_cb_id] = callback;
}
this.sendToClient({emulator_shell: args, id: this._emu_cb_id}, -1);
this._emu_cb_id += 1;
},
emulatorCmdResult: function emulatorCmdResult(message) { emulatorCmdResult: function emulatorCmdResult(message) {
if (this.context != "chrome") { if (this.context != "chrome") {
this.sendAsync("emulatorCmdResult", message, -1); this.sendAsync("emulatorCmdResult", message, -1);
@ -2325,6 +2336,7 @@ MarionetteServerConnection.prototype = {
} }
break; break;
case "Marionette:runEmulatorCmd": case "Marionette:runEmulatorCmd":
case "Marionette:runEmulatorShell":
this.sendToClient(message.json, -1); this.sendToClient(message.json, -1);
break; break;
case "Marionette:switchToFrame": case "Marionette:switchToFrame":

View File

@ -22,7 +22,7 @@ this.Marionette = function Marionette(scope, window, context, logObj, timeout,
Marionette.prototype = { Marionette.prototype = {
exports: ['ok', 'is', 'isnot', 'log', 'getLogs', 'generate_results', 'waitFor', exports: ['ok', 'is', 'isnot', 'log', 'getLogs', 'generate_results', 'waitFor',
'runEmulatorCmd', 'TEST_PASS', 'TEST_KNOWN_FAIL', 'runEmulatorCmd', 'runEmulatorShell', 'TEST_PASS', 'TEST_KNOWN_FAIL',
'TEST_UNEXPECTED_FAIL'], 'TEST_UNEXPECTED_FAIL'],
ok: function Marionette__ok(condition, name, passString, failString, diag) { ok: function Marionette__ok(condition, name, passString, failString, diag) {
@ -163,5 +163,10 @@ Marionette.prototype = {
this.scope.runEmulatorCmd(cmd, callback); this.scope.runEmulatorCmd(cmd, callback);
}, },
runEmulatorShell: function runEmulatorShell(args, callback) {
this.heartbeatCallback();
this.scope.runEmulatorShell(args, callback);
},
}; };