Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Instead of monkeyrunner, create our own client which uses the protocol

Seems to be some socket issues with the upstream monkeyrunner, sigh...
  • Loading branch information...
commit 8d034212bc38c1fc80b9fe792c0b06919c74141a 1 parent 1f4e4ee
@wlach wlach authored
Showing with 67 additions and 13 deletions.
  1. +66 −12 bin/devicecontroller.py
  2. +1 −1  bin/runtest.py
View
78 bin/devicecontroller.py
@@ -6,24 +6,78 @@
# part of the tools provided with the Android SDK (see:
# http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html)
+import select
+import socket
+import subprocess
import sys
import time
-from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
-class Device(object):
+import mozdevice
- def __init__(self):
- self.device = MonkeyRunner.waitForConnection()
- self.width = int(self.device.getProperty('display.width'))
- self.height = int(self.device.getProperty('display.height'))
+class MonkeyConnection(object):
+
+ def __init__(self, port=9999):
+ # kill any existing instances of the monkey process
+ droid = mozdevice.DroidADB()
+ droid.killProcess('app_process')
+
+ subprocess.check_call(["adb", "forward", "tcp:%s" % port, "tcp:%s" % port])
+ p = subprocess.Popen(["adb", "shell", "monkey", "--port", str(port)])
+
+ connected = False
+ tries = 0
+ while not connected and tries < 20:
+ time.sleep(0.5)
+ try:
+ self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self._sock.connect(('localhost', port))
+ self.dimensions = self._get_display_dimensions()
+ connected = True
+ except Exception, e:
+ print "Can't connect to localhost:%s, retrying..." % port
+ tries+=1
+
+ if not connected:
+ raise Exception("Could not open monkey connection!")
+ print "Connected!"
+ time.sleep(1)
+
+ def _send_cmd(self, cmd):
+ select.select([], [self._sock], [])
+ sent = self._sock.send("%s\r\n" % cmd)
+ ret = None
+ while not ret:
+ select.select([self._sock], [], [])
+ ret = self._sock.recv(1024)
+ if not ret.startswith("OK"):
+ raise Exception("Exception running command '%s'. Got: %s" % (cmd, ret))
+ if len(ret) > 3:
+ return ret[3:]
+ return ""
+
+ def _get_display_dimensions(self):
+ width = int(self._send_cmd("getvar display.width"))
+ height = int(self._send_cmd("getvar display.height"))
+ return [width, height]
+
+ def drag(self, touch_start, touch_end, duration=1.0, num_steps=5):
+ self._send_cmd("touch down %s %s" % touch_start)
+ delta = ((touch_end[0] - touch_start[0]) / num_steps,
+ (touch_end[1] - touch_start[1]) / num_steps)
+ for i in range(num_steps):
+ current = (touch_start[0] + delta[0]*i,
+ touch_start[1] + delta[1]*i)
+ self._send_cmd("touch move %s %s" % current)
+ time.sleep(duration/num_steps)
+ self._send_cmd("touch up %s %s" % touch_end)
def scroll_down(self):
- x = int(self.width / 2)
- ybottom = self.height - 100
- ytop = 200
- self.device.drag((x,ybottom), (x, ytop), 0.1, 5)
+ x = int(self.dimensions[0] / 2)
+ ybottom = self.dimensions[1] - 100
+ ytop = 120
+ self.drag((x,ybottom), (x,ytop), 0.1, 5)
-device = Device()
+connection = MonkeyConnection()
print "READY"
sys.stdout.flush()
@@ -47,7 +101,7 @@ def scroll_down(self):
print "QUIT: %s" % time.time()
break
elif cmd == "scroll_down":
- device.scroll_down()
+ connection.scroll_down()
elif cmd == "sleep":
sleeptime = 1
if len(params) > 0:
View
2  bin/runtest.py
@@ -74,7 +74,7 @@ def __init__(self, capture_metadata, capture_file, controller):
# open up a monkeyrunner process on startup, wait for it to give a
# line so we don't have to wait
# for it later (note that not all tests use monkeyrunner)
- args = ['monkeyrunner', os.path.join(BINDIR, 'devicecontroller.py')]
+ args = ['python', os.path.join(BINDIR, 'devicecontroller.py')]
self.monkey_proc = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
line = self.monkey_proc.stdout.readline()
Please sign in to comment.
Something went wrong with that request. Please try again.