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

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 | « no previous file | build/android/test_runner.py » ('j') | build/android/test_runner.py » ('J')
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 import distutils.version
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
55 self._device_oem=args.device_oem
jbudorick 2015/01/28 16:09:54 nit: spaces around =
rnephew (Wrong account) 2015/01/28 16:47:53 Done.
64 self._runner_package = args.runner_package 56 self._runner_package = args.runner_package
65 self._runner_type = args.runner_type 57 self._runner_type = args.runner_type
66 self._device = '' 58 self._device = ''
67 self._verbose_count = args.verbose_count 59 self._verbose_count = args.verbose_count
68 self._device_type = args.device_type 60 self._device_type = args.device_type
69 self._timeouts = { 61 self._timeouts = {
70 'queueing': 60 * 10, 62 'queueing': 60 * 10,
71 'installing': 60 * 10, 63 'installing': 60 * 10,
72 'in-progress': 60 * 30, 64 'in-progress': 60 * 30,
73 'unknown': 60 * 5 65 'unknown': 60 * 5
74 } 66 }
67 # Example config file:
68 # {
69 # "remote_device": ["Galaxy S4", "Galaxy S3"],
jbudorick 2015/01/28 16:09:54 nit: 2 space indent
rnephew (Wrong account) 2015/01/28 16:47:53 Done.
70 # "remote_device_os": ["4.4.2", "4.4.4"],
71 # "remote_device_minimum_os": "4.4.2"
jbudorick 2015/01/28 23:19:09 comma at the end
rnephew (Wrong account) 2015/01/29 01:58:34 Done.
72 # "api_address": www.example.com
jbudorick 2015/01/28 23:19:09 needs quotes around example and a comma at the end
rnephew (Wrong account) 2015/01/29 01:58:34 Done.
73 # "api_port": "80",
74 # "api_protocol": "http",
75 # "api_secret": "apisecret",
76 # "api_key": "apikey",
77 # "timeouts": {
78 # "queueing": 600,
jbudorick 2015/01/28 16:09:54 nit: 2 space indent
rnephew (Wrong account) 2015/01/28 16:47:53 Done.
79 # "installing": 600,
80 # "in-progress": 1800,
81 # "unknown": 300
82 # }
83 # }
84 if (args.remote_device_file
85 and ( args.remote_device_os or args.remote_device)):
jbudorick 2015/01/28 16:09:54 nit: no space after (
rnephew (Wrong account) 2015/01/28 16:47:53 Done.
86 error_func('Cannot set --remote-device-file and --remote-device-os or'
87 ' --remote-device')
88
89 if args.remote_device_file:
90 with open(args.remote_device_file) as device_file:
91 device_json = json.load(device_file)
92 self._remote_device = device_json.get('remote_device', None)
93 self._remote_device_os = device_json.get('remote_device_os', None)
94 self._remote_device_minimum_os = device_json.get(
95 'remote_device_minimum_os', None)
96 self._api_address = device_json.get('api_address', None)
jbudorick 2015/01/28 23:19:09 I think you mentioned this somewhere (out-of-band?
rnephew (Wrong account) 2015/01/29 01:58:34 I kept them as none, and switched them to have com
97 self._api_secret = device_json.get('api_secret', None)
98 self._api_key = device_json.get('api_key', None)
99 self._api_protocol = device_json.get('api_protocol', None)
100 self._api_port = device_json.get('api_port', None)
101 self._timeouts = device_json.get('timeouts', self._timeouts)
jbudorick 2015/01/28 16:09:54 Could we let a user specify only some of the timeo
rnephew (Wrong account) 2015/01/28 16:47:53 Done.
102 self._device_type = device_json.get('device_type', self._device_type)
103 self._device_oem = device_json.get('device_oem', None)
104
105 if not self._api_address:
106 error_func('Must set api address with --api-address'
107 'or in --remote-device-file.')
jbudorick 2015/01/28 23:19:09 same as below
rnephew (Wrong account) 2015/01/29 01:58:34 Done.
108 if not self._api_protocol:
109 error_func('Must set api protocol with --api-protocol'
110 ' or in --remote-device-file. Example: http')
111 if not self._api_key:
112 error_func('Must set api key with --api-key, --api-key-file'
113 'or in --remote-device-file')
jbudorick 2015/01/28 23:19:09 needs a space before "or"
rnephew (Wrong account) 2015/01/29 01:58:34 Done.
114 if not self._api_secret:
115 error_func('Must set api secret with --api-secret, --api-secret-file'
116 'or in --remote-device-file')
jbudorick 2015/01/28 23:19:09 same
rnephew (Wrong account) 2015/01/29 01:58:34 Done.
117 if not self._api_port:
118 error_func('Must set api port with --api-port'
119 'or in --remote-device-file')
jbudorick 2015/01/28 23:19:09 same
rnephew (Wrong account) 2015/01/29 01:58:34 Done.
120 if not isinstance(self._timeouts, dict):
121 error_func('Timeouts must be a dictionary.')
122 if ('queueing' not in self._timeouts
123 or 'installing' not in self._timeouts
124 or 'in-progress' not in self._timeouts
125 or 'unknown' not in self._timeouts) :
126 error_func('Timeouts must contain queueing,'
127 ' installing, in-progress, and unknown.')
128
129 logging.info('Remote device: %s', self._remote_device)
130 logging.info('Remote device os: %s', self._remote_device_os)
131 logging.info('Remote device minimum os: %s',
132 self._remote_device_minimum_os)
133 logging.info('Remote device OEM: %s', self._device_oem)
134 logging.info('Remote device type: %s', self._device_type)
135 logging.info('Api address: %s', self._api_address)
136 logging.info('Api protocol: %s', self._api_protocol)
137 logging.info('Api port: %s', self._api_port)
138 logging.info('Timeouts: %s', self._timeouts)
75 139
76 if not args.trigger and not args.collect: 140 if not args.trigger and not args.collect:
77 self._trigger = True 141 self._trigger = True
78 self._collect = True 142 self._collect = True
79 else: 143 else:
80 self._trigger = args.trigger 144 self._trigger = args.trigger
81 self._collect = args.collect 145 self._collect = args.collect
82 146
83 def SetUp(self): 147 def SetUp(self):
84 """Set up the test environment.""" 148 """Set up the test environment."""
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 with appurify_sanitized.SanitizeLogging(self._verbose_count, 207 with appurify_sanitized.SanitizeLogging(self._verbose_count,
144 logging.WARNING): 208 logging.WARNING):
145 dev_list_res = appurify_sanitized.api.devices_list(self._access_token) 209 dev_list_res = appurify_sanitized.api.devices_list(self._access_token)
146 remote_device_helper.TestHttpResponse(dev_list_res, 210 remote_device_helper.TestHttpResponse(dev_list_res,
147 'Unable to generate access token.') 211 'Unable to generate access token.')
148 device_list = dev_list_res.json()['response'] 212 device_list = dev_list_res.json()['response']
149 random.shuffle(device_list) 213 random.shuffle(device_list)
150 for device in device_list: 214 for device in device_list:
151 if device['os_name'] != self._device_type: 215 if device['os_name'] != self._device_type:
152 continue 216 continue
153 if self._remote_device and device['name'] != self._remote_device: 217 if self._remote_device and device['name'] not in self._remote_device:
154 continue 218 continue
155 if (self._remote_device_os 219 if (self._remote_device_os
156 and device['os_version'] != self._remote_device_os): 220 and device['os_version'] not in self._remote_device_os):
221 continue
222 if (self._device_oem and device['brand'] != self._device_oem):
jbudorick 2015/01/28 16:09:54 Let's make device_oem a list, too.
rnephew (Wrong account) 2015/01/28 16:47:53 Done.
223 continue
224 if (self._remote_device_minimum_os
225 and distutils.version.LooseVersion(device['os_version'])
226 < distutils.version.LooseVersion(self._remote_device_minimum_os)):
157 continue 227 continue
158 if ((self._remote_device and self._remote_device_os) 228 if ((self._remote_device and self._remote_device_os)
159 or device['available_devices_count']): 229 or device['available_devices_count']):
160 logging.info('Found device: %s %s', 230 logging.info('Found device: %s %s',
161 device['name'], device['os_version']) 231 device['name'], device['os_version'])
162 return device 232 return device
163 self._NoDeviceFound(device_list) 233 self._NoDeviceFound(device_list)
164 234
165 def _PrintAvailableDevices(self, device_list): 235 def _PrintAvailableDevices(self, device_list):
166 def compare_devices(a,b): 236 def compare_devices(a,b):
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 def trigger(self): 286 def trigger(self):
217 return self._trigger 287 return self._trigger
218 288
219 @property 289 @property
220 def verbose_count(self): 290 def verbose_count(self):
221 return self._verbose_count 291 return self._verbose_count
222 292
223 @property 293 @property
224 def device_type(self): 294 def device_type(self):
225 return self._device_type 295 return self._device_type
OLDNEW
« no previous file with comments | « no previous file | build/android/test_runner.py » ('j') | build/android/test_runner.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698