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_label.py
Close
# -*- coding: utf-8 -*- # Copyright 2017 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. """Integration tests for label command.""" from __future__ import absolute_import from __future__ import print_function from __future__ import division from __future__ import unicode_literals import json import xml from xml.dom.minidom import parseString from xml.sax import _exceptions as SaxExceptions import six import boto from boto import handler from boto.s3.tagging import Tags from gslib.exception import CommandException import gslib.tests.testcase as testcase from gslib.tests.testcase.integration_testcase import SkipForGS from gslib.tests.testcase.integration_testcase import SkipForS3 from gslib.tests.util import ObjectToURI as suri from gslib.utils.retry_util import Retry from gslib.utils.constants import UTF8 KEY1 = 'key_one' KEY2 = 'key_two' VALUE1 = 'value_one' VALUE2 = 'value_two' def _get_label_setting_output(using_gcloud_storage, bucket_uri): return ('Updating {}' if using_gcloud_storage else 'Setting label configuration on {}/...').format(bucket_uri) @SkipForGS('Tests use S3-style XML passthrough.') class TestLabelS3(testcase.GsUtilIntegrationTestCase): """S3-specific tests. Most other test cases are covered in TestLabelGS.""" _label_xml = parseString('<Tagging><TagSet>' + '<Tag><Key>' + KEY1 + '</Key><Value>' + VALUE1 + '</Value></Tag>' + '<Tag><Key>' + KEY2 + '</Key><Value>' + VALUE2 + '</Value></Tag>' + '</TagSet></Tagging>').toprettyxml(indent=' ') def setUp(self): super(TestLabelS3, self).setUp() self.xml_fpath = self.CreateTempFile(contents=self._label_xml.encode(UTF8)) def DoAssertItemsMatch(self, item1, item2): if six.PY2: self.assertItemsEqual(item1, item2) else: # The name was switched, and to a more misleading name, in PY3. Oh well. self.assertCountEqual(item1, item2) def _LabelDictFromXmlString(self, xml_str): label_dict = {} tags_list = Tags() h = handler.XmlHandler(tags_list, None) try: xml.sax.parseString(xml_str, h) except SaxExceptions.SAXParseException as e: raise CommandException( 'Requested labels/tagging config is invalid: %s at line %s, column ' '%s' % (e.getMessage(), e.getLineNumber(), e.getColumnNumber())) for tagset_list in tags_list: for tag in tagset_list: label_dict[tag.key] = tag.value return label_dict def testSetAndGet(self): bucket_uri = self.CreateBucket() stderr = self.RunGsUtil(['label', 'set', self.xml_fpath, suri(bucket_uri)], return_stderr=True) expected_output = _get_label_setting_output(self._use_gcloud_storage, suri(bucket_uri)) if self._use_gcloud_storage: self.assertIn(expected_output, stderr) else: self.assertEqual(stderr.strip(), expected_output) # Verify that the bucket is configured with the labels we just set. # Work around eventual consistency for S3 tagging. @Retry(AssertionError, tries=3, timeout_secs=1) def _Check1(): stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.DoAssertItemsMatch(self._LabelDictFromXmlString(stdout), self._LabelDictFromXmlString(self._label_xml)) _Check1() def testCh(self): bucket_uri = self.CreateBucket() self.RunGsUtil([ 'label', 'ch', '-l', '%s:%s' % (KEY1, VALUE1), '-l', '%s:%s' % (KEY2, VALUE2), suri(bucket_uri) ]) # Verify that the bucket is configured with the labels we just set. # Work around eventual consistency for S3 tagging. @Retry(AssertionError, tries=3, timeout_secs=1) def _Check1(): stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.DoAssertItemsMatch(self._LabelDictFromXmlString(stdout), self._LabelDictFromXmlString(self._label_xml)) _Check1() # Remove KEY1, add a new key, and attempt to remove a nonexistent key # with 'label ch'. self.RunGsUtil([ 'label', 'ch', '-d', KEY1, '-l', 'new_key:new_value', '-d', 'nonexistent-key', suri(bucket_uri) ]) expected_dict = {KEY2: VALUE2, 'new_key': 'new_value'} @Retry(AssertionError, tries=3, timeout_secs=1) def _Check2(): stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.DoAssertItemsMatch(self._LabelDictFromXmlString(stdout), expected_dict) _Check2() @SkipForS3('Tests use GS-style ') class TestLabelGS(testcase.GsUtilIntegrationTestCase): """Integration tests for label command.""" _label_dict = {KEY1: VALUE1, KEY2: VALUE2} def setUp(self): super(TestLabelGS, self).setUp() self.json_fpath = self.CreateTempFile( contents=json.dumps(self._label_dict).encode(UTF8)) def testSetAndGetOnOneBucket(self): bucket_uri = self.CreateBucket() # Try setting labels for one bucket. stderr = self.RunGsUtil(['label', 'set', self.json_fpath, suri(bucket_uri)], return_stderr=True) expected_output = _get_label_setting_output(self._use_gcloud_storage, suri(bucket_uri)) if self._use_gcloud_storage: self.assertIn(expected_output, stderr) else: self.assertEqual(stderr.strip(), expected_output) # Verify that the bucket is configured with the labels we just set. stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.assertDictEqual(json.loads(stdout), self._label_dict) def testSetOnMultipleBucketsInSameCommand(self): bucket_uri = self.CreateBucket() bucket2_uri = self.CreateBucket() # Try setting labels for multiple buckets in one command. stderr = self.RunGsUtil( ['label', 'set', self.json_fpath, suri(bucket_uri), suri(bucket2_uri)], return_stderr=True) actual = set(stderr.splitlines()) expected = set([ _get_label_setting_output(self._use_gcloud_storage, suri(bucket_uri)), _get_label_setting_output(self._use_gcloud_storage, suri(bucket2_uri)), ]) if self._use_gcloud_storage: # Gcloud may not have exact match because of progress spinner. self.assertTrue(all([x in stderr for x in expected])) else: self.assertSetEqual(actual, expected) def testSetOverwritesOldLabelConfig(self): bucket_uri = self.CreateBucket() # Try setting labels for one bucket. self.RunGsUtil(['label', 'set', self.json_fpath, suri(bucket_uri)]) new_key_1 = 'new_key_1' new_key_2 = 'new_key_2' new_value_1 = 'new_value_1' new_value_2 = 'new_value_2' new_json = { new_key_1: new_value_1, new_key_2: new_value_2, KEY1: 'different_value_for_an_existing_key' } new_json_fpath = self.CreateTempFile( contents=json.dumps(new_json).encode('ascii')) self.RunGsUtil(['label', 'set', new_json_fpath, suri(bucket_uri)]) stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.assertDictEqual(json.loads(stdout), new_json) def testInitialAndSubsequentCh(self): bucket_uri = self.CreateBucket() ch_subargs = [ '-l', '%s:%s' % (KEY1, VALUE1), '-l', '%s:%s' % (KEY2, VALUE2) ] # Ensure 'ch' progress message shows in stderr. stderr = self.RunGsUtil(['label', 'ch'] + ch_subargs + [suri(bucket_uri)], return_stderr=True) expected_output = _get_label_setting_output(self._use_gcloud_storage, suri(bucket_uri)) if self._use_gcloud_storage: self.assertIn(expected_output, stderr) else: self.assertEqual(stderr.strip(), expected_output) # Check the bucket to ensure it's configured with the labels we just # specified. stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.assertDictEqual(json.loads(stdout), self._label_dict) # Ensure a subsequent 'ch' command works correctly. new_key = 'new-key' new_value = 'new-value' self.RunGsUtil([ 'label', 'ch', '-l', '%s:%s' % (new_key, new_value), '-d', KEY2, suri(bucket_uri) ]) stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) actual = json.loads(stdout) expected = {KEY1: VALUE1, new_key: new_value} self.assertDictEqual(actual, expected) def testChAppliesChangesToAllBucketArgs(self): bucket_suris = [suri(self.CreateBucket()), suri(self.CreateBucket())] ch_subargs = [ '-l', '%s:%s' % (KEY1, VALUE1), '-l', '%s:%s' % (KEY2, VALUE2) ] # Ensure 'ch' progress message appears for both buckets in stderr. stderr = self.RunGsUtil(['label', 'ch'] + ch_subargs + bucket_suris, return_stderr=True) actual = set(stderr.splitlines()) expected = set([ _get_label_setting_output(self._use_gcloud_storage, bucket_suri) for bucket_suri in bucket_suris ]) if self._use_gcloud_storage: self.assertTrue(all([x in stderr for x in expected])) else: self.assertSetEqual(actual, expected) # Check the buckets to ensure both are configured with the labels we # just specified. for bucket_suri in bucket_suris: stdout = self.RunGsUtil(['label', 'get', bucket_suri], return_stdout=True) self.assertDictEqual(json.loads(stdout), self._label_dict) def testChMinusDWorksWithoutExistingLabels(self): bucket_uri = self.CreateBucket() self.RunGsUtil(['label', 'ch', '-d', 'dummy-key', suri(bucket_uri)]) stdout = self.RunGsUtil(['label', 'get', suri(bucket_uri)], return_stdout=True) self.assertIn('%s/ has no label configuration.' % suri(bucket_uri), stdout) def testTooFewArgumentsFails(self): """Ensures label commands fail with too few arguments.""" invocations_missing_args = ( # Neither arguments nor subcommand. ['label'], # Not enough arguments for 'set'. ['label', 'set'], ['label', 'set', 'filename'], # Not enough arguments for 'get'. ['label', 'get'], # Not enough arguments for 'ch'. ['label', 'ch'], ['label', 'ch', '-l', 'key:val']) for arg_list in invocations_missing_args: stderr = self.RunGsUtil(arg_list, return_stderr=True, expected_status=1) self.assertIn('command requires at least', stderr) # Invoking 'ch' without any changes gives a slightly different message. stderr = self.RunGsUtil( ['label', 'ch', 'gs://some-nonexistent-foobar-bucket-name'], return_stderr=True, expected_status=1) self.assertIn('Please specify at least one label change', stderr)