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 |