| #!/usr/bin/env python |
| # 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_temp_file.py. |
| """ |
| |
| import logging |
| import os |
| import sys |
| import unittest |
| |
| from pylib import constants |
| from pylib.device import adb_wrapper |
| from pylib.device import device_errors |
| from pylib.utils import device_temp_file |
| from pylib.utils import mock_calls |
| |
| sys.path.append(os.path.join( |
| constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) |
| import mock # pylint: disable=F0401 |
| |
| class DeviceTempFileTest(mock_calls.TestCase): |
| |
| def setUp(self): |
| test_serial = '0123456789abcdef' |
| self.adb = mock.Mock(spec=adb_wrapper.AdbWrapper) |
| self.adb.__str__ = mock.Mock(return_value=test_serial) |
| self.watchMethodCalls(self.call.adb) |
| |
| def mockShellCall(self, cmd_prefix, action=''): |
| """Expect an adb.Shell(cmd) call with cmd_prefix and do some action |
| |
| Args: |
| cmd_prefix: A string, the cmd of the received call is expected to have |
| this as a prefix. |
| action: If callable, an action to perform when the expected call is |
| received, otherwise a return value. |
| Returns: |
| An (expected_call, action) pair suitable for use in assertCalls. |
| """ |
| def check_and_return(cmd): |
| self.assertTrue( |
| cmd.startswith(cmd_prefix), |
| 'command %r does not start with prefix %r' % (cmd, cmd_prefix)) |
| if callable(action): |
| return action(cmd) |
| else: |
| return action |
| return (self.call.adb.Shell(mock.ANY), check_and_return) |
| |
| def mockExistsTest(self, exists_result): |
| def action(cmd): |
| if exists_result: |
| return '' |
| else: |
| raise device_errors.AdbCommandFailedError( |
| cmd, 'File not found', 1, str(self.adb)) |
| return self.mockShellCall('test -e ', action) |
| |
| def testTempFileNameAlreadyExists(self): |
| with self.assertCalls( |
| self.mockShellCall('test -d /data/local/tmp'), |
| self.mockExistsTest(True), |
| self.mockExistsTest(True), |
| self.mockExistsTest(True), |
| self.mockExistsTest(False), |
| self.mockShellCall('touch '), |
| self.mockShellCall('rm -f ')): |
| with device_temp_file.DeviceTempFile(self.adb) as tmpfile: |
| logging.debug('Temp file name: %s' % tmpfile.name) |
| |
| def testTempFileLifecycle(self): |
| with self.assertCalls( |
| self.mockShellCall('test -d /data/local/tmp'), |
| self.mockExistsTest(False), |
| self.mockShellCall('touch ')): |
| tempFileContextManager = device_temp_file.DeviceTempFile(self.adb) |
| with mock.patch.object(self.adb, 'Shell'): |
| with tempFileContextManager as tmpfile: |
| logging.debug('Temp file name: %s' % tmpfile.name) |
| self.assertEquals(0, self.adb.Shell.call_count) |
| self.assertEquals(1, self.adb.Shell.call_count) |
| args, _ = self.adb.Shell.call_args |
| self.assertTrue(args[0].startswith('rm -f ')) |
| |
| if __name__ == '__main__': |
| logging.getLogger().setLevel(logging.DEBUG) |
| unittest.main(verbosity=2) |