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

Side by Side Diff: build/android/pylib/device/device_utils_test.py

Issue 751063002: Allow RunShellCommand to work even with very large commands (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: less mind-bendy version Created 6 years 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
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2014 The Chromium Authors. All rights reserved. 2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """ 6 """
7 Unit tests for the contents of device_utils.py (mostly DeviceUtils). 7 Unit tests for the contents of device_utils.py (mostly DeviceUtils).
8 """ 8 """
9 9
10 # pylint: disable=C0321 10 # pylint: disable=C0321
11 # pylint: disable=W0212 11 # pylint: disable=W0212
12 # pylint: disable=W0613 12 # pylint: disable=W0613
13 13
14 import collections 14 import collections
15 import datetime 15 import datetime
16 import logging 16 import logging
17 import os 17 import os
18 import re 18 import re
19 import signal 19 import signal
20 import sys 20 import sys
21 import unittest 21 import unittest
22 22
23 from pylib import android_commands 23 from pylib import android_commands
24 from pylib import cmd_helper
24 from pylib import constants 25 from pylib import constants
25 from pylib.device import adb_wrapper 26 from pylib.device import adb_wrapper
26 from pylib.device import device_errors 27 from pylib.device import device_errors
27 from pylib.device import device_utils 28 from pylib.device import device_utils
28 from pylib.device import intent 29 from pylib.device import intent
29 from pylib.utils import mock_calls 30 from pylib.utils import mock_calls
30 31
31 # RunCommand from third_party/android_testrunner/run_command.py is mocked 32 # RunCommand from third_party/android_testrunner/run_command.py is mocked
32 # below, so its path needs to be in sys.path. 33 # below, so its path needs to be in sys.path.
33 sys.path.append(os.path.join( 34 sys.path.append(os.path.join(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 def testInitWithNone(self): 66 def testInitWithNone(self):
66 d = device_utils.DeviceUtils(None) 67 d = device_utils.DeviceUtils(None)
67 self.assertIsNone(d.old_interface.GetDevice()) 68 self.assertIsNone(d.old_interface.GetDevice())
68 69
69 70
70 class MockTempFile(object): 71 class MockTempFile(object):
71 72
72 def __init__(self, name='/tmp/some/file'): 73 def __init__(self, name='/tmp/some/file'):
73 self.file = mock.MagicMock(spec=file) 74 self.file = mock.MagicMock(spec=file)
74 self.file.name = name 75 self.file.name = name
76 self.file.name_quoted = cmd_helper.SingleQuote(name)
75 77
76 def __enter__(self): 78 def __enter__(self):
77 return self.file 79 return self.file
78 80
79 def __exit__(self, exc_type, exc_val, exc_tb): 81 def __exit__(self, exc_type, exc_val, exc_tb):
80 pass 82 pass
81 83
82 84
83 class _PatchedFunction(object): 85 class _PatchedFunction(object):
84 def __init__(self, patched=None, mocked=None): 86 def __init__(self, patched=None, mocked=None):
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 616
615 def testNewRunShellImpl_withCwd(self): 617 def testNewRunShellImpl_withCwd(self):
616 with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''): 618 with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''):
617 self.device.RunShellCommand('ls', cwd='/some/test/path') 619 self.device.RunShellCommand('ls', cwd='/some/test/path')
618 620
619 def testNewRunShellImpl_withCwdQuoted(self): 621 def testNewRunShellImpl_withCwdQuoted(self):
620 with self.assertCall( 622 with self.assertCall(
621 self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''): 623 self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''):
622 self.device.RunShellCommand('ls', cwd='/some test/path with/spaces') 624 self.device.RunShellCommand('ls', cwd='/some test/path with/spaces')
623 625
626 def testRunShellCommand_withHugeCmd(self):
627 payload = 'hi! ' * 1024
628 expected_cmd = "echo '%s'" % payload
629 with self.assertCalls(
630 (mock.call.pylib.utils.device_temp_file.DeviceTempFile(
631 self.device, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
632 self.call.device.WriteFile(
633 '/sdcard/temp-123.sh', expected_cmd, as_root=False, force_push=True),
634 (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
635 self.assertEquals([payload],
636 self.device.RunShellCommand(['echo', payload]))
637
638 def testRunShellCommand_withHugeCmdAmdSU(self):
639 payload = 'hi! ' * 1024
640 expected_cmd = """su -c sh -c 'echo '"'"'%s'"'"''""" % payload
641 with self.assertCalls(
642 (self.call.device.NeedsSU(), True),
643 (mock.call.pylib.utils.device_temp_file.DeviceTempFile(
644 self.device, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
645 self.call.device.WriteFile(
646 '/sdcard/temp-123.sh', expected_cmd, as_root=False, force_push=True),
647 (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
648 self.assertEquals(
649 [payload],
650 self.device.RunShellCommand(['echo', payload], as_root=True))
651
624 def testRunShellCommand_withSu(self): 652 def testRunShellCommand_withSu(self):
625 with self.assertCalls( 653 with self.assertCalls(
626 (self.call.device.NeedsSU(), True), 654 (self.call.device.NeedsSU(), True),
627 (self.call.adb.Shell("su -c sh -c 'setprop service.adb.root 0'"), '')): 655 (self.call.adb.Shell("su -c sh -c 'setprop service.adb.root 0'"), '')):
628 self.device.RunShellCommand('setprop service.adb.root 0', as_root=True) 656 self.device.RunShellCommand('setprop service.adb.root 0', as_root=True)
629 657
630 def testRunShellCommand_manyLines(self): 658 def testRunShellCommand_manyLines(self):
631 cmd = 'ls /some/path' 659 cmd = 'ls /some/path'
632 with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'): 660 with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'):
633 self.assertEquals(['file1', 'file2', 'file3'], 661 self.assertEquals(['file1', 'file2', 'file3'],
(...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 self.device = device_utils.DeviceUtils(None) 1595 self.device = device_utils.DeviceUtils(None)
1568 with self.assertCalls('adb get-serialno', 'unknown'), ( 1596 with self.assertCalls('adb get-serialno', 'unknown'), (
1569 self.assertRaises(device_errors.NoDevicesError)): 1597 self.assertRaises(device_errors.NoDevicesError)):
1570 str(self.device) 1598 str(self.device)
1571 1599
1572 1600
1573 if __name__ == '__main__': 1601 if __name__ == '__main__':
1574 logging.getLogger().setLevel(logging.DEBUG) 1602 logging.getLogger().setLevel(logging.DEBUG)
1575 unittest.main(verbosity=2) 1603 unittest.main(verbosity=2)
1576 1604
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698