Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: build/android/pylib/local/device/local_device_instrumentation_test_run.py

Issue 2791613003: [Instrumentation Test Speed] Install apks in parallel with concurrent_adb enabled (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import os 6 import os
7 import posixpath 7 import posixpath
8 import re 8 import re
9 import time 9 import time
10 10
11 from devil.android import device_errors 11 from devil.android import device_errors
12 from devil.android import flag_changer 12 from devil.android import flag_changer
13 from devil.android.sdk import shared_prefs 13 from devil.android.sdk import shared_prefs
14 from devil.utils import reraiser_thread 14 from devil.utils import reraiser_thread
15 from pylib import valgrind_tools 15 from pylib import valgrind_tools
16 from pylib.android import logdog_logcat_monitor 16 from pylib.android import logdog_logcat_monitor
17 from pylib.base import base_test_result 17 from pylib.base import base_test_result
18 from pylib.instrumentation import instrumentation_test_instance 18 from pylib.instrumentation import instrumentation_test_instance
19 from pylib.local.device import local_device_environment 19 from pylib.local.device import local_device_environment
20 from pylib.local.device import local_device_test_run 20 from pylib.local.device import local_device_test_run
21 from pylib.utils import logdog_helper 21 from pylib.utils import logdog_helper
22 from py_trace_event import trace_event 22 from py_trace_event import trace_event
23 from py_utils import contextlib_ext 23 from py_utils import contextlib_ext
24 import tombstones 24 import tombstones
25 25
26 from multiprocessing.pool import ThreadPool
27
26 _TAG = 'test_runner_py' 28 _TAG = 'test_runner_py'
27 29
28 TIMEOUT_ANNOTATIONS = [ 30 TIMEOUT_ANNOTATIONS = [
29 ('Manual', 10 * 60 * 60), 31 ('Manual', 10 * 60 * 60),
30 ('IntegrationTest', 30 * 60), 32 ('IntegrationTest', 30 * 60),
31 ('External', 10 * 60), 33 ('External', 10 * 60),
32 ('EnormousTest', 10 * 60), 34 ('EnormousTest', 10 * 60),
33 ('LargeTest', 5 * 60), 35 ('LargeTest', 5 * 60),
34 ('MediumTest', 3 * 60), 36 ('MediumTest', 3 * 60),
35 ('SmallTest', 1 * 60), 37 ('SmallTest', 1 * 60),
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 #override 70 #override
69 def TestPackage(self): 71 def TestPackage(self):
70 return self._test_instance.suite 72 return self._test_instance.suite
71 73
72 #override 74 #override
73 def SetUp(self): 75 def SetUp(self):
74 @local_device_environment.handle_shard_failures_with( 76 @local_device_environment.handle_shard_failures_with(
75 self._env.BlacklistDevice) 77 self._env.BlacklistDevice)
76 @trace_event.traced 78 @trace_event.traced
77 def individual_device_set_up(dev, host_device_tuples): 79 def individual_device_set_up(dev, host_device_tuples):
80 def single_apk_install(apk_permission_pair):
81 apk = apk_permission_pair[0]
82 permissions = apk_permission_pair[1]
83 dev.Install(apk, permissions=permissions)
84
85 def single_incremental_apk_install(dev_apk_script_array):
86 dev = dev_apk_script_array[0]
87 apk = dev_apk_script_array[1]
88 incremental_install_script = dev_apk_script_array[2]
89 local_device_test_run.IncrementalInstall(
90 dev, apk, incremental_install_script)
91
92 def single_apk_install_helper(array):
93 if len(array) == 2:
94 single_apk_install(array)
95 elif len(array) == 3:
96 single_incremental_apk_install(array)
97 else:
98 raise Exception('incorrect input array')
99
100 @trace_event.traced
78 def install_apk(): 101 def install_apk():
102 apk_resource_array = []
79 if self._test_instance.apk_under_test: 103 if self._test_instance.apk_under_test:
80 if self._test_instance.apk_under_test_incremental_install_script: 104 if self._test_instance.apk_under_test_incremental_install_script:
81 local_device_test_run.IncrementalInstall( 105 apk_resource_array.append([
82 dev, 106 dev,
83 self._test_instance.apk_under_test, 107 self._test_instance.apk_under_test,
84 self._test_instance.apk_under_test_incremental_install_script) 108 self._test_instance.apk_under_test_incremental_install_script])
85 else: 109 else:
86 permissions = self._test_instance.apk_under_test.GetPermissions() 110 permissions = self._test_instance.apk_under_test.GetPermissions()
87 dev.Install(self._test_instance.apk_under_test, 111 apk_resource_array.append(
88 permissions=permissions) 112 [self._test_instance.apk_under_test, permissions])
89 113
90 if self._test_instance.test_apk_incremental_install_script: 114 if self._test_instance.test_apk_incremental_install_script:
91 local_device_test_run.IncrementalInstall( 115 apk_resource_array.append([
92 dev, 116 dev,
93 self._test_instance.test_apk, 117 self._test_instance.test_apk,
94 self._test_instance.test_apk_incremental_install_script) 118 self._test_instance.test_apk_incremental_install_script])
95 else: 119 else:
96 permissions = self._test_instance.test_apk.GetPermissions() 120 permissions = self._test_instance.test_apk.GetPermissions()
97 dev.Install(self._test_instance.test_apk, permissions=permissions) 121 apk_resource_array.append(
122 [self._test_instance.test_apk, permissions])
98 123
99 for apk in self._test_instance.additional_apks: 124 for apk in self._test_instance.additional_apks:
100 dev.Install(apk) 125 apk_resource_array.append([apk, None])
126
127 if self._env.concurrent_adb:
128 pool = ThreadPool(processes=len(apk_resource_array))
jbudorick 2017/04/01 00:58:19 Instead of using a ThreadPool, split apk installat
129 pool.map(single_apk_install_helper, apk_resource_array)
130 else:
131 for apk_resource in apk_resource_array:
132 single_apk_install_helper(apk_resource)
101 133
102 # Set debug app in order to enable reading command line flags on user 134 # Set debug app in order to enable reading command line flags on user
103 # builds 135 # builds
104 if self._test_instance.flags: 136 if self._test_instance.flags:
105 if not self._test_instance.package_info: 137 if not self._test_instance.package_info:
106 logging.error("Couldn't set debug app: no package info") 138 logging.error("Couldn't set debug app: no package info")
107 elif not self._test_instance.package_info.package: 139 elif not self._test_instance.package_info.package:
108 logging.error("Couldn't set debug app: no package defined") 140 logging.error("Couldn't set debug app: no package defined")
109 else: 141 else:
110 dev.RunShellCommand(['am', 'set-debug-app', '--persistent', 142 dev.RunShellCommand(['am', 'set-debug-app', '--persistent',
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 logging.error("Couldn't set flags: no cmdline_file") 190 logging.error("Couldn't set flags: no cmdline_file")
159 else: 191 else:
160 self._CreateFlagChangerIfNeeded(dev) 192 self._CreateFlagChangerIfNeeded(dev)
161 logging.debug('Attempting to set flags: %r', 193 logging.debug('Attempting to set flags: %r',
162 self._test_instance.flags) 194 self._test_instance.flags)
163 self._flag_changers[str(dev)].AddFlags(self._test_instance.flags) 195 self._flag_changers[str(dev)].AddFlags(self._test_instance.flags)
164 196
165 valgrind_tools.SetChromeTimeoutScale( 197 valgrind_tools.SetChromeTimeoutScale(
166 dev, self._test_instance.timeout_scale) 198 dev, self._test_instance.timeout_scale)
167 199
168 steps = (install_apk, edit_shared_prefs, push_test_data, 200 steps = (install_apk, edit_shared_prefs, push_test_data,
jbudorick 2017/04/01 00:58:19 ... and then add the steps here.
169 create_flag_changer) 201 create_flag_changer)
170 if self._env.concurrent_adb: 202 if self._env.concurrent_adb:
171 reraiser_thread.RunAsync(steps) 203 reraiser_thread.RunAsync(steps)
172 else: 204 else:
173 for step in steps: 205 for step in steps:
174 step() 206 step()
175 if self._test_instance.store_tombstones: 207 if self._test_instance.store_tombstones:
176 tombstones.ClearAllTombstones(dev) 208 tombstones.ClearAllTombstones(dev)
177 209
178 self._env.parallel_devices.pMap( 210 self._env.parallel_devices.pMap(
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 if k in annotations: 463 if k in annotations:
432 timeout = v 464 timeout = v
433 break 465 break
434 else: 466 else:
435 logging.warning('Using default 1 minute timeout for %s', test_name) 467 logging.warning('Using default 1 minute timeout for %s', test_name)
436 timeout = 60 468 timeout = 60
437 469
438 timeout *= cls._GetTimeoutScaleFromAnnotations(annotations) 470 timeout *= cls._GetTimeoutScaleFromAnnotations(annotations)
439 471
440 return timeout 472 return timeout
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698