blob: 2902982aa39130d0d12e034c2e222beeb07bc089 [file] [log] [blame]
#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
import urllib2
import sys
import os
import site
site.addsitedir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../lib/python"))
from sut_lib import connect, log
# Constants
target_version = "1.20"
apkfilename = "sutAgentAndroid.apk"
device_name = os.getenv('SUT_NAME')
apkFoopyDirPattern = "/builds/%(device_name)s"
apkFoopyDir = apkFoopyDirPattern % {'device_name': device_name}
version_pattern = 'SUTAgentAndroid Version %s'
RETCODE_SUCCESS = 0
RETCODE_APK_DL_FAILED = 1
RETCODE_REVERIFY_FAILED = 2
RETCODE_REVERIFY_WRONG = 3
def isVersionCorrect(dm=None, ver=None):
assert ver is not None or dm is not None # We allow only one to be set
if not ver:
ver = version(dm)
return ver == (version_pattern % target_version)
def doUpdate(dm):
_oldDebug = dm.debug
log.info("updateSUT.py: We're going to try to install SUTAgentAndroid Version %s" % target_version)
try:
data = download_apk()
except Exception, e:
log.error("Automation Error: updateSUT.py: We have failed to retrieve the SUT Agent. %s" % str(e))
return RETCODE_APK_DL_FAILED
dm._runCmds([{'cmd': 'push /mnt/sdcard/%s %s' % (apkfilename, str(
len(data))), 'data': data}])
dm.debug = 5
dm._runCmds([{'cmd': 'updt com.mozilla.SUTAgentAndroid /mnt/sdcard/%s' %
apkfilename}])
# XXX devicemanager.py might need to close the sockets so we won't need
# these 2 steps
if dm._sock:
dm._sock.close()
dm._sock = None
dm = None
ver = None
tries = 0
while tries < 5:
try:
dm = connect(device_name, sleep=90)
break
except:
tries += 1
log.warning("Automation Error: updateSUT.py: We have tried to connect %s time(s) after trying to update." % tries)
try:
ver = version(dm)
except Exception, e:
log.error("Automation Error: updateSUT.py: We should have been able to get the version")
log.error("Automation Error: updateSUT.py: %s" % e)
return RETCODE_REVERIFY_FAILED
dm.debug = _oldDebug # Restore it
if ver is None:
log.error("Automation Error: updateSUT.py: We should have been able to connect and determine the version.")
return RETCODE_REVERIFY_FAILED
elif not isVersionCorrect(ver=ver):
log.error("Automation Error: updateSUT.py: We should have had the %s version but instead we have %s" %
(target_version, ver))
return RETCODE_REVERIFY_WRONG
else:
log.info("updateSUT.py: We're now running %s" % ver)
return RETCODE_SUCCESS
def main(device):
dm = connect(device)
if not isVersionCorrect(dm=dm):
return doUpdate(dm)
else:
# The SUT Agent was already up-to-date
return RETCODE_SUCCESS
def version(dm):
ver = dm._runCmds([{'cmd': 'ver'}]).split("\n")[0]
log.info("INFO: updateSUT.py: We're running %s" % ver)
return ver
def download_apk():
url = 'http://talos-bundles.pvt.build.mozilla.org/mobile/sutAgentAndroid.%s.apk' % target_version
log.info("INFO: updateSUT.py: We're downloading the apk: %s" % url)
req = urllib2.Request(url)
try:
f = urllib2.urlopen(req)
except urllib2.URLError, e:
reason = getattr(e, "reason", "SUT-Undef")
code = getattr(e, "code", "SUT-Undef")
raise Exception("Automation Error: updateSUT.py: code: %s; reason: %s" % (code, reason))
local_file_name = os.path.join(apkFoopyDir, apkfilename)
local_file = open(local_file_name, 'wb')
local_file.write(f.read())
local_file.close()
f = open(local_file_name, 'rb')
data = f.read()
f.close()
return data
if __name__ == '__main__':
if (len(sys.argv) != 2):
if os.getenv('SUT_NAME') in (None, ''):
print "usage: updateSUT.py [device name]"
print " Must have $SUT_NAME set in environ to omit device name"
sys.exit(1)
else:
print "INFO: Using device '%s' found in env variable" % device_name
else:
device_name = sys.argv[1]
apkFoopyDir = apkFoopyDirPattern % {'device_name': device_name}
# Exit 5 if an error, for buildbot RETRY
ret = 0
if main(device_name):
ret = 5
sys.stdout.flush()
sys.exit(ret)
else:
if device_name in (None, ''):
raise ImportError("To use updateSUT.py non-standalone you need SUT_NAME defined in environment")
else:
log.debug("updateSUT: Using device '%s' found in env variable" %
device_name)