| #!/usr/bin/python |
| # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Autotest test routines to use Google Storage based gesture files for test. |
| |
| The Chrome OS project uses Google Storage to house the many files that will |
| feed the hardware_Trackpad test. This library interfaces with Google Storage |
| for any test that needs to request and retrieve files from this repository |
| of test files. |
| |
| EXAMPLE: the following is an example of code that may be added to the |
| hardware_Trackpad test to make default gesture files available to the |
| test in response to an online, model-dependent query: |
| ... |
| import cros_gestures_lib |
| ... |
| def setup(self): |
| gesture_lib = cros_gestures_lib.CrosGesturesLib(self.autodir) |
| gesture_lib.remove_existing_test_files() |
| gesture_lib.download_files(gesture_lib.get_default_test_file_list( |
| gesture_lib.determine_model())) |
| |
| EXAMPLE: the following is an example of code that might be added to the |
| hardware_Trackpad/trackpad_record test to upload gesture files |
| after recording: |
| ... |
| import cros_gestures_lib |
| ... |
| def record_all(self): |
| ... |
| gesture_lib = cros_gestures_lib.CrosGesturesLib(self.autodir) |
| gesture_lib.upload_files() |
| """ |
| |
| __author__ = 'truty@chromium.org (Mike Truty)' |
| |
| import json |
| import os |
| import shutil |
| |
| import common_util |
| import trackpad_util |
| |
| |
| GESTURE_BASE_URI = 'http://chromeos-gestures.appspot.com' |
| |
| |
| class CrosGesturesLib(object): |
| """This class organizes code to download/upload gesture test files.""" |
| temp_dir = '/tmp' |
| |
| def __init__(self, autodir): |
| """Determine the gesture test files location.""" |
| local_path = os.path.join(autodir, 'tests/hardware_Trackpad') |
| gesture_files_path_conf = trackpad_util.read_trackpad_test_conf( |
| 'gesture_files_path', local_path) |
| self.gesture_files_path = os.path.join(local_path, |
| gesture_files_path_conf) |
| if not os.path.isdir(self.gesture_files_path): |
| os.makedirs(self.gesture_files_path) |
| self.gesture_files_old = os.path.join(self.temp_dir, |
| 'cros_gestures_old') |
| if not os.path.isdir(self.gesture_files_old): |
| os.makedirs(self.gesture_files_old) |
| self.cg_cmd = '/usr/local/cros_gestures/cros_gestures' |
| |
| def remove_existing_test_files(self): |
| """Cleanup existing files for a fresh test.""" |
| existing = os.listdir(self.gesture_files_path) |
| for f in existing: |
| # Save existing files under /tmp as a safety net. |
| full_temp_name = os.path.join(self.gesture_files_old, f) |
| if os.path.isfile(full_temp_name): |
| os.remove(full_temp_name) |
| shutil.move(os.path.join(self.gesture_files_path, f), |
| full_temp_name) |
| |
| def determine_model(self): |
| """Inspect the machine to determine the model.""" |
| cmd = 'cat /etc/lsb-release | grep CHROMEOS_RELEASE_BOARD' |
| line = common_util.simple_system_output(cmd) |
| if not line or line.find('=') < 0: |
| return None |
| return line.split('=')[1].strip().split('-')[-1] |
| |
| def get_default_test_file_list(self, model): |
| """Using the model of the test machine, retrieve list of test files.""" |
| wget_cmd = 'wget --timeout=30 --tries=5 --no-proxy -qO- "%s"' |
| file_list_uri = '%s/modeldefaultfiles?json=true&model=%s' |
| cmd = wget_cmd % (file_list_uri % (GESTURE_BASE_URI, |
| self.determine_model())) |
| return json.loads(common_util.simple_system_output(cmd)) |
| |
| |
| def download_files(self, file_list, ignore_failures=False): |
| """Given file list, download them to a conf file specified location.""" |
| rc = 0 |
| wget_cmd = 'wget --timeout=30 --tries=5 --no-proxy -qO "%s" "%s"' |
| for f in file_list: |
| cmd = wget_cmd % (os.path.join(self.gesture_files_path, |
| os.path.basename(f)), f) |
| rc = common_util.simple_system(cmd) |
| # TODO(Truty): Verify the files using md5. |
| return rc |
| |
| def download_file(self, file_name): |
| """Given a file_name, download the file from the storage server.""" |
| download_cmd = '%s download %s' |
| rc = common_util.simple_system(download_cmd % (self.cg_cmd, file_name)) |
| return rc |
| |
| def upload_files(self): |
| """Use the config file to find file location and upload all files. |
| If an uploaded version of the file already exists the upload silently |
| fails to allow for repeat attempts to upload without clearing files. |
| """ |
| rc = 0 |
| upload_cmd = '%s upload "%s"' |
| for f in os.listdir(self.gesture_files_path): |
| full_gesture_path = os.path.join(self.gesture_files_path, f) |
| rc = common_util.simple_system(upload_cmd % (self.cg_cmd, |
| full_gesture_path)) |
| if rc: |
| break |
| return rc |