| Index: build/android/gmail_test.py
|
| diff --git a/build/android/gmail_test.py b/build/android/gmail_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..21d09a8c39ffe24d1f432974069f336698071582
|
| --- /dev/null
|
| +++ b/build/android/gmail_test.py
|
| @@ -0,0 +1,183 @@
|
| +#!/usr/bin/env python
|
| +#
|
| +# Copyright 2017 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import os
|
| +import sys
|
| +import BaseHTTPServer
|
| +import subprocess
|
| +import argparse
|
| +import datetime
|
| +import signal
|
| +import psutil
|
| +
|
| +import time
|
| +
|
| +import devil_chromium
|
| +from devil.android import device_utils
|
| +from devil.utils import run_tests_helper
|
| +
|
| +from multiprocessing import Process,Queue
|
| +from pylib.constants import host_paths
|
| +
|
| +START_TRACING_CMD = "third_party/catapult/systrace/systrace/"
|
| +START_TRACING_ARGS = ['-a', 'com.google.android.gm', 'webview']
|
| +
|
| +def RunTests(device, test_filter=None, title=None):
|
| + target = ('org.chromium.webview_ui_test.test/android.support.test.runner.'
|
| + 'AndroidJUnitRunner')
|
| + extras = {}
|
| + if test_filter is not None:
|
| + extras.update({'class': test_filter})
|
| + if title is not None:
|
| + extras.update({'title': title})
|
| + device.StartInstrumentation(target, extras=extras, timeout=300, retries=0)
|
| +
|
| +def ParseArgs(argv):
|
| + timestring = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
|
| + parser = argparse.ArgumentParser()
|
| + parser.add_argument('-t', dest='trace_output', required=False,
|
| + default='gmail_logs/%s/trace-'+timestring+'-',
|
| + help='Trace output file')
|
| + parser.add_argument('-l', dest='logcat_output', required=False,
|
| + default='gmail_logs/%s/logcat-'+timestring+'.log',
|
| + help='Logcat output file')
|
| + parser.add_argument('-s', dest='serial', required=True, help='Device serial')
|
| + parser.add_argument('-f', dest='test_filter', help='Test filter')
|
| + parser.add_argument('-e', dest='email_title', default='Long Text',
|
| + help='Email titles')
|
| + return parser.parse_args(argv[1:])
|
| +
|
| +def GetDevice(serial):
|
| + devices = device_utils.DeviceUtils.HealthyDevices()
|
| + for d in devices:
|
| + if d.serial == serial:
|
| + return d
|
| + raise Exception('No pixel device found')
|
| +
|
| +def SetUpDeviceAndGetLogcat(device):
|
| + device.ForceStop('com.google.android.gm')
|
| + device.SetProp('log.tag.GmailAnalytics', 'VERBOSE')
|
| +
|
| +def StartServer(port, q, trace_output, pipe, serial):
|
| + server_address = ('', port)
|
| + handler_class = GmailTracingRequestHandler
|
| + handler_class.protocol_version = 'HTTP/1.0'
|
| + httpd = GmailTracingServer(
|
| + server_address, handler_class, q, trace_output, pipe, serial)
|
| + sa = httpd.socket.getsockname()
|
| + print "Serving One HTTP on", sa[0], "port", sa[1], "..."
|
| + httpd.serve_forever()
|
| +
|
| +def StartServerWithProcess(port, trace_output, serial, pipe):
|
| + q = Queue()
|
| + p = Process(target=StartServer, args=(port, q, trace_output, pipe, serial))
|
| + p.start()
|
| + return p
|
| +
|
| +def WaitAndKill(pid):
|
| + time.sleep(400)
|
| + psutil.Process(pid).terminate()
|
| +
|
| +def StartTrace(pipe, output_file, serial):
|
| + cmd_path = os.path.abspath(os.path.join(
|
| + host_paths.DIR_SOURCE_ROOT, 'third_party', 'catapult', 'systrace',
|
| + 'systrace', 'run_systrace.py'))
|
| + full_cmd = [cmd_path] + ['-o', output_file, '-e', serial] + START_TRACING_ARGS
|
| + print(full_cmd)
|
| + tp = subprocess.Popen(full_cmd, stdin=pipe[0], stdout=None, stderr=None)
|
| + return tp
|
| +
|
| +class GmailTracingRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| + def do_GET(self):
|
| + queue = self.server.queue
|
| + if 'start-tracing' in self.path:
|
| + if (queue.empty()):
|
| + name = self.path.split('/')[-1]
|
| + tracing_process = StartTrace(
|
| + self.server.pipe, self.server.trace_output + name + '.html',
|
| + self.server.serial)
|
| + queue.put(tracing_process)
|
| + self.send_response(200, 'started to trace')
|
| + else:
|
| + self.send_error(500, 'tracing process already exist')
|
| + elif 'end-tracing' in self.path:
|
| + if (queue.empty()):
|
| + self.send_error(
|
| + 500, 'tracing process does not exist yet, please request '
|
| + '/start-tracing first')
|
| + else:
|
| + os.write(self.server.pipe[1], '\n')
|
| + self.send_response(200, 'ended to trace')
|
| + tracing_process = queue.get()
|
| + tracing_process.wait()
|
| + else:
|
| + self.send_error(404, 'Only allow /start-tracing or /end-tracing')
|
| +
|
| +def main():
|
| + run_tests_helper.SetLogLevel(2)
|
| + arguments = ParseArgs(sys.argv)
|
| + email_title_no_space = arguments.email_title.replace(' ', '')
|
| + output_dir = os.path.abspath(
|
| + os.path.join(
|
| + host_paths.DIR_SOURCE_ROOT, 'gmail_logs', email_title_no_space))
|
| + if not os.path.exists(os.path.abspath(output_dir)):
|
| + os.mkdir(output_dir)
|
| + device = GetDevice(arguments.serial)
|
| + device.adb.Reverse('tcp:7777', 'tcp:7777', allow_rebind=True)
|
| + # logcat_output = os.path.abspath(os.path.join(
|
| + # host_paths.DIR_SOURCE_ROOT,
|
| + # arguments.logcat_output % email_title_no_space))
|
| + # logcat_monitor = None
|
| + p = None
|
| + kp = None
|
| + pipe = os.pipe()
|
| + try:
|
| + SetUpDeviceAndGetLogcat(device)
|
| + # logcat_monitor.Start()
|
| + p = StartServerWithProcess(
|
| + 7777, arguments.trace_output % email_title_no_space,
|
| + arguments.serial, pipe)
|
| + RunTests(device, arguments.test_filter, arguments.email_title)
|
| + finally:
|
| + # if logcat_monitor is not None:
|
| + # logcat_monitor.Stop()
|
| + # logcat_monitor.Close()
|
| + time.sleep(5)
|
| + if pipe is not None:
|
| + os.write(pipe[1], '\n')
|
| + if kp is not None:
|
| + kp.terminate()
|
| + if p is not None:
|
| + p.terminate()
|
| +
|
| +class GmailTracingServer(BaseHTTPServer.HTTPServer):
|
| + def __init__(self, server_address, RequestHandlerClass, queue,
|
| + trace_output, pipe, serial):
|
| + BaseHTTPServer.HTTPServer.__init__(
|
| + self, server_address, RequestHandlerClass)
|
| + self._queue = queue
|
| + self._trace_output = trace_output
|
| + self._pipe = pipe
|
| + self._serial = serial
|
| +
|
| + @property
|
| + def serial(self):
|
| + return self._serial
|
| +
|
| + @property
|
| + def pipe(self):
|
| + return self._pipe
|
| +
|
| + @property
|
| + def queue(self):
|
| + return self._queue
|
| +
|
| + @property
|
| + def trace_output(self):
|
| + return self._trace_output
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(main())
|
|
|