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

Side by Side Diff: build/android/pylib/remote/device/remote_device_environment.py

Issue 879983002: Add multiple device/os filtering and a config file. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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 | « build/android/pylib/remote/device/example.config ('k') | build/android/test_runner.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 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 """Environment setup and teardown for remote devices.""" 5 """Environment setup and teardown for remote devices."""
6 6
7 from distutils import version
jbudorick 2015/01/27 20:01:50 changed my mind, import distutils.version I don't
rnephew (Wrong account) 2015/01/27 21:07:23 Done.
8 import json
7 import logging 9 import logging
8 import os 10 import os
9 import random 11 import random
10 import sys 12 import sys
11 13
12 from pylib import constants 14 from pylib import constants
13 from pylib.base import environment 15 from pylib.base import environment
14 from pylib.remote.device import appurify_sanitized 16 from pylib.remote.device import appurify_sanitized
15 from pylib.remote.device import remote_device_helper 17 from pylib.remote.device import remote_device_helper
16 18
17 class RemoteDeviceEnvironment(environment.Environment): 19 class RemoteDeviceEnvironment(environment.Environment):
18 """An environment for running on remote devices.""" 20 """An environment for running on remote devices."""
19 21
20 _ENV_KEY = 'env' 22 _ENV_KEY = 'env'
21 _DEVICE_KEY = 'device' 23 _DEVICE_KEY = 'device'
22 24
23 def __init__(self, args, error_func): 25 def __init__(self, args, error_func):
24 """Constructor. 26 """Constructor.
25 27
26 Args: 28 Args:
27 args: Command line arguments. 29 args: Command line arguments.
28 error_func: error to show when using bad command line arguments. 30 error_func: error to show when using bad command line arguments.
29 """ 31 """
30 super(RemoteDeviceEnvironment, self).__init__() 32 super(RemoteDeviceEnvironment, self).__init__()
31 33
32 if args.api_key_file: 34 if args.api_key_file:
33 with open(args.api_key_file) as api_key_file: 35 with open(args.api_key_file) as api_key_file:
34 self._api_key = api_key_file.read().strip() 36 self._api_key = api_key_file.read().strip()
35 elif args.api_key: 37 else:
36 self._api_key = args.api_key 38 self._api_key = args.api_key
37 else:
38 error_func('Must set api key with --api-key or --api-key-file')
39 39
40 if args.api_secret_file: 40 if args.api_secret_file:
41 with open(args.api_secret_file) as api_secret_file: 41 with open(args.api_secret_file) as api_secret_file:
42 self._api_secret = api_secret_file.read().strip() 42 self._api_secret = api_secret_file.read().strip()
43 elif args.api_secret: 43 else:
44 self._api_secret = args.api_secret 44 self._api_secret = args.api_secret
45 else:
46 error_func('Must set api secret with --api-secret or --api-secret-file')
47 45
48 if not args.api_protocol:
49 error_func('Must set api protocol with --api-protocol. Example: http')
50 self._api_protocol = args.api_protocol 46 self._api_protocol = args.api_protocol
51
52 if not args.api_address:
53 error_func('Must set api address with --api-address')
54 self._api_address = args.api_address 47 self._api_address = args.api_address
55
56 if not args.api_port:
57 error_func('Must set api port with --api-port.')
58 self._api_port = args.api_port 48 self._api_port = args.api_port
59 49
60 self._access_token = '' 50 self._access_token = ''
61 self._results_path = args.results_path 51 self._results_path = args.results_path
62 self._remote_device = args.remote_device 52 self._remote_device = args.remote_device
63 self._remote_device_os = args.remote_device_os 53 self._remote_device_os = args.remote_device_os
54 self._remote_device_minimum_os = args.remote_device_minimum_os
64 self._runner_package = args.runner_package 55 self._runner_package = args.runner_package
65 self._runner_type = args.runner_type 56 self._runner_type = args.runner_type
66 self._device = '' 57 self._device = ''
67 self._verbose_count = args.verbose_count 58 self._verbose_count = args.verbose_count
68 self._device_type = args.device_type 59 self._device_type = args.device_type
69 self._timeouts = { 60 self._timeouts = {
70 'queueing': 60 * 10, 61 'queueing': 60 * 10,
71 'installing': 60 * 10, 62 'installing': 60 * 10,
72 'in-progress': 60 * 30, 63 'in-progress': 60 * 30,
73 'unknown': 60 * 5 64 'unknown': 60 * 5
74 } 65 }
75 66
67 if args.remote_device_file:
68 with open(args.remote_device_file) as device_file:
69 device_json = json.load(device_file)
70 self._remote_device = device_json.get(
71 'remote_device', self._remote_device)
72 self._remote_device_os = device_json.get(
73 'remote_device_os', self._remote_device_os)
74 self._remote_device_minimum_os = device_json.get(
75 'remote_device_minimum_os', self._remote_device_minimum_os)
76 self._api_address = device_json.get('api_address', self._api_address)
77 self._api_secret = device_json.get('api_secret', self._api_secret)
78 self._api_key = device_json.get('api_key', self._api_key)
79 self._api_protocol = device_json.get('api_protocol', self._api_protocol)
80 self._api_port = device_json.get('api_port', self._api_port)
81 self._timeouts = device_json.get('timeouts', self._timeouts)
82
83 if not self._api_address:
84 error_func('Must set api address with --api-address'
85 'or in --remote-device-file.')
86 if not self._api_protocol:
87 error_func('Must set api protocol with --api-protocol'
88 ' or in --remote-device-file. Example: http')
89 if not self._api_key:
90 error_func('Must set api key with --api-key, --api-key-file'
91 'or in --remote-device-file')
92 if not self._api_secret:
93 error_func('Must set api secret with --api-secret, --api-secret-file'
94 'or in --remote-device-file')
95 if not self._api_port:
96 error_func('Must set api port with --api-port'
97 'or in --remote-device-file')
98 if not isinstance(self._timeouts, dict):
99 error_func('Timeouts must be a dictionary.')
100 if ('queueing' not in self._timeouts
101 or 'installing' not in self._timeouts
102 or 'in-progress' not in self._timeouts
103 or 'unknown' not in self._timeouts) :
104 error_func('Timeouts must contain queueing,'
105 ' installing, in-progress, and unknown.')
106
jbudorick 2015/01/27 20:01:50 Perhaps we should log the attributes here? (Minus
rnephew (Wrong account) 2015/01/27 21:07:23 Done.
76 if not args.trigger and not args.collect: 107 if not args.trigger and not args.collect:
77 self._trigger = True 108 self._trigger = True
78 self._collect = True 109 self._collect = True
79 else: 110 else:
80 self._trigger = args.trigger 111 self._trigger = args.trigger
81 self._collect = args.collect 112 self._collect = args.collect
82 113
83 def SetUp(self): 114 def SetUp(self):
84 """Set up the test environment.""" 115 """Set up the test environment."""
85 os.environ['APPURIFY_API_PROTO'] = self._api_protocol 116 os.environ['APPURIFY_API_PROTO'] = self._api_protocol
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 def _SelectDevice(self): 171 def _SelectDevice(self):
141 """Select which device to use.""" 172 """Select which device to use."""
142 logging.info('Finding device to run tests on.') 173 logging.info('Finding device to run tests on.')
143 with appurify_sanitized.SanitizeLogging(self._verbose_count, 174 with appurify_sanitized.SanitizeLogging(self._verbose_count,
144 logging.WARNING): 175 logging.WARNING):
145 dev_list_res = appurify_sanitized.api.devices_list(self._access_token) 176 dev_list_res = appurify_sanitized.api.devices_list(self._access_token)
146 remote_device_helper.TestHttpResponse(dev_list_res, 177 remote_device_helper.TestHttpResponse(dev_list_res,
147 'Unable to generate access token.') 178 'Unable to generate access token.')
148 device_list = dev_list_res.json()['response'] 179 device_list = dev_list_res.json()['response']
149 random.shuffle(device_list) 180 random.shuffle(device_list)
150 for device in device_list: 181 for device in device_list:
jbudorick 2015/01/27 20:01:50 It may be helpful to be able to select on OEM (I t
rnephew (Wrong account) 2015/01/27 21:07:23 Done.
151 if device['os_name'] != self._device_type: 182 if device['os_name'] != self._device_type:
152 continue 183 continue
153 if self._remote_device and device['name'] != self._remote_device: 184 if self._remote_device and device['name'] not in self._remote_device:
154 continue 185 continue
155 if (self._remote_device_os 186 if (self._remote_device_os
156 and device['os_version'] != self._remote_device_os): 187 and device['os_version'] not in self._remote_device_os):
188 continue
189 if (self._remote_device_minimum_os
190 and version.LooseVersion(device['os_version'])
191 < version.LooseVersion(self._remote_device_minimum_os)):
157 continue 192 continue
158 if ((self._remote_device and self._remote_device_os) 193 if ((self._remote_device and self._remote_device_os)
159 or device['available_devices_count']): 194 or device['available_devices_count']):
160 logging.info('Found device: %s %s', 195 logging.info('Found device: %s %s',
161 device['name'], device['os_version']) 196 device['name'], device['os_version'])
162 return device 197 return device
163 self._NoDeviceFound(device_list) 198 self._NoDeviceFound(device_list)
164 199
165 def _PrintAvailableDevices(self, device_list): 200 def _PrintAvailableDevices(self, device_list):
166 def compare_devices(a,b): 201 def compare_devices(a,b):
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 def trigger(self): 251 def trigger(self):
217 return self._trigger 252 return self._trigger
218 253
219 @property 254 @property
220 def verbose_count(self): 255 def verbose_count(self):
221 return self._verbose_count 256 return self._verbose_count
222 257
223 @property 258 @property
224 def device_type(self): 259 def device_type(self):
225 return self._device_type 260 return self._device_type
OLDNEW
« no previous file with comments | « build/android/pylib/remote/device/example.config ('k') | build/android/test_runner.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698