#!/usr/bin/env python import eideticker manifest = eideticker.get_test_manifest() testkeys = [test["key"] for test in manifest.active_tests()] for key in sorted(testkeys): print key
def main(args=sys.argv[1:]): usage = "usage: %prog [options] <product> <test> <output dir>" parser = eideticker.CaptureOptionParser(usage=usage) parser.add_option("--enable-profiling", action="store_true", dest = "enable_profiling", help = "Create SPS profile to go along with capture") parser.add_option("--device-id", action="store", dest="device_id", help="id of device (used in output json)") parser.add_option("--apk", action="store", dest="apk", help = "Product apk to get metadata from " \ "(Android-specific)") parser.add_option("--baseline", action="store_true", dest="baseline", help = "Create baseline results for dashboard") parser.add_option("--num-runs", action="store", type = "int", dest = "num_runs", help = "number of runs (default: 1)") parser.add_option("--app-version", action="store", dest="app_version", help="Specify app version (if not automatically " \ "available; Android-specific)") parser.add_option("--sources-xml", action="store", dest="sources_xml", help="Path to sources XML file for getting revision " \ "information (B2G-specific)") options, args = parser.parse_args() parser.validate_options(options) (productname, testkey, outputdir) = args num_runs = 1 if options.num_runs: num_runs = options.num_runs manifest = eideticker.get_test_manifest() # sanity check... does the test match a known test key? testkeys = [test["key"] for test in manifest.active_tests()] if testkey not in testkeys: print "ERROR: No tests matching '%s' (options: %s)" % (testkey, ", ".join(testkeys)) sys.exit(1) testinfo = [test for test in manifest.active_tests() if test['key'] == testkey][0] device_id = options.device_id if not device_id: device_id = os.environ.get('DEVICE_ID') if not device_id: print "ERROR: Must specify device id (either with --device-id or with DEVICE_ID environment variable)" sys.exit(1) # we'll log http requests for webstartup tests only log_http_requests = False if testinfo['type'] == 'webstartup': log_http_requests = True product = eideticker.get_product(productname) current_date = time.strftime("%Y-%m-%d") capture_name = "%s (taken on %s)" % (product['name'], current_date) datafile = os.path.join(outputdir, device_id, '%s.json' % testkey) data = NestedDict() if os.path.isfile(datafile): data.update(json.loads(open(datafile).read())) device_prefs = eideticker.getDevicePrefs(options) device = eideticker.getDevice(**device_prefs) devices = {} devicefile = os.path.join(outputdir, 'devices.json') if os.path.isfile(devicefile): devices = json.loads(open(devicefile).read())['devices'] testfile = os.path.join(outputdir, '%s' % device_id, 'tests.json') if os.path.isfile(testfile): tests = json.loads(open(testfile).read())['tests'] else: tests = {} tests[testkey] = { 'shortDesc': testinfo['shortDesc'], 'defaultMeasure': testinfo['defaultMeasure'] } if options.devicetype == "android": devices[device_id] = { 'name': device.model, 'version': device.getprop('ro.build.version.release') } if options.apk: if options.app_version: raise Exception("Should specify either --app-version or --apk, not both!") appinfo = eideticker.get_fennec_appinfo(options.apk) appname = appinfo['appname'] print "Using application name '%s' from apk '%s'" % (appname, options.apk) capture_name = "%s %s" % (product['name'], appinfo['appdate']) else: if not options.app_version: raise Exception("Should specify --app-version if not --apk!") # no apk, assume it's something static on the device appinfo = { 'appdate': time.strftime("%Y-%m-%d"), 'version': options.app_version } appname = product['appname'] elif options.devicetype == "b2g": if not options.sources_xml: raise Exception("Must specify --sources-xml on b2g!") devices[device_id] = { 'name': device.model } appinicontents = device.pullFile('/system/b2g/application.ini') sfh = StringIO.StringIO(appinicontents) appinfo = eideticker.get_appinfo(sfh) appinfo.update(get_revision_data(options.sources_xml)) appname = None else: print "Unknown device type '%s'!" % options.devicetype # update the device / test list for the dashboard with open(devicefile, 'w') as f: f.write(json.dumps({ 'devices': devices })) testfiledir = os.path.dirname(testfile) if not os.path.exists(testfiledir): os.mkdir(testfiledir) with open(testfile, 'w') as f: f.write(json.dumps({ 'tests': tests })) capture_area = None if options.capture_area: # we validated this previously... capture_area = json.loads(options.capture_area) # Run the test the specified number of times for i in range(num_runs): # Now run the test runtest(device, device_prefs, options.capture_device, capture_area, product, appname, appinfo, testinfo, capture_name + " #%s" % i, outputdir, datafile, data, enable_profiling=options.enable_profiling, log_http_requests=log_http_requests, baseline=options.baseline) if options.devicetype == "android": # Kill app after test complete device.killProcess(appname)