Index: third_party/gsutil/gslib/tests/test_hash.py |
diff --git a/third_party/gsutil/gslib/tests/test_hash.py b/third_party/gsutil/gslib/tests/test_hash.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8d1da4f54cf97b3cf0116110a605356fb769dbd0 |
--- /dev/null |
+++ b/third_party/gsutil/gslib/tests/test_hash.py |
@@ -0,0 +1,83 @@ |
+# -*- coding: utf-8 -*- |
+# Copyright 2014 Google Inc. All Rights Reserved. |
+# |
+# Licensed under the Apache License, Version 2.0 (the "License"); |
+# you may not use this file except in compliance with the License. |
+# You may obtain a copy of the License at |
+# |
+# http://www.apache.org/licenses/LICENSE-2.0 |
+# |
+# Unless required by applicable law or agreed to in writing, software |
+# distributed under the License is distributed on an "AS IS" BASIS, |
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+# See the License for the specific language governing permissions and |
+# limitations under the License. |
+"""Unit tests for hash command.""" |
+ |
+import os |
+ |
+from gslib.exception import CommandException |
+import gslib.tests.testcase as testcase |
+ |
+ |
+class TestHash(testcase.GsUtilUnitTestCase): |
+ """Unit tests for hash command.""" |
+ |
+ _TEST_FILE_CONTENTS = '123456\n' |
+ _TEST_FILE_B64_CRC = 'nYmSiA==' |
+ _TEST_FILE_B64_MD5 = '9EeyCn/L9TpdW+AT6gsVrw==' |
+ _TEST_FILE_HEX_CRC = '9D899288' |
+ _TEST_FILE_HEX_MD5 = 'f447b20a7fcbf53a5d5be013ea0b15af' |
+ |
+ def testHashContents(self): |
+ tmp_file = self.CreateTempFile(contents=self._TEST_FILE_CONTENTS) |
+ stdout = self.RunCommand('hash', args=[tmp_file], return_stdout=True) |
+ self.assertIn('Hashes [base64]', stdout) |
+ self.assertIn('\tHash (crc32c):\t\t%s' % self._TEST_FILE_B64_CRC, stdout) |
+ self.assertIn('\tHash (md5):\t\t%s' % self._TEST_FILE_B64_MD5, stdout) |
+ |
+ def testHashNoMatch(self): |
+ try: |
+ self.RunCommand('hash', args=['non-existent-file']) |
+ self.fail('Did not get expected CommandException') |
+ except CommandException, e: |
+ self.assertRaisesRegexp(e, r'No files matched') |
+ |
+ def testHashCloudObject(self): |
+ try: |
+ self.RunCommand('hash', args=['gs://bucket/object']) |
+ self.fail('Did not get expected CommandException') |
+ except CommandException, e: |
+ self.assertEquals('"hash" command requires a file URL', e.reason) |
+ |
+ def testHashHexFormat(self): |
+ tmp_file = self.CreateTempFile(contents=self._TEST_FILE_CONTENTS) |
+ stdout = self.RunCommand('hash', args=['-h', tmp_file], return_stdout=True) |
+ self.assertIn('Hashes [hex]', stdout) |
+ self.assertIn('\tHash (crc32c):\t\t%s' % self._TEST_FILE_HEX_CRC, stdout) |
+ self.assertIn('\tHash (md5):\t\t%s' % self._TEST_FILE_HEX_MD5, stdout) |
+ |
+ def testHashWildcard(self): |
+ num_test_files = 2 |
+ tmp_dir = self.CreateTempDir(test_files=num_test_files) |
+ stdout = self.RunCommand('hash', args=[os.path.join(tmp_dir, '*')], |
+ return_stdout=True) |
+ # One summary line and two hash lines per file. |
+ num_expected_lines = num_test_files * (1 + 2) |
+ self.assertEquals(len(stdout.splitlines()), num_expected_lines) |
+ |
+ def testHashSelectAlg(self): |
+ tmp_file = self.CreateTempFile(contents=self._TEST_FILE_CONTENTS) |
+ stdout_crc = self.RunCommand('hash', args=['-c', tmp_file], |
+ return_stdout=True) |
+ stdout_md5 = self.RunCommand('hash', args=['-m', tmp_file], |
+ return_stdout=True) |
+ stdout_both = self.RunCommand('hash', args=['-c', '-m', tmp_file], |
+ return_stdout=True) |
+ for stdout in (stdout_crc, stdout_both): |
+ self.assertIn('\tHash (crc32c):\t\t%s' % self._TEST_FILE_B64_CRC, stdout) |
+ for stdout in (stdout_md5, stdout_both): |
+ self.assertIn('\tHash (md5):\t\t%s' % self._TEST_FILE_B64_MD5, stdout) |
+ self.assertNotIn('md5', stdout_crc) |
+ self.assertNotIn('crc32c', stdout_md5) |
+ |