| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 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 | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 import os | |
| 7 import sys | |
| 8 import unittest | |
| 9 | |
| 10 from pylib import cmd_helper | |
| 11 from pylib import constants | |
| 12 from pylib.device import device_errors | |
| 13 from pylib.utils import md5sum | |
| 14 | |
| 15 sys.path.append( | |
| 16 os.path.join(constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) | |
| 17 import mock | |
| 18 | |
| 19 TEST_OUT_DIR = os.path.join('test', 'out', 'directory') | |
| 20 HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host') | |
| 21 | |
| 22 class Md5SumTest(unittest.TestCase): | |
| 23 | |
| 24 def setUp(self): | |
| 25 self._patchers = [ | |
| 26 mock.patch('pylib.constants.GetOutDirectory', | |
| 27 new=mock.Mock(return_value=TEST_OUT_DIR)), | |
| 28 mock.patch('os.path.exists', | |
| 29 new=mock.Mock(return_value=True)), | |
| 30 ] | |
| 31 for p in self._patchers: | |
| 32 p.start() | |
| 33 | |
| 34 def tearDown(self): | |
| 35 for p in self._patchers: | |
| 36 p.stop() | |
| 37 | |
| 38 def testCalculateHostMd5Sums_singlePath(self): | |
| 39 test_path = '/test/host/file.dat' | |
| 40 mock_get_cmd_output = mock.Mock( | |
| 41 return_value='0123456789abcdeffedcba9876543210 /test/host/file.dat') | |
| 42 with mock.patch('pylib.cmd_helper.GetCmdOutput', new=mock_get_cmd_output): | |
| 43 out = md5sum.CalculateHostMd5Sums(test_path) | |
| 44 self.assertEquals(1, len(out)) | |
| 45 self.assertTrue('/test/host/file.dat' in out) | |
| 46 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 47 out['/test/host/file.dat']) | |
| 48 mock_get_cmd_output.assert_called_once_with( | |
| 49 [HOST_MD5_EXECUTABLE, '/test/host/file.dat']) | |
| 50 | |
| 51 def testCalculateHostMd5Sums_list(self): | |
| 52 test_paths = ['/test/host/file0.dat', '/test/host/file1.dat'] | |
| 53 mock_get_cmd_output = mock.Mock( | |
| 54 return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n' | |
| 55 '123456789abcdef00fedcba987654321 /test/host/file1.dat\n') | |
| 56 with mock.patch('pylib.cmd_helper.GetCmdOutput', new=mock_get_cmd_output): | |
| 57 out = md5sum.CalculateHostMd5Sums(test_paths) | |
| 58 self.assertEquals(2, len(out)) | |
| 59 self.assertTrue('/test/host/file0.dat' in out) | |
| 60 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 61 out['/test/host/file0.dat']) | |
| 62 self.assertTrue('/test/host/file1.dat' in out) | |
| 63 self.assertEquals('123456789abcdef00fedcba987654321', | |
| 64 out['/test/host/file1.dat']) | |
| 65 mock_get_cmd_output.assert_called_once_with( | |
| 66 [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', | |
| 67 '/test/host/file1.dat']) | |
| 68 | |
| 69 def testCalculateHostMd5Sums_generator(self): | |
| 70 test_paths = ('/test/host/' + p for p in ['file0.dat', 'file1.dat']) | |
| 71 mock_get_cmd_output = mock.Mock( | |
| 72 return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n' | |
| 73 '123456789abcdef00fedcba987654321 /test/host/file1.dat\n') | |
| 74 with mock.patch('pylib.cmd_helper.GetCmdOutput', new=mock_get_cmd_output): | |
| 75 out = md5sum.CalculateHostMd5Sums(test_paths) | |
| 76 self.assertEquals(2, len(out)) | |
| 77 self.assertTrue('/test/host/file0.dat' in out) | |
| 78 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 79 out['/test/host/file0.dat']) | |
| 80 self.assertTrue('/test/host/file1.dat' in out) | |
| 81 self.assertEquals('123456789abcdef00fedcba987654321', | |
| 82 out['/test/host/file1.dat']) | |
| 83 mock_get_cmd_output.assert_called_once_with( | |
| 84 [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', '/test/host/file1.dat']) | |
| 85 | |
| 86 def testCalculateDeviceMd5Sums_noPaths(self): | |
| 87 device = mock.NonCallableMock() | |
| 88 device.RunShellCommand = mock.Mock(side_effect=Exception()) | |
| 89 | |
| 90 out = md5sum.CalculateDeviceMd5Sums([], device) | |
| 91 self.assertEquals(0, len(out)) | |
| 92 | |
| 93 def testCalculateDeviceMd5Sums_singlePath(self): | |
| 94 test_path = '/storage/emulated/legacy/test/file.dat' | |
| 95 | |
| 96 device = mock.NonCallableMock() | |
| 97 device_md5sum_output = [ | |
| 98 '0123456789abcdeffedcba9876543210 ' | |
| 99 '/storage/emulated/legacy/test/file.dat', | |
| 100 ] | |
| 101 device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) | |
| 102 | |
| 103 with mock.patch('os.path.getsize', return_value=1337): | |
| 104 out = md5sum.CalculateDeviceMd5Sums(test_path, device) | |
| 105 self.assertEquals(1, len(out)) | |
| 106 self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) | |
| 107 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 108 out['/storage/emulated/legacy/test/file.dat']) | |
| 109 self.assertEquals(1, len(device.RunShellCommand.call_args_list)) | |
| 110 | |
| 111 def testCalculateDeviceMd5Sums_list(self): | |
| 112 test_path = ['/storage/emulated/legacy/test/file0.dat', | |
| 113 '/storage/emulated/legacy/test/file1.dat'] | |
| 114 device = mock.NonCallableMock() | |
| 115 device_md5sum_output = [ | |
| 116 '0123456789abcdeffedcba9876543210 ' | |
| 117 '/storage/emulated/legacy/test/file0.dat', | |
| 118 '123456789abcdef00fedcba987654321 ' | |
| 119 '/storage/emulated/legacy/test/file1.dat', | |
| 120 ] | |
| 121 device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) | |
| 122 | |
| 123 with mock.patch('os.path.getsize', return_value=1337): | |
| 124 out = md5sum.CalculateDeviceMd5Sums(test_path, device) | |
| 125 self.assertEquals(2, len(out)) | |
| 126 self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) | |
| 127 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 128 out['/storage/emulated/legacy/test/file0.dat']) | |
| 129 self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out) | |
| 130 self.assertEquals('123456789abcdef00fedcba987654321', | |
| 131 out['/storage/emulated/legacy/test/file1.dat']) | |
| 132 self.assertEquals(1, len(device.RunShellCommand.call_args_list)) | |
| 133 | |
| 134 def testCalculateDeviceMd5Sums_generator(self): | |
| 135 test_path = ('/storage/emulated/legacy/test/file%d.dat' % n | |
| 136 for n in xrange(0, 2)) | |
| 137 | |
| 138 device = mock.NonCallableMock() | |
| 139 device_md5sum_output = [ | |
| 140 '0123456789abcdeffedcba9876543210 ' | |
| 141 '/storage/emulated/legacy/test/file0.dat', | |
| 142 '123456789abcdef00fedcba987654321 ' | |
| 143 '/storage/emulated/legacy/test/file1.dat', | |
| 144 ] | |
| 145 device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) | |
| 146 | |
| 147 with mock.patch('os.path.getsize', return_value=1337): | |
| 148 out = md5sum.CalculateDeviceMd5Sums(test_path, device) | |
| 149 self.assertEquals(2, len(out)) | |
| 150 self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) | |
| 151 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 152 out['/storage/emulated/legacy/test/file0.dat']) | |
| 153 self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out) | |
| 154 self.assertEquals('123456789abcdef00fedcba987654321', | |
| 155 out['/storage/emulated/legacy/test/file1.dat']) | |
| 156 self.assertEquals(1, len(device.RunShellCommand.call_args_list)) | |
| 157 | |
| 158 def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self): | |
| 159 # See crbug/479966 | |
| 160 test_path = '/storage/emulated/legacy/test/file.dat' | |
| 161 | |
| 162 device = mock.NonCallableMock() | |
| 163 device_md5sum_output = [ | |
| 164 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: ' | |
| 165 'unused DT entry: type 0x1d arg 0x15db', | |
| 166 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text', | |
| 167 '0123456789abcdeffedcba9876543210 ' | |
| 168 '/storage/emulated/legacy/test/file.dat', | |
| 169 ] | |
| 170 device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) | |
| 171 | |
| 172 with mock.patch('os.path.getsize', return_value=1337): | |
| 173 out = md5sum.CalculateDeviceMd5Sums(test_path, device) | |
| 174 self.assertEquals(1, len(out)) | |
| 175 self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) | |
| 176 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 177 out['/storage/emulated/legacy/test/file.dat']) | |
| 178 self.assertEquals(1, len(device.RunShellCommand.call_args_list)) | |
| 179 | |
| 180 def testCalculateDeviceMd5Sums_list_fileMissing(self): | |
| 181 test_path = ['/storage/emulated/legacy/test/file0.dat', | |
| 182 '/storage/emulated/legacy/test/file1.dat'] | |
| 183 device = mock.NonCallableMock() | |
| 184 device_md5sum_output = [ | |
| 185 '0123456789abcdeffedcba9876543210 ' | |
| 186 '/storage/emulated/legacy/test/file0.dat', | |
| 187 '[0819/203513:ERROR:md5sum.cc(25)] Could not open file asdf', | |
| 188 '', | |
| 189 ] | |
| 190 device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) | |
| 191 | |
| 192 with mock.patch('os.path.getsize', return_value=1337): | |
| 193 out = md5sum.CalculateDeviceMd5Sums(test_path, device) | |
| 194 self.assertEquals(1, len(out)) | |
| 195 self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) | |
| 196 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 197 out['/storage/emulated/legacy/test/file0.dat']) | |
| 198 self.assertEquals(1, len(device.RunShellCommand.call_args_list)) | |
| 199 | |
| 200 | |
| 201 def testCalculateDeviceMd5Sums_requiresBinary(self): | |
| 202 test_path = '/storage/emulated/legacy/test/file.dat' | |
| 203 | |
| 204 device = mock.NonCallableMock() | |
| 205 device.adb = mock.NonCallableMock() | |
| 206 device.adb.Push = mock.Mock() | |
| 207 device_md5sum_output = [ | |
| 208 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: ' | |
| 209 'unused DT entry: type 0x1d arg 0x15db', | |
| 210 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text', | |
| 211 '0123456789abcdeffedcba9876543210 ' | |
| 212 '/storage/emulated/legacy/test/file.dat', | |
| 213 ] | |
| 214 error = device_errors.AdbShellCommandFailedError('cmd', 'out', 2) | |
| 215 device.RunShellCommand = mock.Mock( | |
| 216 side_effect=(error, '', device_md5sum_output)) | |
| 217 | |
| 218 with mock.patch('os.path.getsize', return_value=1337): | |
| 219 out = md5sum.CalculateDeviceMd5Sums(test_path, device) | |
| 220 self.assertEquals(1, len(out)) | |
| 221 self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) | |
| 222 self.assertEquals('0123456789abcdeffedcba9876543210', | |
| 223 out['/storage/emulated/legacy/test/file.dat']) | |
| 224 self.assertEquals(3, len(device.RunShellCommand.call_args_list)) | |
| 225 device.adb.Push.assert_called_once_with( | |
| 226 'test/out/directory/md5sum_dist', '/data/local/tmp/md5sum/') | |
| 227 | |
| 228 | |
| 229 if __name__ == '__main__': | |
| 230 unittest.main(verbosity=2) | |
| 231 | |
| OLD | NEW |