# 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 os
import httplib2
import mozfile
import mozinstall
from mozprofile
import Profile
from mozrunner
import FirefoxRunner
class TPSFirefoxRunner(object):
PROCESS_TIMEOUT = 240
def __init__(self, binary):
if binary
is not None and (
"http://" in binary
or "ftp://" in binary):
self.url = binary
self.binary =
None
else:
self.url =
None
self.binary = binary
self.installdir =
None
def __del__(self):
if self.installdir:
mozfile.remove(self.installdir,
True)
def download_url(self, url, dest=
None):
h = httplib2.Http()
resp, content = h.request(url,
"GET")
if dest
is None:
dest = os.path.basename(url)
local = open(dest,
"wb")
local.write(content)
local.close()
return dest
def download_build(self, installdir=
"downloadedbuild", appname=
"firefox"):
self.installdir = os.path.abspath(installdir)
buildName = os.path.basename(self.url)
pathToBuild = os.path.join(
os.path.dirname(os.path.abspath(__file__)), buildName
)
# delete the build if it already exists
if os.access(pathToBuild, os.F_OK):
os.remove(pathToBuild)
# download the build
print(
"downloading build")
self.download_url(self.url, pathToBuild)
# install the build
print(
"installing {}".format(pathToBuild))
mozfile.remove(self.installdir,
True)
binary = mozinstall.install(src=pathToBuild, dest=self.installdir)
# remove the downloaded archive
os.remove(pathToBuild)
return binary
def run(self, profile=
None, timeout=PROCESS_TIMEOUT, env=
None, args=
None):
"""Runs the given FirefoxRunner with the given Profile, waits
for completion, then returns the process exit code
"""
if profile
is None:
profile = Profile()
self.profile = profile
if self.binary
is None and self.url:
self.binary = self.download_build()
runner = FirefoxRunner(
profile=self.profile, binary=self.binary, env=env, cmdargs=args
)
runner.start(timeout=timeout)
return runner.wait()