From 39e96ed6707e83b6aa6eaf38ff8234c9a248c849 Mon Sep 17 00:00:00 2001 From: muendelezaji Date: Fri, 20 May 2016 15:00:47 +0100 Subject: [PATCH] Extra instrumentation for Slides - Also: add benchmarking and dumpsys helper class/methods --- wlauto/workloads/googleslides/__init__.py | 25 +++--- .../com.arm.wlauto.uiauto.googleslides.jar | Bin 13879 -> 14610 bytes .../com/arm/wlauto/uiauto/UiAutomation.java | 71 ++++++++++++++++-- 3 files changed, 78 insertions(+), 18 deletions(-) diff --git a/wlauto/workloads/googleslides/__init__.py b/wlauto/workloads/googleslides/__init__.py index 67c0accb..aa6ce12f 100644 --- a/wlauto/workloads/googleslides/__init__.py +++ b/wlauto/workloads/googleslides/__init__.py @@ -20,9 +20,6 @@ from wlauto import AndroidUiAutoBenchmark, Parameter from wlauto.utils.types import list_of_strings -def not_implemented(workload, text): - workload.logger.info('## ++ NOT IMPLEMENTED ++ ##\n## {}\n## -- NOT IMPLEMENTED -- ##'.format(text)) - def log_method(workload, name): workload.logger.info('===== {}() ======'.format(name)) @@ -63,11 +60,12 @@ class GoogleSlides(AndroidUiAutoBenchmark): def __init__(self, device, **kwargs): super(GoogleSlides, self).__init__(device, **kwargs) + self.run_timeout = 300 self.output_file = path.join(self.device.working_directory, self.instrumentation_log) self.local_dir = self.dependencies_directory - self.device_dir = path.join(self.device.working_directory, '..', 'Download') # Android downloads folder + # Android downloads folder + self.device_dir = path.join(self.device.working_directory, '..', 'Download') self.wa_test_file = 'wa_test_' + self.local_file - self.run_timeout = 300 def validate(self): log_method(self, 'validate') @@ -89,8 +87,6 @@ class GoogleSlides(AndroidUiAutoBenchmark): self.device.push_file(path.join(self.local_dir, self.local_file), path.join(self.device_dir, self.wa_test_file), timeout=60) - self.logger.info(path.join(self.local_dir, self.local_file)) - self.logger.info(path.join(self.device_dir, self.wa_test_file)) def setup(self, context): log_method(self, 'setup') @@ -103,12 +99,12 @@ class GoogleSlides(AndroidUiAutoBenchmark): def update_result(self, context): log_method(self, 'update_result') super(GoogleSlides, self).update_result(context) - not_implemented(self, 'self.get_metrics(context)') + self.get_metrics(context) def teardown(self, context): log_method(self, 'teardown') super(GoogleSlides, self).teardown(context) - not_implemented(self, 'self.pull_logs(context)') + self.pull_logs(context) def finalize(self, context): log_method(self, 'finalize') @@ -126,13 +122,16 @@ class GoogleSlides(AndroidUiAutoBenchmark): self.device.pull_file(self.output_file, context.output_directory) metrics_file = path.join(context.output_directory, self.instrumentation_log) with open(metrics_file, 'r') as wfh: - regex = re.compile(r'(\w+)\s+(\d+)\s+(\d+)\s+(\d+)') + regex = re.compile(r'(?P\w+)\s+(?P\d+)\s+(?P\d+)\s+(?P\d+)') for line in wfh: match = regex.search(line) if match: - context.result.add_metric((match.group(1) + '_start'), match.group(2)) - context.result.add_metric((match.group(1) + '_finish'), match.group(3)) - context.result.add_metric((match.group(1) + '_duration'), match.group(4)) + context.result.add_metric(match.group('key') + "_start", + match.group('value1'), units='ms') + context.result.add_metric(match.group('key') + "_finish", + match.group('value2'), units='ms') + context.result.add_metric(match.group('key') + "_duration", + match.group('value3'), units='ms') def pull_logs(self, context): wd = self.device.working_directory diff --git a/wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar b/wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar index d6231d4dc3c09ffcef792f664685e3c9a07e43d6..4d8ce0e3f04bd787dbe6aff9c9d1d511e88f6736 100644 GIT binary patch delta 14385 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 results = new LinkedHashMap(); protected Bundle parameters; @@ -81,17 +82,50 @@ public class UiAutomation extends UxPerfUiAutomation { protected String localFile; protected int slideCount; protected boolean useLocalFile; - protected String resultsFile; public void parseParams(Bundle parameters) throws Exception { dumpsysEnabled = Boolean.parseBoolean(parameters.getString("dumpsys_enabled")); outputDir = parameters.getString("output_dir"); - resultsFile = parameters.getString("results_file"); localFile = parameters.getString("local_file", ""); slideCount = Integer.parseInt(parameters.getString("slide_count")); useLocalFile = localFile != null; } + interface MeasurableAction { + public void perform() throws Exception; + } + + public class Benchmarker { + protected Map benchResults = new LinkedHashMap(); + + public Map getResults() { + return benchResults; + } + + public void measure(String tag, MeasurableAction action) throws Exception { + Timer timer = new Timer(); + timer.start(); + action.perform(); + timer.end(); + benchResults.put(tag, timer); + } + } + + public void startDumpsys(String viewName) throws Exception { + if (!dumpsysEnabled) + return; + initDumpsysSurfaceFlinger(PACKAGE, viewName); + initDumpsysGfxInfo(PACKAGE); + } + + public void endDumpsys(String viewName, String testTag) throws Exception { + if (!dumpsysEnabled) + return; + String dumpsysTag = TAG + "_" + testTag; + exitDumpsysSurfaceFlinger(PACKAGE, viewName, new File(outputDir, dumpsysTag + "_surfFlinger.log")); + exitDumpsysGfxInfo(PACKAGE, new File(outputDir, dumpsysTag + "_gfxInfo.log")); + } + public void runUiAutomation() throws Exception { parameters = getParams(); parseParams(parameters); @@ -102,21 +136,48 @@ public class UiAutomation extends UxPerfUiAutomation { } else { testEditNewSlidesDocument(NEW_DOC_FILENAME); } - if (false) { // TODO currently unused - writeResultsToFile(results, parameters.getString("results_file")); - } + results.putAll(bench.getResults()); + writeResultsToFile(results, parameters.getString("results_file")); } protected void skipWelcomeScreen() throws Exception { + String testTag = "skip_welcome"; + Timer timer = new Timer(); + timer.start(); clickView(BY_TEXT, "Skip", true); + timer.end(); + results.put(testTag, timer); +/* + bench.measure(testTag, new MeasurableAction() { + public void perform() throws Exception { + clickView(BY_TEXT, "Skip", true); + } + }); +*/ sleep(1); } protected void enablePowerpointCompat() throws Exception { + String testTag = "enable_ppt_compat"; + Timer timer = new Timer(); + timer.start(); uiDeviceSwipeHorizontal(0, getDisplayWidth()/2, getDisplayHeight()/2); clickView(BY_TEXT, "Settings", true); clickView(BY_TEXT, "Create PowerPoint"); getUiDevice().pressBack(); + timer.end(); + results.put(testTag, timer); +/* + bench.measure(testTag, new MeasurableAction() { + @Override + public void perform() throws Exception { + uiDeviceSwipeHorizontal(0, getDisplayWidth()/2, getDisplayHeight()/2); + clickView(BY_TEXT, "Settings", true); + clickView(BY_TEXT, "Create PowerPoint"); + getUiDevice().pressBack(); + } + }); +*/ sleep(1); }