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

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 self._access_token = None
32 if args.api_key_file: 34 self._device = None
33 with open(args.api_key_file) as api_key_file: 35 self._device_type = args.device_type
34 self._api_key = api_key_file.read().strip()
35 elif args.api_key:
36 self._api_key = args.api_key
37 else:
38 error_func('Must set api key with --api-key or --api-key-file')
39
40 if args.api_secret_file:
41 with open(args.api_secret_file) as api_secret_file:
42 self._api_secret = api_secret_file.read().strip()
43 elif 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
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
51
52 if not args.api_address:
53 error_func('Must set api address with --api-address')
54 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
59
60 self._access_token = ''
61 self._results_path = args.results_path
62 self._remote_device = args.remote_device
63 self._remote_device_os = args.remote_device_os
64 self._runner_package = args.runner_package
65 self._runner_type = args.runner_type
66 self._device = ''
67 self._verbose_count = args.verbose_count 36 self._verbose_count = args.verbose_count
68 self._device_type = args.device_type
69 self._timeouts = { 37 self._timeouts = {
70 'queueing': 60 * 10, 38 'queueing': 60 * 10,
71 'installing': 60 * 10, 39 'installing': 60 * 10,
72 'in-progress': 60 * 30, 40 'in-progress': 60 * 30,
73 'unknown': 60 * 5 41 'unknown': 60 * 5
74 } 42 }
43 # Example config file:
44 # {
45 # "remote_device": ["Galaxy S4", "Galaxy S3"],
46 # "remote_device_os": ["4.4.2", "4.4.4"],
47 # "remote_device_minimum_os": "4.4.2",
48 # "api_address": "www.example.com",
49 # "api_port": "80",
50 # "api_protocol": "http",
51 # "api_secret": "apisecret",
52 # "api_key": "apikey",
53 # "timeouts": {
54 # "queueing": 600,
55 # "installing": 600,
56 # "in-progress": 1800,
57 # "unknown": 300
58 # }
59 # }
60 if args.remote_device_file:
61 with open(args.remote_device_file) as device_file:
62 device_json = json.load(device_file)
63 else:
64 device_json = {}
65
66 self._api_address = device_json.get('api_address', None)
67 self._api_key = device_json.get('api_key', None)
68 self._api_port = device_json.get('api_port', None)
69 self._api_protocol = device_json.get('api_protocol', None)
70 self._api_secret = device_json.get('api_secret', None)
71 self._remote_device = device_json.get('remote_device', None)
72 self._remote_device_minimum_os = device_json.get(
73 'remote_device_minimum_os', None)
74 self._remote_device_os = device_json.get('remote_device_os', None)
75 self._device_oem = device_json.get('device_oem', None)
76 self._device_type = device_json.get('device_type', 'Android')
77 self._results_path = device_json.get('results_path', None)
78 self._runner_package = device_json.get('runner_package', None)
79 self._runner_type = device_json.get('runner_type', None)
80 if 'timeouts' in device_json:
81 for key in device_json['timeouts']:
82 self._timeouts[key] = device_json['timeouts'][key]
83
84 def command_line_override(file_set, cmd_line_set, desc):
jbudorick 2015/01/30 17:56:40 nit: *_set -> *_value
rnephew (Wrong account) 2015/01/31 00:19:35 Done.
85 if cmd_line_set:
86 if file_set and file_set != cmd_line_set:
87 logging.info('Overriding %s from %s to %s',
88 desc, file_set, cmd_line_set)
89 return cmd_line_set
90 return file_set
91
92 self._api_address = command_line_override(
93 self._api_address, args.api_address, 'api_address')
94 self._api_port = command_line_override(
95 self._api_port, args.api_port, 'api_port')
96 self._api_protocol = command_line_override(
97 self._api_protocol, args.api_protocol, 'api_protocol')
98 self._device_oem = command_line_override(
99 self._device_oem, args.device_oem, 'device_oem')
100 self._device_type = command_line_override(
101 self._device_type, args.device_type, 'device_type')
102 self._remote_device = command_line_override(
103 self._remote_device, args.remote_device, 'remote_device')
104 self._remote_device_minimum_os = command_line_override(
105 self._remote_device_minimum_os, args.remote_device_minimum_os,
106 'remote_device_minimum_os')
107 self._remote_device_os = command_line_override(
108 self._remote_device_os, args.remote_device_os, 'remote_device_os')
109 self._results_path = command_line_override(
110 self._results_path, args.results_path, 'results_path')
111 self._runner_package = command_line_override(
112 self._runner_package, args.runner_package, 'runner_package')
113 self._runner_type = command_line_override(
114 self._runner_type, args.runner_type, 'runner_type')
115
116 if args.api_key_file:
jbudorick 2015/01/30 17:56:40 nit: Either add a comment explaining why this does
rnephew (Wrong account) 2015/01/31 00:19:36 Done.
117 with open(args.api_key_file) as api_key_file:
118 temp_key = api_key_file.read().strip()
119 if self._api_key and temp_key != self._api_key:
120 logging.info('Overriding api key.')
121 self._api_key = temp_key
122 elif args.api_key:
123 if self._api_key and self._api_key != args.api_key:
124 logging.info('Overriding api key.')
125 self._api_key = args.api_key
126
127 if args.api_secret_file:
128 with open(args.api_secret_file) as api_secret_file:
129 temp_secret = api_secret_file.read().strip()
130 if self._api_secret and temp_secret != self._api_secret:
131 logging.info('Overriding api secret.')
132 self._api_secret = temp_secret
133 elif args.api_secret:
134 if self._api_secret and self._api_secret != args.api_secret:
135 logging.info('Overriding api secret.')
136 self._api_secret = args.api_secret
137
138 if not self._api_address:
139 error_func('Must set api address with --api-address'
140 ' or in --remote-device-file.')
141 if not self._api_key:
142 error_func('Must set api key with --api-key, --api-key-file'
143 ' or in --remote-device-file')
144 if not self._api_port:
145 error_func('Must set api port with --api-port'
146 ' or in --remote-device-file')
147 if not self._api_protocol:
148 error_func('Must set api protocol with --api-protocol'
149 ' or in --remote-device-file. Example: http')
150 if not self._api_secret:
151 error_func('Must set api secret with --api-secret, --api-secret-file'
152 ' or in --remote-device-file')
153
154 logging.info('Api address: %s', self._api_address)
155 logging.info('Api port: %s', self._api_port)
156 logging.info('Api protocol: %s', self._api_protocol)
157 logging.info('Remote device: %s', self._remote_device)
158 logging.info('Remote device minimum OS: %s',
159 self._remote_device_minimum_os)
160 logging.info('Remote device OS: %s', self._remote_device_os)
161 logging.info('Remote device OEM: %s', self._device_oem)
162 logging.info('Remote device type: %s', self._device_type)
163 logging.info('Results Path: %s', self._results_path)
164 logging.info('Runner package: %s', self._runner_package)
165 logging.info('Runner type: %s', self._runner_type)
166 logging.info('Timeouts: %s', self._timeouts)
75 167
76 if not args.trigger and not args.collect: 168 if not args.trigger and not args.collect:
77 self._trigger = True 169 self._trigger = True
78 self._collect = True 170 self._collect = True
79 else: 171 else:
80 self._trigger = args.trigger 172 self._trigger = args.trigger
81 self._collect = args.collect 173 self._collect = args.collect
82 174
83 def SetUp(self): 175 def SetUp(self):
84 """Set up the test environment.""" 176 """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, 235 with appurify_sanitized.SanitizeLogging(self._verbose_count,
144 logging.WARNING): 236 logging.WARNING):
145 dev_list_res = appurify_sanitized.api.devices_list(self._access_token) 237 dev_list_res = appurify_sanitized.api.devices_list(self._access_token)
146 remote_device_helper.TestHttpResponse(dev_list_res, 238 remote_device_helper.TestHttpResponse(dev_list_res,
147 'Unable to generate access token.') 239 'Unable to generate access token.')
148 device_list = dev_list_res.json()['response'] 240 device_list = dev_list_res.json()['response']
149 random.shuffle(device_list) 241 random.shuffle(device_list)
150 for device in device_list: 242 for device in device_list:
151 if device['os_name'] != self._device_type: 243 if device['os_name'] != self._device_type:
152 continue 244 continue
153 if self._remote_device and device['name'] != self._remote_device: 245 if self._remote_device and device['name'] not in self._remote_device:
154 continue 246 continue
155 if (self._remote_device_os 247 if (self._remote_device_os
156 and device['os_version'] != self._remote_device_os): 248 and device['os_version'] not in self._remote_device_os):
249 continue
250 if self._device_oem and device['brand'] not in self._device_oem:
251 continue
252 if (self._remote_device_minimum_os
253 and distutils.version.LooseVersion(device['os_version'])
254 < distutils.version.LooseVersion(self._remote_device_minimum_os)):
157 continue 255 continue
158 if ((self._remote_device and self._remote_device_os) 256 if ((self._remote_device and self._remote_device_os)
159 or device['available_devices_count']): 257 or device['available_devices_count']):
160 logging.info('Found device: %s %s', 258 logging.info('Found device: %s %s',
161 device['name'], device['os_version']) 259 device['name'], device['os_version'])
162 return device 260 return device
163 self._NoDeviceFound(device_list) 261 self._NoDeviceFound(device_list)
164 262
165 def _PrintAvailableDevices(self, device_list): 263 def _PrintAvailableDevices(self, device_list):
166 def compare_devices(a,b): 264 def compare_devices(a,b):
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 def trigger(self): 314 def trigger(self):
217 return self._trigger 315 return self._trigger
218 316
219 @property 317 @property
220 def verbose_count(self): 318 def verbose_count(self):
221 return self._verbose_count 319 return self._verbose_count
222 320
223 @property 321 @property
224 def device_type(self): 322 def device_type(self):
225 return self._device_type 323 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