| Index: build/android/pylib/device/device_utils_test.py
|
| diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..592d97ed5d2e9073982e0b7889879af44dcd7557
|
| --- /dev/null
|
| +++ b/build/android/pylib/device/device_utils_test.py
|
| @@ -0,0 +1,171 @@
|
| +# Copyright 2014 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""
|
| +Unit tests for the contents of device_utils.py (mostly DeviceUtils).
|
| +"""
|
| +# pylint: disable=W0212
|
| +# pylint: disable=W0613
|
| +
|
| +import time
|
| +import unittest
|
| +from pylib.device import adb_wrapper
|
| +from pylib.device import device_utils
|
| +
|
| +
|
| +class DeviceUtilsTest(unittest.TestCase):
|
| +
|
| + _decorated_function_called_count = 0
|
| +
|
| + def testFunctionDecoratorSetsTimeout(self):
|
| + """ Tests that the WithTimeoutAndRetries decorator sets |timeout|
|
| + appropriately.
|
| + """
|
| + @device_utils.WithTimeoutAndRetries(device_utils._DEFAULT_TIMEOUT,
|
| + device_utils._DEFAULT_RETRIES)
|
| + def alwaysReturnTimeoutVal(timeout=None, retries=None):
|
| + return timeout
|
| +
|
| + self.assertEquals(device_utils._DEFAULT_TIMEOUT, alwaysReturnTimeoutVal())
|
| + self.assertEquals(8, alwaysReturnTimeoutVal(timeout=8))
|
| +
|
| + def testFunctionDecoratorSetsRetries(self):
|
| + """ Tests that the WithTimeoutAndRetries decorator sets |retries|
|
| + appropriately.
|
| + """
|
| + @device_utils.WithTimeoutAndRetries(device_utils._DEFAULT_TIMEOUT,
|
| + device_utils._DEFAULT_RETRIES)
|
| + def alwaysReturnRetriesVal(timeout=None, retries=None):
|
| + return retries
|
| +
|
| + self.assertEquals(device_utils._DEFAULT_RETRIES, alwaysReturnRetriesVal())
|
| + self.assertEquals(1, alwaysReturnRetriesVal(retries=1))
|
| +
|
| + def testFunctionDecoratorDoesTimeouts(self):
|
| + """ Tests that the WithTimeoutAndRetries decorator handles the timeout
|
| + logic.
|
| + """
|
| + DeviceUtilsTest._decorated_function_called_count = 0
|
| + @device_utils.WithTimeoutAndRetries(device_utils._DEFAULT_TIMEOUT,
|
| + device_utils._DEFAULT_RETRIES)
|
| + def alwaysTimesOut(timeout=None, retries=None):
|
| + DeviceUtilsTest._decorated_function_called_count += 1
|
| + time.sleep(100 * timeout)
|
| +
|
| + start_time = time.time()
|
| + with self.assertRaises(adb_wrapper.CommandTimeoutError):
|
| + alwaysTimesOut(timeout=1, retries=0)
|
| + elapsed_time = time.time() - start_time
|
| + self.assertTrue(elapsed_time >= 1)
|
| + self.assertEquals(1, DeviceUtilsTest._decorated_function_called_count)
|
| +
|
| + def testFunctionDecoratorDoesRetries(self):
|
| + """ Tests that the WithTimeoutAndRetries decorator handles the retries
|
| + logic.
|
| + """
|
| + DeviceUtilsTest._decorated_function_called_count = 0
|
| + @device_utils.WithTimeoutAndRetries(device_utils._DEFAULT_TIMEOUT,
|
| + device_utils._DEFAULT_RETRIES)
|
| + def alwaysRaisesCommandFailedError(timeout=None, retries=None):
|
| + DeviceUtilsTest._decorated_function_called_count += 1
|
| + raise adb_wrapper.CommandFailedError(['testCommand'],
|
| + 'testCommand failed')
|
| +
|
| + with self.assertRaises(adb_wrapper.CommandFailedError):
|
| + alwaysRaisesCommandFailedError(retries=10)
|
| + self.assertEquals(11, DeviceUtilsTest._decorated_function_called_count)
|
| +
|
| + class _MethodDecoratorTestObject(object):
|
| + """ An object suitable for testing the
|
| + WithTimeoutAndRetriesFromInstance method decorator.
|
| + """
|
| +
|
| + def __init__(self, test_case, default_timeout=device_utils._DEFAULT_TIMEOUT,
|
| + default_retries=device_utils._DEFAULT_RETRIES):
|
| + self._test_case = test_case
|
| + self._default_timeout = default_timeout
|
| + self._default_retries = default_retries
|
| + self.function_call_counters = {
|
| + 'alwaysRaisesCommandFailedError': 0,
|
| + 'alwaysTimesOut': 0,
|
| + }
|
| +
|
| + # pylint: disable=R0201
|
| +
|
| + @device_utils.WithTimeoutAndRetriesFromInstance
|
| + def alwaysReturnTimeoutVal(self, timeout=None, retries=None):
|
| + return timeout
|
| +
|
| + @device_utils.WithTimeoutAndRetriesFromInstance
|
| + def alwaysReturnRetriesVal(self, timeout=None, retries=None):
|
| + return retries
|
| +
|
| + # pylint: enable=R0201
|
| +
|
| + @device_utils.WithTimeoutAndRetriesFromInstance
|
| + def alwaysTimesOut(self, timeout=None, retries=None):
|
| + self.function_call_counters['alwaysTimesOut'] += 1
|
| + time.sleep(100 * timeout)
|
| + self._test_case.assertFalse(True, msg='Failed to time out?')
|
| +
|
| + @device_utils.WithTimeoutAndRetriesFromInstance
|
| + def alwaysRaisesCommandFailedError(self, timeout=None, retries=None):
|
| + self.function_call_counters['alwaysRaisesCommandFailedError'] += 1
|
| + raise adb_wrapper.CommandFailedError(['testCommand'],
|
| + 'testCommand failed')
|
| +
|
| + def testMethodDecoratorSetsTimeout(self):
|
| + """ Tests that the WithTimeoutAndRetriesFromInstance decorator sets
|
| + |timeout| appropriately.
|
| + """
|
| + expected_default_timeout = 37
|
| + expected_custom_timeout = 38
|
| + test_obj = self._MethodDecoratorTestObject(
|
| + self, default_timeout=expected_default_timeout)
|
| + self.assertEquals(
|
| + expected_default_timeout, test_obj.alwaysReturnTimeoutVal())
|
| + self.assertEquals(
|
| + expected_custom_timeout,
|
| + test_obj.alwaysReturnTimeoutVal(timeout=expected_custom_timeout))
|
| +
|
| + def testMethodDecoratorSetsRetries(self):
|
| + """ Tests that the WithTimeoutAndRetriesFromInstance decorator sets
|
| + |retries| appropriately.
|
| + """
|
| + expected_default_retries = 5
|
| + expected_custom_retries = 6
|
| + test_obj = self._MethodDecoratorTestObject(
|
| + self, default_retries=expected_default_retries)
|
| + self.assertEquals(
|
| + expected_default_retries, test_obj.alwaysReturnRetriesVal())
|
| + self.assertEquals(
|
| + expected_custom_retries,
|
| + test_obj.alwaysReturnRetriesVal(retries=expected_custom_retries))
|
| +
|
| + def testMethodDecoratorDoesTimeout(self):
|
| + """ Tests that the WithTimeoutAndRetriesFromInstance decorator handles
|
| + the timeout logic.
|
| + """
|
| + test_obj = self._MethodDecoratorTestObject(self)
|
| + start_time = time.time()
|
| + with self.assertRaises(adb_wrapper.CommandTimeoutError):
|
| + test_obj.alwaysTimesOut(timeout=1, retries=0)
|
| + elapsed_time = time.time() - start_time
|
| + self.assertTrue(elapsed_time >= 1)
|
| + self.assertEquals(1, test_obj.function_call_counters['alwaysTimesOut'])
|
| +
|
| + def testMethodDecoratorDoesRetries(self):
|
| + """ Tests that the WithTimeoutAndRetriesFromInstance decorator handles
|
| + the retries logic.
|
| + """
|
| + test_obj = self._MethodDecoratorTestObject(self)
|
| + with self.assertRaises(adb_wrapper.CommandFailedError):
|
| + test_obj.alwaysRaisesCommandFailedError(retries=10)
|
| + self.assertEquals(
|
| + 11, test_obj.function_call_counters['alwaysRaisesCommandFailedError'])
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
| +
|
|
|