Index: build/android/pylib/utils/md5sum_test.py |
diff --git a/build/android/pylib/utils/md5sum_test.py b/build/android/pylib/utils/md5sum_test.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..c94c19d94761682b9a6e009c1478464a643c2010 |
--- /dev/null |
+++ b/build/android/pylib/utils/md5sum_test.py |
@@ -0,0 +1,231 @@ |
+#!/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. |
+ |
+import os |
+import sys |
+import unittest |
+ |
+from pylib import cmd_helper |
+from pylib import constants |
+from pylib.utils import md5sum |
+ |
+sys.path.append( |
+ os.path.join(constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) |
+import mock |
+ |
+TEST_OUT_DIR = os.path.join('test', 'out', 'directory') |
+HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host') |
+ |
+class Md5SumTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ self._patchers = [ |
+ mock.patch('pylib.constants.GetOutDirectory', |
+ new=mock.Mock(return_value=TEST_OUT_DIR)), |
+ mock.patch('os.path.exists', |
+ new=mock.Mock(return_value=True)), |
+ ] |
+ for p in self._patchers: |
+ p.start() |
+ |
+ def tearDown(self): |
+ for p in self._patchers: |
+ p.stop() |
+ |
+ def testCalculateHostMd5Sums_singlePath(self): |
+ test_path = '/test/host/file.dat' |
+ mock_get_cmd_output = mock.Mock( |
+ return_value='0123456789abcdeffedcba9876543210 /test/host/file.dat') |
+ with mock.patch('pylib.cmd_helper.GetCmdOutput', new=mock_get_cmd_output): |
+ out = md5sum.CalculateHostMd5Sums(test_path) |
+ self.assertEquals(1, len(out)) |
+ self.assertTrue('/test/host/file.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/test/host/file.dat']) |
+ mock_get_cmd_output.assert_called_once_with( |
+ [HOST_MD5_EXECUTABLE, '/test/host/file.dat']) |
+ |
+ def testCalculateHostMd5Sums_list(self): |
+ test_paths = ['/test/host/file0.dat', '/test/host/file1.dat'] |
+ mock_get_cmd_output = mock.Mock( |
+ return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n' |
+ '123456789abcdef00fedcba987654321 /test/host/file1.dat\n') |
+ with mock.patch('pylib.cmd_helper.GetCmdOutput', new=mock_get_cmd_output): |
+ out = md5sum.CalculateHostMd5Sums(test_paths) |
+ self.assertEquals(2, len(out)) |
+ self.assertTrue('/test/host/file0.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/test/host/file0.dat']) |
+ self.assertTrue('/test/host/file1.dat' in out) |
+ self.assertEquals('123456789abcdef00fedcba987654321', |
+ out['/test/host/file1.dat']) |
+ mock_get_cmd_output.assert_called_once_with( |
+ [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', |
+ '/test/host/file1.dat']) |
+ |
+ def testCalculateHostMd5Sums_generator(self): |
+ test_paths = ('/test/host/' + p for p in ['file0.dat', 'file1.dat']) |
+ mock_get_cmd_output = mock.Mock( |
+ return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n' |
+ '123456789abcdef00fedcba987654321 /test/host/file1.dat\n') |
+ with mock.patch('pylib.cmd_helper.GetCmdOutput', new=mock_get_cmd_output): |
+ out = md5sum.CalculateHostMd5Sums(test_paths) |
+ self.assertEquals(2, len(out)) |
+ self.assertTrue('/test/host/file0.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/test/host/file0.dat']) |
+ self.assertTrue('/test/host/file1.dat' in out) |
+ self.assertEquals('123456789abcdef00fedcba987654321', |
+ out['/test/host/file1.dat']) |
+ mock_get_cmd_output.assert_called_once_with( |
+ [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', '/test/host/file1.dat']) |
+ |
+ def testCalculateDeviceMd5Sums_singlePath(self): |
+ test_path = '/storage/emulated/legacy/test/file.dat' |
+ |
+ device = mock.NonCallableMock() |
+ device.adb = mock.NonCallableMock() |
+ device.adb.Push = mock.Mock() |
+ device_md5sum_output = [ |
+ '0123456789abcdeffedcba9876543210 ' |
+ '/storage/emulated/legacy/test/file.dat', |
+ ] |
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) |
+ |
+ mock_temp_file = mock.mock_open() |
+ mock_temp_file.return_value.name = '/tmp/test/script/file.sh' |
+ |
+ mock_device_temp_file = mock.mock_open() |
+ mock_device_temp_file.return_value.name = ( |
+ '/data/local/tmp/test/script/file.sh') |
+ |
+ with mock.patch('tempfile.NamedTemporaryFile', new=mock_temp_file), ( |
+ mock.patch('pylib.utils.device_temp_file.DeviceTempFile', |
+ new=mock_device_temp_file)): |
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device) |
+ self.assertEquals(1, len(out)) |
+ self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/storage/emulated/legacy/test/file.dat']) |
+ device.adb.Push.assert_called_once_with( |
+ '/tmp/test/script/file.sh', '/data/local/tmp/test/script/file.sh') |
+ device.RunShellCommand.assert_called_once_with( |
+ ['sh', '/data/local/tmp/test/script/file.sh']) |
+ |
+ def testCalculateDeviceMd5Sums_list(self): |
+ test_path = ['/storage/emulated/legacy/test/file0.dat', |
+ '/storage/emulated/legacy/test/file1.dat'] |
+ device = mock.NonCallableMock() |
+ device.adb = mock.NonCallableMock() |
+ device.adb.Push = mock.Mock() |
+ device_md5sum_output = [ |
+ '0123456789abcdeffedcba9876543210 ' |
+ '/storage/emulated/legacy/test/file0.dat', |
+ '123456789abcdef00fedcba987654321 ' |
+ '/storage/emulated/legacy/test/file1.dat', |
+ ] |
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) |
+ |
+ mock_temp_file = mock.mock_open() |
+ mock_temp_file.return_value.name = '/tmp/test/script/file.sh' |
+ |
+ mock_device_temp_file = mock.mock_open() |
+ mock_device_temp_file.return_value.name = ( |
+ '/data/local/tmp/test/script/file.sh') |
+ |
+ with mock.patch('tempfile.NamedTemporaryFile', new=mock_temp_file), ( |
+ mock.patch('pylib.utils.device_temp_file.DeviceTempFile', |
+ new=mock_device_temp_file)): |
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device) |
+ self.assertEquals(2, len(out)) |
+ self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/storage/emulated/legacy/test/file0.dat']) |
+ self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out) |
+ self.assertEquals('123456789abcdef00fedcba987654321', |
+ out['/storage/emulated/legacy/test/file1.dat']) |
+ device.adb.Push.assert_called_once_with( |
+ '/tmp/test/script/file.sh', '/data/local/tmp/test/script/file.sh') |
+ device.RunShellCommand.assert_called_once_with( |
+ ['sh', '/data/local/tmp/test/script/file.sh']) |
+ |
+ def testCalculateDeviceMd5Sums_generator(self): |
+ test_path = ('/storage/emulated/legacy/test/file%d.dat' % n |
+ for n in xrange(0, 2)) |
+ |
+ device = mock.NonCallableMock() |
+ device.adb = mock.NonCallableMock() |
+ device.adb.Push = mock.Mock() |
+ device_md5sum_output = [ |
+ '0123456789abcdeffedcba9876543210 ' |
+ '/storage/emulated/legacy/test/file0.dat', |
+ '123456789abcdef00fedcba987654321 ' |
+ '/storage/emulated/legacy/test/file1.dat', |
+ ] |
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) |
+ |
+ mock_temp_file = mock.mock_open() |
+ mock_temp_file.return_value.name = '/tmp/test/script/file.sh' |
+ |
+ mock_device_temp_file = mock.mock_open() |
+ mock_device_temp_file.return_value.name = ( |
+ '/data/local/tmp/test/script/file.sh') |
+ |
+ with mock.patch('tempfile.NamedTemporaryFile', new=mock_temp_file), ( |
+ mock.patch('pylib.utils.device_temp_file.DeviceTempFile', |
+ new=mock_device_temp_file)): |
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device) |
+ self.assertEquals(2, len(out)) |
+ self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/storage/emulated/legacy/test/file0.dat']) |
+ self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out) |
+ self.assertEquals('123456789abcdef00fedcba987654321', |
+ out['/storage/emulated/legacy/test/file1.dat']) |
+ device.adb.Push.assert_called_once_with( |
+ '/tmp/test/script/file.sh', '/data/local/tmp/test/script/file.sh') |
+ device.RunShellCommand.assert_called_once_with( |
+ ['sh', '/data/local/tmp/test/script/file.sh']) |
+ |
+ def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self): |
+ # See crbug/479966 |
+ test_path = '/storage/emulated/legacy/test/file.dat' |
+ |
+ device = mock.NonCallableMock() |
+ device.adb = mock.NonCallableMock() |
+ device.adb.Push = mock.Mock() |
+ device_md5sum_output = [ |
+ 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: ' |
+ 'unused DT entry: type 0x1d arg 0x15db', |
+ 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text', |
+ '0123456789abcdeffedcba9876543210 ' |
+ '/storage/emulated/legacy/test/file.dat', |
+ ] |
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output) |
+ |
+ mock_temp_file = mock.mock_open() |
+ mock_temp_file.return_value.name = '/tmp/test/script/file.sh' |
+ |
+ mock_device_temp_file = mock.mock_open() |
+ mock_device_temp_file.return_value.name = ( |
+ '/data/local/tmp/test/script/file.sh') |
+ |
+ with mock.patch('tempfile.NamedTemporaryFile', new=mock_temp_file), ( |
+ mock.patch('pylib.utils.device_temp_file.DeviceTempFile', |
+ new=mock_device_temp_file)): |
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device) |
+ self.assertEquals(1, len(out)) |
+ self.assertTrue('/storage/emulated/legacy/test/file.dat' in out) |
+ self.assertEquals('0123456789abcdeffedcba9876543210', |
+ out['/storage/emulated/legacy/test/file.dat']) |
+ device.adb.Push.assert_called_once_with( |
+ '/tmp/test/script/file.sh', '/data/local/tmp/test/script/file.sh') |
+ device.RunShellCommand.assert_called_once_with( |
+ ['sh', '/data/local/tmp/test/script/file.sh']) |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main(verbosity=2) |
+ |