From edf2cb0e5740bb599c90a3a664d256085484dbca Mon Sep 17 00:00:00 2001 From: muendelezaji Date: Fri, 20 May 2016 13:45:08 +0100 Subject: [PATCH] Simplify parameters & improve reliability of slide show test --- wlauto/workloads/googleslides/__init__.py | 52 ++++---- .../com.arm.wlauto.uiauto.googleslides.jar | Bin 14292 -> 13879 bytes .../com/arm/wlauto/uiauto/UiAutomation.java | 126 +++++++----------- 3 files changed, 77 insertions(+), 101 deletions(-) diff --git a/wlauto/workloads/googleslides/__init__.py b/wlauto/workloads/googleslides/__init__.py index 8e0116bd..67c0accb 100644 --- a/wlauto/workloads/googleslides/__init__.py +++ b/wlauto/workloads/googleslides/__init__.py @@ -47,21 +47,26 @@ class GoogleSlides(AndroidUiAutoBenchmark): If ``True``, dumpsys captures will be carried out during the test run. The output is piped to log files which are then pulled from the phone. '''), - Parameter('local_files', kind=list_of_strings, + Parameter('local_file', kind=str, description=''' - If specified, the workload will push the PowerPoint files to be used for + If specified, the workload will push the PowerPoint file to be used for testing on the device. Otherwise, a file will be created inside the app. '''), + Parameter('slide_count', kind=int, default=5, + description=''' + Number of slides in aforementioned local file. Determines number of + swipe actions when playing slide show. + '''), ] instrumentation_log = '{}_instrumentation.log'.format(name) - file_prefix = 'wa_test_' - device_dir = '/sdcard/Download' - local_dir = '.' # self.dependencies_directory def __init__(self, device, **kwargs): super(GoogleSlides, self).__init__(device, **kwargs) 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 + self.wa_test_file = 'wa_test_' + self.local_file self.run_timeout = 300 def validate(self): @@ -70,22 +75,22 @@ class GoogleSlides(AndroidUiAutoBenchmark): self.uiauto_params['dumpsys_enabled'] = self.dumpsys_enabled self.uiauto_params['output_dir'] = self.device.working_directory self.uiauto_params['results_file'] = self.output_file - if self.local_files: - wa_files = [self.wa_filename(f) for f in self.local_files] - self.uiauto_params['local_files'] = '::'.join(wa_files) + if self.local_file: + self.uiauto_params['local_file'] = self.wa_test_file + self.uiauto_params['slide_count'] = self.slide_count def initialize(self, context): log_method(self, 'initialize') super(GoogleSlides, self).initialize(context) - if self.local_files: - # push local PPT files + if self.local_file: + # push local PPT file for entry in os.listdir(self.local_dir): - if entry.endswith('.pptx'): - self.device.push_file(path.join(self.local_dir, entry), - path.join(self.device_dir, self.wa_filename(entry)), + if entry is self.local_file: + self.device.push_file(path.join(self.local_dir, self.local_file), + path.join(self.device_dir, self.wa_test_file), timeout=60) - # Force a re-index of the mediaserver cache to pick up new files - # self.device.execute('am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard') + 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') @@ -98,24 +103,21 @@ class GoogleSlides(AndroidUiAutoBenchmark): def update_result(self, context): log_method(self, 'update_result') super(GoogleSlides, self).update_result(context) - not_implemented(self, 'get_metrics(context)') + not_implemented(self, 'self.get_metrics(context)') def teardown(self, context): log_method(self, 'teardown') super(GoogleSlides, self).teardown(context) - not_implemented(self, 'pull_logs(context)') - self.device.execute('am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard') + not_implemented(self, 'self.pull_logs(context)') def finalize(self, context): log_method(self, 'finalize') super(GoogleSlides, self).finalize(context) - if self.local_files: - # delete pushed PPT files - for entry in os.listdir(self.local_dir): - if entry.endswith('.pptx'): - self.device.delete_file(path.join(self.device_dir, self.wa_filename(entry))) - # Force a re-index of the mediaserver cache to pick up new files - # self.device.execute('am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard') + if self.local_file: + # delete pushed PPT file + for entry in self.device.listdir(self.device_dir): + if entry is self.wa_test_file: + self.device.delete_file(path.join(self.device_dir, entry)) def wa_filename(self, filename): return self.file_prefix + filename diff --git a/wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar b/wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar index f0ff5ea5963a9eb936b4bc92275a7d64b7daef6e..d6231d4dc3c09ffcef792f664685e3c9a07e43d6 100644 GIT binary patch delta 13666 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 A`Tzg` delta 14082 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 diff --git a/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java index 423b4233..69dfb4c7 100644 --- a/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java +++ b/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -53,8 +53,9 @@ public class UiAutomation extends UxPerfUiAutomation { public static final int BY_DESC = 3; public static final int ONE_SECOND_IN_MS = 1000; + public static final int DEFAULT_SWIPE_STEPS = 20; - public static final String DOC_FILENAME = "UX Perf Slides"; + public static final String NEW_DOC_FILENAME = "UX Perf Slides"; public static final String DOCUMENTATION_WORKLOADS = "class Workload(Extension):\n\tname = None\n\tdef init_resources(self, context):\n\t\tpass\n" @@ -77,16 +78,18 @@ public class UiAutomation extends UxPerfUiAutomation { protected Bundle parameters; protected boolean dumpsysEnabled; protected String outputDir; - protected String[] documents; - protected boolean useLocalFiles; + 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"); - documents = parameters.getString("local_files", "::").split("::"); - useLocalFiles = documents.length != 0; + localFile = parameters.getString("local_file", ""); + slideCount = Integer.parseInt(parameters.getString("slide_count")); + useLocalFile = localFile != null; } public void runUiAutomation() throws Exception { @@ -94,12 +97,11 @@ public class UiAutomation extends UxPerfUiAutomation { parseParams(parameters); skipWelcomeScreen(); enablePowerpointCompat(); - if (useLocalFiles) { - testSlideshowFromStorage(documents[0]); + if (useLocalFile) { + testSlideshowFromStorage(localFile); } else { - testEditNewSlidesDocument(DOC_FILENAME); + testEditNewSlidesDocument(NEW_DOC_FILENAME); } - if (false) { // TODO currently unused writeResultsToFile(results, parameters.getString("results_file")); } @@ -111,21 +113,21 @@ public class UiAutomation extends UxPerfUiAutomation { } protected void enablePowerpointCompat() throws Exception { - uiDeviceEdgeSwipeFromLeft(10); + uiDeviceSwipeHorizontal(0, getDisplayWidth()/2, getDisplayHeight()/2); clickView(BY_TEXT, "Settings", true); clickView(BY_TEXT, "Create PowerPoint"); getUiDevice().pressBack(); sleep(1); } - protected void testSlideshowFromStorage(String document) throws Exception { + protected void testSlideshowFromStorage(String docName) throws Exception { // Sometimes docs deleted in __init__.py falsely appear on the app's home // For robustness, it's nice to remove these placeholders // However, the test should not crash because of it, so a silent catch is used - UiObject docView = new UiObject(new UiSelector().textContains(document)); + UiObject docView = new UiObject(new UiSelector().textContains(docName)); if (docView.waitForExists(ONE_SECOND_IN_MS)) { try { - deleteDocument(document); + deleteDocument(docName); } catch (Exception e) { // do nothing } @@ -137,24 +139,32 @@ public class UiAutomation extends UxPerfUiAutomation { if (permissionView.waitForExists(ONE_SECOND_IN_MS)) { clickView(BY_TEXT, "Allow"); } - try { - clickView(BY_TEXT, document); - } catch (UiObjectNotFoundException e) { - // Click failed, scroll down and retry - UiScrollable list = new UiScrollable(new UiSelector().className("android.widget.ListView")); - list.scrollIntoView(new UiSelector().textContains(document)); - clickView(BY_TEXT, document); - } + // Scroll through document list if necessary + UiScrollable list = new UiScrollable(new UiSelector().className("android.widget.ListView")); + list.scrollIntoView(new UiSelector().textContains(docName)); + clickView(BY_TEXT, docName); clickView(BY_TEXT, "Open", CLASS_BUTTON, true); sleep(5); - clickView(BY_DESC, "Start slideshow", true); int centerY = getUiDevice().getDisplayHeight() / 2; int centerX = getUiDevice().getDisplayWidth() / 2; - int slidesLeft = 10; + int slidesLeft = slideCount - 1; + // scroll forward in edit mode while (slidesLeft-- > 0) { - getUiDevice().swipe(centerX + centerX/2, centerY, centerX - centerX/2, centerY, 20); - sleep(2); + uiDeviceSwipeHorizontal(centerX + centerX/2, centerX - centerX/2, centerY); + sleep(1); + } + sleep(1); + // scroll backward in edit mode + while (++slidesLeft < slideCount - 1) { + uiDeviceSwipeHorizontal(centerX - centerX/2, centerX + centerX/2, centerY); + sleep(1); + } + // scroll forward in slideshow mode + clickView(BY_DESC, "Start slideshow", true); + while (--slidesLeft > 0) { + uiDeviceSwipeHorizontal(centerX + centerX/2, centerX - centerX/2, centerY); + sleep(1); } getUiDevice().pressBack(); getUiDevice().pressBack(); @@ -230,6 +240,17 @@ public class UiAutomation extends UxPerfUiAutomation { view.clickAndWaitForNewWindow(); } + public UiObject enterTextInSlide(String viewName, String textToEnter) throws Exception { + UiObject view = getViewByDesc(viewName); + view.click(); + sleepMicro(100); + view.click(); // double click + view.setText(textToEnter); + getUiDevice().pressBack(); + sleepMicro(200); + return view; + } + public void saveDocument(String docName) throws Exception { clickView(BY_TEXT, "SAVE"); clickView(BY_TEXT, "Device"); @@ -250,17 +271,6 @@ public class UiAutomation extends UxPerfUiAutomation { sleep(1); } - public UiObject enterTextInSlide(String viewName, String textToEnter) throws Exception { - UiObject view = getViewByDesc(viewName); - view.click(); - sleepMicro(100); - view.click(); // double click - view.setText(textToEnter); - getUiDevice().pressBack(); - sleepMicro(200); - return view; - } - public void deleteDocument(String docName) throws Exception { UiObject doc = getViewByText(docName); doc.longClick(); @@ -345,47 +355,11 @@ public class UiAutomation extends UxPerfUiAutomation { return object; } - public void uiDeviceEdgeSwipeFromLeft(int steps) { - int height = getDisplayHeight(); - int width = getDisplayWidth(); - getUiDevice().swipe(0, height/2, width/2, height/2, steps); + public void uiDeviceSwipeHorizontal(int startX, int endX, int height) { + uiDeviceSwipeHorizontal(startX, endX, height, DEFAULT_SWIPE_STEPS); } - public void tapDisplayNormalised(double percentX, double percentY) { - double x = Math.max(0, Math.min(1, percentX)); - double y = Math.max(0, Math.min(1, percentY)); - int tapX = (int) Math.floor(x * getDisplayWidth()); - int tapY = (int) Math.floor(y * getDisplayHeight()); - getUiDevice().click(tapX, tapY); - } - - public void toggleWifiState(boolean flag) throws Exception { - int exitValue = -1; - // To enable, check for "UninitializedState" - // String checkFor = flag ? "UninitializedState" : "ConnectedState"; - // exitValue = runShellCommand("dumpsys wifi | grep curState=" + checkFor); - // if (0 == exitValue) { // toggle state - String statusString = flag ? "ConnectedState" : "UninitializedState"; - exitValue = runShellCommand("dumpsys wifi | grep curState=" + statusString); - if (0 != exitValue) { // not in the expected so toggle it - String[] adbCommands = { - "am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings;", - "input keyevent 20;", - "input keyevent 23;", - "sleep 1;", - "input keyevent 4;", - }; - for (String command : adbCommands) { - exitValue = runShellCommand(command); - } - } - sleep(1); - } - - public int runShellCommand(String command) throws Exception { - Process proc = Runtime.getRuntime().exec(command); - Log.d(TAG, String.format("Command:\n%s\nExit value:%d\n", command, proc.exitValue())); - proc.waitFor(); - return proc.exitValue(); + public void uiDeviceSwipeHorizontal(int startX, int endX, int height, int steps) { + getUiDevice().swipe(startX, height, endX, height, steps); } }