| OLD | NEW |
| 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS 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, os, re, shutil, time | 5 import logging, os, re, shutil, time |
| 6 from autotest_lib.client.bin import site_ui_test | 6 from autotest_lib.client.bin import site_ui_test, site_login |
| 7 from autotest_lib.client.common_lib import error, site_httpd, \ | 7 from autotest_lib.client.common_lib import error, site_httpd, \ |
| 8 site_power_status, site_ui, utils | 8 site_power_status, site_ui, utils |
| 9 | 9 |
| 10 params_dict = { | 10 params_dict = { |
| 11 'test_time_ms': '_mseconds', | 11 'test_time_ms': '_mseconds', |
| 12 'should_scroll': '_should_scroll', | 12 'should_scroll': '_should_scroll', |
| 13 'should_scroll_up': '_should_scroll_up', | 13 'should_scroll_up': '_should_scroll_up', |
| 14 'scroll_loop': '_scroll_loop', | 14 'scroll_loop': '_scroll_loop', |
| 15 'scroll_interval_ms': '_scroll_interval_ms', | 15 'scroll_interval_ms': '_scroll_interval_ms', |
| 16 'scroll_by_pixels': '_scroll_by_pixels', | 16 'scroll_by_pixels': '_scroll_by_pixels', |
| 17 } | 17 } |
| 18 | 18 |
| 19 | 19 |
| 20 class power_LoadTest(site_ui_test.UITest): | 20 class power_LoadTest(site_ui_test.UITest): |
| 21 version = 1 | 21 version = 2 |
| 22 | 22 |
| 23 def setup(self): | 23 def ensure_login_complete(self): |
| 24 # TODO(snanda): Remove once power manager is in | 24 """ |
| 25 shutil.copy(os.path.join(os.environ['SYSROOT'], 'usr/bin/xset'), | 25 Override site_ui_test.UITest's ensure_login_complete. |
| 26 self.bindir) | 26 Do not use auth server and local dns for our test. We need to be |
| 27 if not os.path.exists(self.srcdir): | 27 able to reach the web. |
| 28 os.mkdir(self.srcdir) | 28 """ |
| 29 pass |
| 29 | 30 |
| 30 | 31 def initialize(self, creds='$default', percent_initial_charge_min=None, |
| 31 def run_once(self, percent_initial_charge_min=None, | |
| 32 check_network=True, loop_time=3600, loop_count=1, | 32 check_network=True, loop_time=3600, loop_count=1, |
| 33 should_scroll='true', should_scroll_up='true', | 33 should_scroll='true', should_scroll_up='true', |
| 34 scroll_loop='false', scroll_interval_ms='10000', | 34 scroll_loop='false', scroll_interval_ms='10000', |
| 35 scroll_by_pixels='600', low_battery_threshold=3, | 35 scroll_by_pixels='600', low_battery_threshold=3, |
| 36 verbose=True): | 36 verbose=True): |
| 37 |
| 37 """ | 38 """ |
| 38 percent_initial_charge_min: min battery charge at start of test | 39 percent_initial_charge_min: min battery charge at start of test |
| 39 check_network: check that Ethernet interface is not running | 40 check_network: check that Ethernet interface is not running |
| 40 loop_count: number of times to loop the test for | 41 loop_count: number of times to loop the test for |
| 41 loop_time: length of time to run the test for in each loop | 42 loop_time: length of time to run the test for in each loop |
| 42 should_scroll: should the extension scroll pages | 43 should_scroll: should the extension scroll pages |
| 43 should_scroll_up: should scroll in up direction | 44 should_scroll_up: should scroll in up direction |
| 44 scroll_loop: continue scrolling indefinitely | 45 scroll_loop: continue scrolling indefinitely |
| 45 scroll_interval_ms: how often to scoll | 46 scroll_interval_ms: how often to scoll |
| 46 scroll_by_pixels: number of pixels to scroll each time | 47 scroll_by_pixels: number of pixels to scroll each time |
| 47 """ | 48 """ |
| 48 | |
| 49 self._loop_time = loop_time | 49 self._loop_time = loop_time |
| 50 self._loop_count = loop_count | 50 self._loop_count = loop_count |
| 51 self._mseconds = self._loop_time * 1000 | 51 self._mseconds = self._loop_time * 1000 |
| 52 self._verbose = verbose | 52 self._verbose = verbose |
| 53 self._low_battery_threshold = low_battery_threshold | 53 self._low_battery_threshold = low_battery_threshold |
| 54 self._should_scroll = should_scroll | 54 self._should_scroll = should_scroll |
| 55 self._should_scroll_up = should_scroll_up | 55 self._should_scroll_up = should_scroll_up |
| 56 self._scroll_loop = scroll_loop | 56 self._scroll_loop = scroll_loop |
| 57 self._scroll_interval_ms = scroll_interval_ms | 57 self._scroll_interval_ms = scroll_interval_ms |
| 58 self._scroll_by_pixels = scroll_by_pixels | 58 self._scroll_by_pixels = scroll_by_pixels |
| 59 self._tmp_keyvals = {} | 59 self._tmp_keyvals = {} |
| 60 | |
| 61 self._power_status = site_power_status.get_status() | 60 self._power_status = site_power_status.get_status() |
| 62 | 61 |
| 63 # verify that initial conditions are met: | 62 # verify that initial conditions are met: |
| 64 if self._power_status.linepower[0].online: | 63 if self._power_status.linepower[0].online: |
| 65 raise error.TestError( | 64 raise error.TestError( |
| 66 'Running on AC power. Please remove AC power cable') | 65 'Running on AC power. Please remove AC power cable') |
| 67 | 66 |
| 68 percent_initial_charge = self._percent_current_charge() | 67 percent_initial_charge = self._percent_current_charge() |
| 69 if percent_initial_charge_min and percent_initial_charge < \ | 68 if percent_initial_charge_min and percent_initial_charge < \ |
| 70 percent_initial_charge_min: | 69 percent_initial_charge_min: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 85 utils.system_output(cmd).rstrip()) | 84 utils.system_output(cmd).rstrip()) |
| 86 | 85 |
| 87 cmd = 'backlight-tool --get_brightness' | 86 cmd = 'backlight-tool --get_brightness' |
| 88 self._tmp_keyvals['level_backlight_current'] = int( | 87 self._tmp_keyvals['level_backlight_current'] = int( |
| 89 utils.system_output(cmd).rstrip()) | 88 utils.system_output(cmd).rstrip()) |
| 90 | 89 |
| 91 # disable screen locker and powerd | 90 # disable screen locker and powerd |
| 92 os.system('stop screen-locker') | 91 os.system('stop screen-locker') |
| 93 os.system('stop powerd') | 92 os.system('stop powerd') |
| 94 | 93 |
| 95 # disable screen blanking. Stopping screen-locker isn't | |
| 96 # synchronous :(. Add a sleep for now, till powerd comes around | |
| 97 # and fixes all this for us. | |
| 98 time.sleep(5) | |
| 99 site_ui.xsystem(os.path.join(self.bindir, 'xset') + ' s off') | |
| 100 site_ui.xsystem(os.path.join(self.bindir, 'xset') + ' dpms 0 0 0') | |
| 101 site_ui.xsystem(os.path.join(self.bindir, 'xset') + ' -dpms') | |
| 102 | |
| 103 # fix up file perms for the power test extension so that chrome | 94 # fix up file perms for the power test extension so that chrome |
| 104 # can access it | 95 # can access it |
| 105 os.system('chmod -R 755 %s' % self.bindir) | 96 os.system('chmod -R 755 %s' % self.bindir) |
| 106 | 97 |
| 98 |
| 99 # TODO (bleung) : |
| 100 # The new external extension packed crx means we can't pass params by |
| 101 # modifying params.js |
| 102 # Possible solution : |
| 103 # - modify extension to not start until we poke it from the browser. |
| 104 # then pass through URL. |
| 105 |
| 107 # write test parameters to the power extension's params.js file | 106 # write test parameters to the power extension's params.js file |
| 108 self._ext_path = os.path.join(self.bindir, 'extension') | 107 # self._ext_path = os.path.join(self.bindir, 'extension') |
| 109 self._write_ext_params() | 108 # self._write_ext_params() |
| 109 |
| 110 # copy external_extensions.json to known location |
| 111 self._json_path = os.path.join(self.bindir, '..') |
| 112 shutil.copy(os.path.join(self.bindir, 'external_extensions.json'), |
| 113 self._json_path) |
| 110 | 114 |
| 111 # setup a HTTP Server to listen for status updates from the power | 115 # setup a HTTP Server to listen for status updates from the power |
| 112 # test extension | 116 # test extension |
| 113 self._testServer = site_httpd.HTTPListener(8001, docroot=self.bindir) | 117 self._testServer = site_httpd.HTTPListener(8001, docroot=self.bindir) |
| 114 self._testServer.run() | 118 self._testServer.run() |
| 115 | 119 |
| 116 # initialize various interesting power related stats | 120 # initialize various interesting power related stats |
| 117 self._usb_stats = site_power_status.USBSuspendStats() | 121 self._usb_stats = site_power_status.USBSuspendStats() |
| 118 self._cpufreq_stats = site_power_status.CPUFreqStats() | 122 self._cpufreq_stats = site_power_status.CPUFreqStats() |
| 119 self._cpuidle_stats = site_power_status.CPUIdleStats() | 123 self._cpuidle_stats = site_power_status.CPUIdleStats() |
| 120 | 124 |
| 121 | 125 |
| 122 self._usb_stats.refresh() | 126 self._usb_stats.refresh() |
| 123 self._cpufreq_stats.refresh() | 127 self._cpufreq_stats.refresh() |
| 124 self._cpuidle_stats.refresh() | 128 self._cpuidle_stats.refresh() |
| 125 self._power_status.refresh() | 129 self._power_status.refresh() |
| 126 | 130 |
| 127 self._ah_charge_start = self._power_status.battery[0].charge_now | 131 self._ah_charge_start = self._power_status.battery[0].charge_now |
| 128 self._wh_energy_start = self._power_status.battery[0].energy | 132 self._wh_energy_start = self._power_status.battery[0].energy |
| 129 | 133 |
| 134 # from site_ui_test.UITest.initialize, sans authserver & local dns. |
| 135 (self.username, self.password) = self._UITest__resolve_creds(creds) |
| 136 |
| 137 |
| 138 def run_once(self): |
| 139 |
| 130 t0 = time.time() | 140 t0 = time.time() |
| 131 | 141 |
| 132 for i in range(self._loop_count): | 142 for i in range(self._loop_count): |
| 133 # the power test extension will report its status here | 143 # the power test extension will report its status here |
| 134 latch = self._testServer.add_wait_url('/status') | 144 latch = self._testServer.add_wait_url('/status') |
| 135 | 145 |
| 136 # launch chrome with power test extension | 146 if site_login.logged_in(): |
| 137 args = '--load-extension=%s' % self._ext_path | 147 site_login.attempt_logout() |
| 138 session = site_ui.ChromeSession(args, clean_state=False) | 148 # the act of logging in will launch chrome with external extension. |
| 149 self.login(self.username, self.password) |
| 139 | 150 |
| 140 low_battery = self._do_wait(self._verbose, self._loop_time, | 151 low_battery = self._do_wait(self._verbose, self._loop_time, |
| 141 latch, session) | 152 latch) |
| 142 session.close() | |
| 143 | 153 |
| 144 if self._verbose: | 154 if self._verbose: |
| 145 logging.debug('loop %d completed' % i) | 155 logging.debug('loop %d completed' % i) |
| 146 logging.debug(utils.system_output('xset q')) | 156 logging.debug(utils.system_output('xset q')) |
| 147 | 157 |
| 148 if low_battery: | 158 if low_battery: |
| 149 logging.info('Exiting due to low battery') | 159 logging.info('Exiting due to low battery') |
| 150 break | 160 break |
| 151 | 161 |
| 152 t1 = time.time() | 162 t1 = time.time() |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 203 |
| 194 keyvals['a_current_rate'] = keyvals['ah_charge_used'] * 60 / \ | 204 keyvals['a_current_rate'] = keyvals['ah_charge_used'] * 60 / \ |
| 195 keyvals['minutes_battery_life'] | 205 keyvals['minutes_battery_life'] |
| 196 keyvals['w_energy_rate'] = keyvals['wh_energy_used'] * 60 / \ | 206 keyvals['w_energy_rate'] = keyvals['wh_energy_used'] * 60 / \ |
| 197 keyvals['minutes_battery_life'] | 207 keyvals['minutes_battery_life'] |
| 198 | 208 |
| 199 self.write_perf_keyval(keyvals) | 209 self.write_perf_keyval(keyvals) |
| 200 | 210 |
| 201 | 211 |
| 202 def cleanup(self): | 212 def cleanup(self): |
| 213 # remove json file after test to stop external extension launch. |
| 214 os.system('rm -f %s' % |
| 215 os.path.join(self._json_path, 'external_extensions.json')) |
| 203 # re-enable screen locker and powerd. This also re-enables dpms. | 216 # re-enable screen locker and powerd. This also re-enables dpms. |
| 204 os.system('start powerd') | 217 os.system('start powerd') |
| 205 os.system('start screen-locker') | 218 os.system('start screen-locker') |
| 206 | 219 if site_login.logged_in(): |
| 220 site_login.attempt_logout() |
| 207 | 221 |
| 208 def _is_network_iface_running(self, name): | 222 def _is_network_iface_running(self, name): |
| 209 try: | 223 try: |
| 210 out = utils.system_output('ifconfig %s' % name) | 224 out = utils.system_output('ifconfig %s' % name) |
| 211 except error.CmdError, e: | 225 except error.CmdError, e: |
| 212 logging.info(e) | 226 logging.info(e) |
| 213 return False | 227 return False |
| 214 | 228 |
| 215 match = re.search('RUNNING', out, re.S) | 229 match = re.search('RUNNING', out, re.S) |
| 216 return match | 230 return match |
| (...skipping 10 matching lines...) Expand all Loading... |
| 227 for k in params_dict: | 241 for k in params_dict: |
| 228 data += template % (k, getattr(self, params_dict[k])) | 242 data += template % (k, getattr(self, params_dict[k])) |
| 229 | 243 |
| 230 filename = os.path.join(self._ext_path, 'params.js') | 244 filename = os.path.join(self._ext_path, 'params.js') |
| 231 utils.open_write_close(filename, data) | 245 utils.open_write_close(filename, data) |
| 232 | 246 |
| 233 logging.debug('filename ' + filename) | 247 logging.debug('filename ' + filename) |
| 234 logging.debug(data) | 248 logging.debug(data) |
| 235 | 249 |
| 236 | 250 |
| 237 def _do_wait(self, verbose, seconds, latch, session): | 251 def _do_wait(self, verbose, seconds, latch): |
| 238 latched = False | 252 latched = False |
| 239 low_battery = False | 253 low_battery = False |
| 240 total_time = seconds + 60 | 254 total_time = seconds + 60 |
| 241 elapsed_time = 0 | 255 elapsed_time = 0 |
| 242 wait_time = 60 | 256 wait_time = 60 |
| 243 | 257 |
| 244 while elapsed_time < total_time: | 258 while elapsed_time < total_time: |
| 245 time.sleep(wait_time) | 259 time.sleep(wait_time) |
| 246 elapsed_time += wait_time | 260 elapsed_time += wait_time |
| 247 | 261 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 267 for e in form_data: | 281 for e in form_data: |
| 268 key = 'ext_' + e | 282 key = 'ext_' + e |
| 269 if key in self._tmp_keyvals: | 283 if key in self._tmp_keyvals: |
| 270 self._tmp_keyvals[key] += form_data[e] | 284 self._tmp_keyvals[key] += form_data[e] |
| 271 else: | 285 else: |
| 272 self._tmp_keyvals[key] = form_data[e] | 286 self._tmp_keyvals[key] = form_data[e] |
| 273 else: | 287 else: |
| 274 logging.debug("Didn't get status back from power extension") | 288 logging.debug("Didn't get status back from power extension") |
| 275 | 289 |
| 276 return low_battery | 290 return low_battery |
| OLD | NEW |