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

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, 10 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') | 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 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
34 if (args.remote_device_file
rnephew (Wrong account) 2015/01/29 15:44:26 Since it now has command line options overriding t
jbudorick 2015/01/29 17:52:56 I don't think it does.
rnephew (Wrong account) 2015/01/29 22:10:26 Done.
35 and (args.remote_device_os or args.remote_device)):
36 error_func('Cannot set --remote-device-file and --remote-device-os or'
37 ' --remote-device')
38 self._access_token = ''
39 self._device = ''
40 self._timeouts = {
41 'queueing': 60 * 10,
42 'installing': 60 * 10,
43 'in-progress': 60 * 30,
44 'unknown': 60 * 5
45 }
46 self._device_type = args.device_type
47 # Example config file:
48 # {
49 # "remote_device": ["Galaxy S4", "Galaxy S3"],
50 # "remote_device_os": ["4.4.2", "4.4.4"],
51 # "remote_device_minimum_os": "4.4.2",
52 # "api_address": "www.example.com",
53 # "api_port": "80",
54 # "api_protocol": "http",
55 # "api_secret": "apisecret",
56 # "api_key": "apikey",
57 # "timeouts": {
58 # "queueing": 600,
59 # "installing": 600,
60 # "in-progress": 1800,
61 # "unknown": 300
62 # }
63 # }
64 if args.remote_device_file:
65 with open(args.remote_device_file) as device_file:
66 device_json = json.load(device_file)
67 self._remote_device = device_json.get('remote_device', None)
68 self._remote_device_os = device_json.get('remote_device_os', None)
69 self._remote_device_minimum_os = device_json.get(
70 'remote_device_minimum_os', None)
71 self._api_address = device_json.get('api_address', None)
72 self._api_secret = device_json.get('api_secret', None)
73 self._api_key = device_json.get('api_key', None)
74 self._api_protocol = device_json.get('api_protocol', None)
75 self._api_port = device_json.get('api_port', None)
76 self._device_type = device_json.get('device_type', self._device_type)
77 self._device_oem = device_json.get('device_oem', None)
78 if 'timeouts' in device_json:
79 for key in device_json['timeouts']:
80 self._timeouts[key] = device_json['timeouts'][key]
81
32 if args.api_key_file: 82 if args.api_key_file:
33 with open(args.api_key_file) as api_key_file: 83 with open(args.api_key_file) as api_key_file:
34 self._api_key = api_key_file.read().strip() 84 self._api_key = api_key_file.read().strip()
35 elif args.api_key: 85 elif args.api_key:
36 self._api_key = args.api_key 86 self._api_key = args.api_key
37 else:
38 error_func('Must set api key with --api-key or --api-key-file')
39 87
40 if args.api_secret_file: 88 if args.api_secret_file:
41 with open(args.api_secret_file) as api_secret_file: 89 with open(args.api_secret_file) as api_secret_file:
42 self._api_secret = api_secret_file.read().strip() 90 self._api_secret = api_secret_file.read().strip()
43 elif args.api_secret: 91 elif args.api_secret:
44 self._api_secret = args.api_secret 92 self._api_secret = args.api_secret
45 else:
46 error_func('Must set api secret with --api-secret or --api-secret-file')
47 93
48 if not args.api_protocol: 94 if args.api_protocol:
49 error_func('Must set api protocol with --api-protocol. Example: http') 95 self._api_protocol = args.api_protocol
50 self._api_protocol = args.api_protocol 96 if args.api_address:
97 self._api_address = args.api_address
98 if args.api_port:
99 self._api_port = args.api_port
100 if args.results_path:
101 self._results_path = args.results_path
102 if args.remote_device:
103 self._remote_device = args.remote_device
104 if args.remote_device_os:
105 self._remote_device_os = args.remote_device_os
106 if args.remote_device_minimum_os:
107 self._remote_device_minimum_os = args.remote_device_minimum_os
108 if args.device_oem:
109 self._device_oem = args.device_oem
110 if args.runner_package:
111 self._runner_package = args.runner_package
112 if args.runner_type:
113 self._runner_type = args.runner_type
114 if args.verbose_count:
115 self._verbose_count = args.verbose_count
51 116
52 if not args.api_address: 117 if not self._api_address:
53 error_func('Must set api address with --api-address') 118 error_func('Must set api address with --api-address'
54 self._api_address = args.api_address 119 ' or in --remote-device-file.')
120 if not self._api_protocol:
121 error_func('Must set api protocol with --api-protocol'
122 ' or in --remote-device-file. Example: http')
123 if not self._api_key:
124 error_func('Must set api key with --api-key, --api-key-file'
125 ' or in --remote-device-file')
126 if not self._api_secret:
127 error_func('Must set api secret with --api-secret, --api-secret-file'
128 ' or in --remote-device-file')
129 if not self._api_port:
130 error_func('Must set api port with --api-port'
131 ' or in --remote-device-file')
132 if not isinstance(self._timeouts, dict):
133 error_func('Timeouts must be a dictionary.')
134 if ('queueing' not in self._timeouts
135 or 'installing' not in self._timeouts
136 or 'in-progress' not in self._timeouts
137 or 'unknown' not in self._timeouts) :
138 error_func('Timeouts must contain queueing,'
139 ' installing, in-progress, and unknown.')
55 140
56 if not args.api_port: 141 logging.info('Remote device: %s', self._remote_device)
57 error_func('Must set api port with --api-port.') 142 logging.info('Remote device os: %s', self._remote_device_os)
58 self._api_port = args.api_port 143 logging.info('Remote device minimum os: %s',
59 144 self._remote_device_minimum_os)
60 self._access_token = '' 145 logging.info('Remote device OEM: %s', self._device_oem)
61 self._results_path = args.results_path 146 logging.info('Remote device type: %s', self._device_type)
62 self._remote_device = args.remote_device 147 logging.info('Api address: %s', self._api_address)
63 self._remote_device_os = args.remote_device_os 148 logging.info('Api protocol: %s', self._api_protocol)
64 self._runner_package = args.runner_package 149 logging.info('Api port: %s', self._api_port)
65 self._runner_type = args.runner_type 150 logging.info('Timeouts: %s', self._timeouts)
66 self._device = ''
67 self._verbose_count = args.verbose_count
68 self._device_type = args.device_type
69 self._timeouts = {
70 'queueing': 60 * 10,
71 'installing': 60 * 10,
72 'in-progress': 60 * 30,
73 'unknown': 60 * 5
74 }
75 151
76 if not args.trigger and not args.collect: 152 if not args.trigger and not args.collect:
77 self._trigger = True 153 self._trigger = True
78 self._collect = True 154 self._collect = True
79 else: 155 else:
80 self._trigger = args.trigger 156 self._trigger = args.trigger
81 self._collect = args.collect 157 self._collect = args.collect
82 158
83 def SetUp(self): 159 def SetUp(self):
84 """Set up the test environment.""" 160 """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, 219 with appurify_sanitized.SanitizeLogging(self._verbose_count,
144 logging.WARNING): 220 logging.WARNING):
145 dev_list_res = appurify_sanitized.api.devices_list(self._access_token) 221 dev_list_res = appurify_sanitized.api.devices_list(self._access_token)
146 remote_device_helper.TestHttpResponse(dev_list_res, 222 remote_device_helper.TestHttpResponse(dev_list_res,
147 'Unable to generate access token.') 223 'Unable to generate access token.')
148 device_list = dev_list_res.json()['response'] 224 device_list = dev_list_res.json()['response']
149 random.shuffle(device_list) 225 random.shuffle(device_list)
150 for device in device_list: 226 for device in device_list:
151 if device['os_name'] != self._device_type: 227 if device['os_name'] != self._device_type:
152 continue 228 continue
153 if self._remote_device and device['name'] != self._remote_device: 229 if self._remote_device and device['name'] not in self._remote_device:
154 continue 230 continue
155 if (self._remote_device_os 231 if (self._remote_device_os
156 and device['os_version'] != self._remote_device_os): 232 and device['os_version'] not in self._remote_device_os):
233 continue
234 if self._device_oem and device['brand'] not in self._device_oem:
235 continue
236 if (self._remote_device_minimum_os
237 and distutils.version.LooseVersion(device['os_version'])
238 < distutils.version.LooseVersion(self._remote_device_minimum_os)):
157 continue 239 continue
158 if ((self._remote_device and self._remote_device_os) 240 if ((self._remote_device and self._remote_device_os)
159 or device['available_devices_count']): 241 or device['available_devices_count']):
160 logging.info('Found device: %s %s', 242 logging.info('Found device: %s %s',
161 device['name'], device['os_version']) 243 device['name'], device['os_version'])
162 return device 244 return device
163 self._NoDeviceFound(device_list) 245 self._NoDeviceFound(device_list)
164 246
165 def _PrintAvailableDevices(self, device_list): 247 def _PrintAvailableDevices(self, device_list):
166 def compare_devices(a,b): 248 def compare_devices(a,b):
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 def trigger(self): 298 def trigger(self):
217 return self._trigger 299 return self._trigger
218 300
219 @property 301 @property
220 def verbose_count(self): 302 def verbose_count(self):
221 return self._verbose_count 303 return self._verbose_count
222 304
223 @property 305 @property
224 def device_type(self): 306 def device_type(self):
225 return self._device_type 307 return self._device_type
OLDNEW
« no previous file with comments | « no previous file | build/android/test_runner.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698