OXIESEC PANEL
- Current Dir:
/
/
opt
/
gsutil
/
gslib
/
tests
Server IP: 2a02:4780:11:1594:0:ef5:22d7:a
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/11/2025 08:19:48 AM
rwxr-xr-x
📄
__init__.py
808 bytes
12/09/2024 05:26:03 PM
rw-r--r--
📁
__pycache__
-
02/11/2025 08:19:49 AM
rwxr-xr-x
📄
mock_cloud_api.py
7.97 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
mock_logging_handler.py
1.28 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
rewrite_helper.py
2.8 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
signurl_signatures.py
5.7 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_Doption.py
9.72 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_acl.py
55.99 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_autoclass.py
6.85 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_boto_util.py
9.65 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_bucketconfig.py
4.98 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_bucketpolicyonly.py
3.78 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cat.py
11.55 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cloud_api_delegator.py
2 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_command.py
3.39 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_command_runner.py
20.66 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_compose.py
14.12 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_context_config.py
18.78 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_copy_helper_funcs.py
39.76 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_copy_objects_iterator.py
4.49 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cors.py
12.45 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_cp.py
216 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_creds_config.py
8.64 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_daisy_chain_wrapper.py
14.13 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
test_data
-
12/09/2024 05:26:03 PM
rwxr-xr-x
📄
test_defacl.py
14.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_defstorageclass.py
5.43 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_du.py
10.61 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_encryption_helper.py
4.62 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_execution_util.py
3.88 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_file_part.py
3.38 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gcs_json_api.py
2.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gcs_json_credentials.py
9.85 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gcs_json_media.py
7.44 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_gsutil.py
4.68 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_hash.py
9.58 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_hashing_helper.py
10.78 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_help.py
3.5 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_hmac.py
23.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_iam.py
90.67 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_kms.py
16.68 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_label.py
11.55 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_lifecycle.py
13.8 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_logging.py
3.5 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_ls.py
53.16 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_mb.py
19.64 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_metrics.py
51.65 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_mtls.py
2.01 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_mv.py
13.04 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_naming.py
63.11 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_notification.py
5.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_notification_pubsub.py
5.46 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_pap.py
5.91 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_parallel_cp.py
10.15 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_parallelism_framework.py
33.09 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_perfdiag.py
12.62 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_plurality_checkable_iterator.py
7.53 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_posix_util.py
2.03 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_psc.py
5.88 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rb.py
2.93 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_requester_pays.py
11.7 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_resumable_streaming.py
12.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_retention.py
28.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_retention_util.py
5.49 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rewrite.py
31.62 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rm.py
33.72 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rpo.py
10.22 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rsync.py
149.33 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_rsync_funcs.py
3.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_seek_ahead_thread.py
8.79 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_setmeta.py
12.54 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_shim_util.py
64.19 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_signurl.py
24.69 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_stat.py
11.38 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_stet_cp.py
5.77 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_stet_util.py
7.38 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_storage_url.py
7.02 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_tabcomplete.py
14.31 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_temporary_file_util.py
1.54 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_trace.py
1.76 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_tracker_file.py
9.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_ubla.py
3.88 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_ui.py
67.42 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_update.py
10.37 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_user_agent_helper.py
5.34 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_util.py
19.85 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_versioning.py
3.61 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_web.py
6.54 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_wildcard_iterator.py
22.18 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
test_wrapped_credentials.py
13.95 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
testcase
-
12/09/2024 05:26:03 PM
rwxr-xr-x
📄
util.py
29.01 KB
12/09/2024 05:26:03 PM
rw-r--r--
Editing: test_hash.py
Close
# -*- 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.""" from __future__ import absolute_import from __future__ import print_function from __future__ import division from __future__ import unicode_literals import os from gslib.commands import hash from gslib.exception import CommandException import gslib.tests.testcase as testcase from gslib.tests.testcase.integration_testcase import SkipForS3 from gslib.tests.util import ObjectToURI as suri from gslib.tests.util import SetBotoConfigForTest from gslib.tests.util import SetEnvironmentForTest from gslib.utils import shim_util from six import add_move, MovedModule add_move(MovedModule('mock', 'mock', 'unittest.mock')) from six.moves import mock _TEST_FILE_CONTENTS = b'123456\n' _TEST_FILE_B64_CRC = 'nYmSiA==' _TEST_FILE_B64_MD5 = '9EeyCn/L9TpdW+AT6gsVrw==' _TEST_FILE_HEX_CRC = '9D899288' _TEST_FILE_HEX_MD5 = 'f447b20a7fcbf53a5d5be013ea0b15af' _TEST_COMPOSITE_ADDED_CONTENTS = b'tmp' _TEST_COMPOSITE_B64_CRC = 'M3DYBg==' _TEST_COMPOSITE_HEX_CRC = '3370D806' class TestHashUnit(testcase.GsUtilUnitTestCase): """Unit tests for hash command.""" def testHashContents(self): tmp_file = self.CreateTempFile(contents=_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' % _TEST_FILE_B64_CRC), stdout) self.assertIn(('\tHash (md5):\t\t%s' % _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 as e: self.assertIn('No files matched', e.reason) def testHashHexFormat(self): tmp_file = self.CreateTempFile(contents=_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' % _TEST_FILE_HEX_CRC), stdout) self.assertIn(('\tHash (md5):\t\t%s' % _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.assertEqual(len(stdout.splitlines()), num_expected_lines) def testHashSelectAlg(self): tmp_file = self.CreateTempFile(contents=_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' % _TEST_FILE_B64_CRC), stdout) for stdout in (stdout_md5, stdout_both): self.assertIn(('\tHash (md5):\t\t%s' % _TEST_FILE_B64_MD5), stdout) self.assertNotIn('md5', stdout_crc) self.assertNotIn('crc32c', stdout_md5) class TestHash(testcase.GsUtilIntegrationTestCase): """Integration tests for hash command.""" def testHashCloudObject(self): """Test hash command on a cloud object.""" obj1 = self.CreateObject(object_name='obj1', contents=_TEST_FILE_CONTENTS) # Tests cloud object with -h. stdout = self.RunGsUtil(['hash', '-h', suri(obj1)], return_stdout=True) self.assertIn('Hashes [hex]', stdout) if self.default_provider == 'gs': # Hex hashes for cloud objects get converted to lowercase but their # meaning is the same. self.assertIn(('\tHash (crc32c):\t\t%s' % _TEST_FILE_HEX_CRC.lower()), stdout) self.assertIn(('\tHash (md5):\t\t%s' % _TEST_FILE_HEX_MD5), stdout) # Tests cloud object as base64. stdout = self.RunGsUtil(['hash', suri(obj1)], return_stdout=True) self.assertIn('Hashes [base64]', stdout) if self.default_provider == 'gs': self.assertIn(('\tHash (crc32c):\t\t%s' % _TEST_FILE_B64_CRC), stdout) self.assertIn(('\tHash (md5):\t\t%s' % _TEST_FILE_B64_MD5), stdout) @SkipForS3('No composite object or crc32c support for S3.') def testHashCompositeObject(self): """Test hash command on a composite object (which only has crc32c).""" bucket = self.CreateBucket() obj1 = self.CreateObject(bucket_uri=bucket, object_name='obj1', contents=_TEST_FILE_CONTENTS) obj2 = self.CreateObject(bucket_uri=bucket, object_name='tmp', contents=_TEST_COMPOSITE_ADDED_CONTENTS) self.RunGsUtil(['compose', suri(obj1), suri(obj2), suri(obj1)]) stdout = self.RunGsUtil(['hash', '-h', suri(obj1)], return_stdout=True) self.assertIn('Hashes [hex]', stdout) # Hex hashes for cloud objects get converted to lowercase but their # meaning is the same. self.assertIn(('\tHash (crc32c):\t\t%s' % _TEST_COMPOSITE_HEX_CRC.lower()), stdout) stdout = self.RunGsUtil(['hash', suri(obj1)], return_stdout=True) self.assertIn('Hashes [base64]', stdout) self.assertIn(('\tHash (crc32c):\t\t%s' % _TEST_COMPOSITE_B64_CRC), stdout) class TestHashShim(testcase.ShimUnitTestBase): @mock.patch.object(hash.HashCommand, 'RunCommand', new=mock.Mock()) def test_shim_translates_basic_hash_command(self): with SetBotoConfigForTest([('GSUtil', 'use_gcloud_storage', 'True'), ('GSUtil', 'hidden_shim_mode', 'dry_run')]): with SetEnvironmentForTest({ 'CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTIL': 'True', 'CLOUDSDK_ROOT_DIR': 'fake_dir', }): mock_log_handler = self.RunCommand('hash', ['gs://b/o1', 'gs://b/o2'], return_log_handler=True) info_lines = '\n'.join(mock_log_handler.messages['info']) self.assertIn(('Gcloud Storage Command: {} storage hash {}' ' gs://b/o1 gs://b/o2').format( shim_util._get_gcloud_binary_path('fake_dir'), hash._GCLOUD_FORMAT_STRING), info_lines) @mock.patch.object(hash.HashCommand, 'RunCommand', new=mock.Mock()) def test_shim_translates_both_crc32c_and_md5_to_skip_nothing_flag(self): with SetBotoConfigForTest([('GSUtil', 'use_gcloud_storage', 'True'), ('GSUtil', 'hidden_shim_mode', 'dry_run')]): with SetEnvironmentForTest({ 'CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTIL': 'True', 'CLOUDSDK_ROOT_DIR': 'fake_dir', }): mock_log_handler = self.RunCommand('hash', ['-c', '-m', 'gs://b/o'], return_log_handler=True) info_lines = '\n'.join(mock_log_handler.messages['info']) self.assertIn( ('Gcloud Storage Command: {} storage hash {}' ' gs://b/o').format(shim_util._get_gcloud_binary_path('fake_dir'), hash._GCLOUD_FORMAT_STRING), info_lines) @mock.patch.object(hash.HashCommand, 'RunCommand', new=mock.Mock()) def test_shim_translates_md5_flag_to_skip_crc32c(self): with SetBotoConfigForTest([('GSUtil', 'use_gcloud_storage', 'True'), ('GSUtil', 'hidden_shim_mode', 'dry_run')]): with SetEnvironmentForTest({ 'CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTIL': 'True', 'CLOUDSDK_ROOT_DIR': 'fake_dir', }): mock_log_handler = self.RunCommand('hash', ['-m', 'gs://b/o'], return_log_handler=True) info_lines = '\n'.join(mock_log_handler.messages['info']) self.assertIn(('Gcloud Storage Command: {} storage hash {}' ' --skip-crc32c gs://b/o').format( shim_util._get_gcloud_binary_path('fake_dir'), hash._GCLOUD_FORMAT_STRING), info_lines) @mock.patch.object(hash.HashCommand, 'RunCommand', new=mock.Mock()) def test_shim_translates_crc32c_flag_to_skip_md5(self): with SetBotoConfigForTest([('GSUtil', 'use_gcloud_storage', 'True'), ('GSUtil', 'hidden_shim_mode', 'dry_run')]): with SetEnvironmentForTest({ 'CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTIL': 'True', 'CLOUDSDK_ROOT_DIR': 'fake_dir', }): mock_log_handler = self.RunCommand('hash', ['-c', 'gs://b/o'], return_log_handler=True) info_lines = '\n'.join(mock_log_handler.messages['info']) self.assertIn(('Gcloud Storage Command: {} storage hash {}' ' --skip-md5 gs://b/o').format( shim_util._get_gcloud_binary_path('fake_dir'), hash._GCLOUD_FORMAT_STRING), info_lines)