gcf-merge-on-green[bot]: Your PR has attempted to merge for 3 hours. Please check that all required checks have passed, you have an automerge label, and that all your reviewers have approved the PR
gcf-merge-on-green[bot]: Your PR has attempted to merge for 3 hours. Please check that all required checks have passed, you have an automerge label, and that all your reviewers have approved the PR
gcf-merge-on-green[bot]: Merge-on-green attempted to merge your PR for 6 hours, but it was not mergeable because either one of your required status checks failed, or one of your required reviews was not approved. Learn more about your required status checks here: https://help.github.com/en/github/administering-a-repository/enabling-required-status-checks. You can remove and reapply the label to re-run the bot.
diff --git a/google/cloud/storage/_helpers.py b/google/cloud/storage/_helpers.py
index 79298c5..a1075ea 100644
--- a/google/cloud/storage/_helpers.py
+++ b/google/cloud/storage/_helpers.py
@@ -22,6 +22,7 @@ from hashlib import md5
 from datetime import datetime
 import os
 
+from six.moves.urllib.parse import urlsplit
 from google.cloud.storage.constants import _DEFAULT_TIMEOUT
 
 
@@ -491,3 +492,23 @@ def _raise_if_more_than_one_set(**kwargs):
         )
 
         raise ValueError(msg)
+
+
+def _bucket_bound_hostname_url(host, scheme=None):
+    """Helper to build bucket bound hostname URL.
+
+    :type host: str
+    :param host: Host name.
+
+    :type scheme: str
+    :param scheme: (Optional) Web scheme. If passed, use it
+                   as a scheme in the result URL.
+
+    :rtype: str
+    :returns: A bucket bound hostname URL.
+    """
+    url_parts = urlsplit(host)
+    if url_parts.scheme and url_parts.netloc:
+        return host
+
+    return "{scheme}://{host}/".format(scheme=scheme, host=host)
diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py
index ab50a8f..9d91bc5 100644
--- a/google/cloud/storage/blob.py
+++ b/google/cloud/storage/blob.py
@@ -57,6 +57,7 @@ from google.cloud.exceptions import NotFound
 from google.cloud.storage._helpers import _add_generation_match_parameters
 from google.cloud.storage._helpers import _PropertyMixin
 from google.cloud.storage._helpers import _scalar_property
+from google.cloud.storage._helpers import _bucket_bound_hostname_url
 from google.cloud.storage._helpers import _convert_to_timestamp
 from google.cloud.storage._helpers import _raise_if_more_than_one_set
 from google.cloud.storage._signing import generate_signed_url_v2
@@ -516,12 +517,9 @@ class Blob(_PropertyMixin):
                 bucket_name=self.bucket.name
             )
         elif bucket_bound_hostname:
-            if ":" in bucket_bound_hostname:
-                api_access_endpoint = bucket_bound_hostname
-            else:
-                api_access_endpoint = "{scheme}://{bucket_bound_hostname}".format(
-                    scheme=scheme, bucket_bound_hostname=bucket_bound_hostname
-                )
+            api_access_endpoint = _bucket_bound_hostname_url(
+                bucket_bound_hostname, scheme
+            )
         else:
             resource = "/{bucket_name}/{quoted_name}".format(
                 bucket_name=self.bucket.name, quoted_name=quoted_name
diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py
index d94190c..78d8c5f 100644
--- a/google/cloud/storage/bucket.py
+++ b/google/cloud/storage/bucket.py
@@ -38,6 +38,7 @@ from google.cloud.storage._helpers import _scalar_property
 from google.cloud.storage._helpers import _validate_name
 from google.cloud.storage._signing import generate_signed_url_v2
 from google.cloud.storage._signing import generate_signed_url_v4
+from google.cloud.storage._helpers import _bucket_bound_hostname_url
 from google.cloud.storage.acl import BucketACL
 from google.cloud.storage.acl import DefaultObjectACL
 from google.cloud.storage.blob import Blob
@@ -2861,12 +2862,9 @@ class Bucket(_PropertyMixin):
                 bucket_name=self.name
             )
         elif bucket_bound_hostname:
-            if ":" in bucket_bound_hostname:
-                api_access_endpoint = bucket_bound_hostname
-            else:
-                api_access_endpoint = "{scheme}://{bucket_bound_hostname}".format(
-                    scheme=scheme, bucket_bound_hostname=bucket_bound_hostname
-                )
+            api_access_endpoint = _bucket_bound_hostname_url(
+                bucket_bound_hostname, scheme
+            )
         else:
             resource = "/{bucket_name}".format(bucket_name=self.name)
 
diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py
index ce178ee..4927aec 100644
--- a/google/cloud/storage/client.py
+++ b/google/cloud/storage/client.py
@@ -30,6 +30,7 @@ from google.cloud._helpers import _LocalStack, _NOW
 from google.cloud.client import ClientWithProject
 from google.cloud.exceptions import NotFound
 from google.cloud.storage._helpers import _get_storage_host
+from google.cloud.storage._helpers import _bucket_bound_hostname_url
 from google.cloud.storage._http import Connection
 from google.cloud.storage._signing import (
     get_expiration_seconds_v4,
@@ -1079,15 +1080,8 @@ class Client(ClientWithProject):
         # designate URL
         if virtual_hosted_style:
             url = "https://{}.storage.googleapis.com/".format(bucket_name)
-
         elif bucket_bound_hostname:
-            if ":" in bucket_bound_hostname:  # URL includes scheme
-                url = bucket_bound_hostname
-
-            else:  # scheme is given separately
-                url = "{scheme}://{host}/".format(
-                    scheme=scheme, host=bucket_bound_hostname
-                )
+            url = _bucket_bound_hostname_url(bucket_bound_hostname, scheme)
         else:
             url = "https://storage.googleapis.com/{}/".format(bucket_name)
 

Move bucket_bound_hostname code into helper
For now we have three places in which we're using `bucket_bound_hostname`. The code is almost the same in all three places, so it'll be good to union it in single helper:
https://github.com/googleapis/python-storage/blob/616f1079e2c8b5a4c900f663a9688da64e2bc1b0/google/cloud/storage/blob.py#L517-L522

https://github.com/googleapis/python-storage/blob/616f1079e2c8b5a4c900f663a9688da64e2bc1b0/google/cloud/storage/bucket.py#L2531-L2536

https://github.com/googleapis/python-storage/blob/616f1079e2c8b5a4c900f663a9688da64e2bc1b0/google/cloud/storage/client.py#L1014-L1020
diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py
index dee170e..e295cbe 100644
--- a/tests/unit/test__helpers.py
+++ b/tests/unit/test__helpers.py
@@ -525,6 +525,24 @@ class Test__add_generation_match_parameters(unittest.TestCase):
             )
 
 
+class Test__bucket_bound_hostname_url(unittest.TestCase):
+    def _call_fut(self, **args):
+        from google.cloud.storage._helpers import _bucket_bound_hostname_url
+
+        return _bucket_bound_hostname_url(**args)
+
+    def test_full_hostname(self):
+        HOST = "scheme://domain.tcl/"
+        self.assertEqual(self._call_fut(host=HOST), HOST)
+
+    def test_hostname_and_scheme(self):
+        HOST = "domain.tcl"
+        SCHEME = "scheme"
+        EXPECTED_URL = SCHEME + "://" + HOST + "/"
+
+        self.assertEqual(self._call_fut(host=HOST, scheme=SCHEME), EXPECTED_URL)
+
+
 class _Connection(object):
     def __init__(self, *responses):
         self._responses = responses
diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py
index 0a5bfd9..cd0eae0 100644
--- a/tests/unit/test_blob.py
+++ b/tests/unit/test_blob.py
@@ -405,6 +405,7 @@ class Test_Blob(unittest.TestCase):
     ):
         from six.moves.urllib import parse
         from google.cloud._helpers import UTC
+        from google.cloud.storage._helpers import _bucket_bound_hostname_url
         from google.cloud.storage.blob import _API_ACCESS_ENDPOINT
         from google.cloud.storage.blob import _get_encryption_headers
 
@@ -464,12 +465,9 @@ class Test_Blob(unittest.TestCase):
                 bucket.name
             )
         elif bucket_bound_hostname:
-            if ":" in bucket_bound_hostname:
-                expected_api_access_endpoint = bucket_bound_hostname
-            else:
-                expected_api_access_endpoint = "{scheme}://{bucket_bound_hostname}".format(
-                    scheme=scheme, bucket_bound_hostname=bucket_bound_hostname
-                )
+            expected_api_access_endpoint = _bucket_bound_hostname_url(
+                bucket_bound_hostname, scheme
+            )
         else:
             expected_api_access_endpoint = api_access_endpoint
             expected_resource = "/{}/{}".format(bucket.name, quoted_name)
diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py
index 5069d87..2932036 100644
--- a/tests/unit/test_bucket.py
+++ b/tests/unit/test_bucket.py
@@ -2990,6 +2990,7 @@ class Test_Bucket(unittest.TestCase):
     ):
         from six.moves.urllib import parse
         from google.cloud._helpers import UTC
+        from google.cloud.storage._helpers import _bucket_bound_hostname_url
         from google.cloud.storage.blob import _API_ACCESS_ENDPOINT
 
         api_access_endpoint = api_access_endpoint or _API_ACCESS_ENDPOINT
@@ -3037,12 +3038,9 @@ class Test_Bucket(unittest.TestCase):
                 bucket_name
             )
         elif bucket_bound_hostname:
-            if ":" in bucket_bound_hostname:
-                expected_api_access_endpoint = bucket_bound_hostname
-            else:
-                expected_api_access_endpoint = "{scheme}://{bucket_bound_hostname}".format(
-                    scheme=scheme, bucket_bound_hostname=bucket_bound_hostname
-                )
+            expected_api_access_endpoint = _bucket_bound_hostname_url(
+                bucket_bound_hostname, scheme
+            )
         else:
             expected_api_access_endpoint = api_access_endpoint
             expected_resource = "/{}".format(parse.quote(bucket_name))

pip install -e .
parse_log_pytest
pytest
pytest pytest-cov mock
3.8
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
cachetools==4.2.4
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.6.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
google-api-core==2.10.2
google-auth==1.35.0
google-cloud-core==1.7.3
-e git+https://github.com/googleapis/python-storage.git@e516ed9be518e30df4e201d3242f979c0b081086#egg=google_cloud_storage
google-resumable-media==0.5.1
googleapis-common-protos==1.69.2
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
mock==5.2.0
packaging @ file:///croot/packaging_1720101850331/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042571233/work
protobuf==4.25.6
pyasn1==0.6.1
pyasn1_modules==0.4.2
pytest @ file:///croot/pytest_1717793244625/work
pytest-cov==5.0.0
requests==2.32.3
rsa==4.9
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
urllib3==2.2.3

name: python-storage
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py38h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.1=py38h06a4308_0
  - pip=24.2=py38h06a4308_0
  - pluggy=1.0.0=py38h06a4308_1
  - pytest=7.4.4=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py38h06a4308_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==4.2.4
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.6.1
      - google-api-core==2.10.2
      - google-auth==1.35.0
      - google-cloud-core==1.7.3
      - google-resumable-media==0.5.1
      - googleapis-common-protos==1.69.2
      - idna==3.10
      - mock==5.2.0
      - protobuf==4.25.6
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pytest-cov==5.0.0
      - requests==2.32.3
      - rsa==4.9
      - six==1.17.0
      - urllib3==2.2.3
prefix: /opt/conda/envs/python-storage

tests/unit/test__helpers.py::Test__bucket_bound_hostname_url::test_full_hostname tests/unit/test__helpers.py::Test__bucket_bound_hostname_url::test_hostname_and_scheme tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_no_version_passed_warning tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_content_md5 tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_content_type tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_credentials tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_csek tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_csek_and_headers tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_defaults tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_endpoint tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_expiration tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_generation tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_headers tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_lowercase_method tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_method tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_non_ascii_name tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_response_disposition tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_response_type tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_slash_in_name tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v2_w_tilde_in_name tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_bucket_bound_hostname_w_bare_hostname tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_bucket_bound_hostname_w_scheme tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_content_md5 tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_content_type tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_credentials tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_csek tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_csek_and_headers tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_defaults tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_endpoint tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_generation tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_headers tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_lowercase_method tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_method tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_non_ascii_name tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_response_disposition tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_response_type tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_slash_in_name tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_tilde_in_name tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_v4_w_virtual_hostname tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_no_version_passed_warning tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_content_md5 tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_content_type tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_credentials tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_defaults tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_endpoint tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_expiration tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_generation tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_headers tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_lowercase_method tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_method tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_response_disposition tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v2_w_response_type tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_bucket_bound_hostname_w_bare_hostname tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_bucket_bound_hostname_w_scheme tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_content_md5 tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_content_type tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_credentials tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_defaults tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_endpoint tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_generation tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_headers tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_lowercase_method tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_method tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_response_disposition tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_response_type tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_v4_w_virtual_hostname
tests/unit/test_bucket.py::Test_IAMConfiguration::test_ctor_explicit_bpo tests/unit/test_bucket.py::Test_IAMConfiguration::test_ctor_explicit_ubla tests/unit/test_bucket.py::Test_IAMConfiguration::test_ctor_ubla_and_bpo_time tests/unit/test_bucket.py::Test_IAMConfiguration::test_from_api_repr_w_enabled tests/unit/test_bucket.py::Test_Bucket::test_create_deprecated tests/unit/test_bucket.py::Test_Bucket::test_create_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_iam_configuration_policy_w_entry
tests/unit/test__helpers.py::Test__get_storage_host::test_w_env_var tests/unit/test__helpers.py::Test__get_storage_host::test_wo_env_var tests/unit/test__helpers.py::Test_PropertyMixin::test__encryption_headers tests/unit/test__helpers.py::Test_PropertyMixin::test__patch_property tests/unit/test__helpers.py::Test_PropertyMixin::test__query_params_w_user_project tests/unit/test__helpers.py::Test_PropertyMixin::test__query_params_wo_user_project tests/unit/test__helpers.py::Test_PropertyMixin::test__set_properties tests/unit/test__helpers.py::Test_PropertyMixin::test_client_is_abstract tests/unit/test__helpers.py::Test_PropertyMixin::test_patch tests/unit/test__helpers.py::Test_PropertyMixin::test_patch_w_user_project tests/unit/test__helpers.py::Test_PropertyMixin::test_patch_with_metageneration_match tests/unit/test__helpers.py::Test_PropertyMixin::test_path_is_abstract tests/unit/test__helpers.py::Test_PropertyMixin::test_reload tests/unit/test__helpers.py::Test_PropertyMixin::test_reload_w_projection tests/unit/test__helpers.py::Test_PropertyMixin::test_reload_w_user_project tests/unit/test__helpers.py::Test_PropertyMixin::test_reload_with_generation_match tests/unit/test__helpers.py::Test_PropertyMixin::test_update tests/unit/test__helpers.py::Test_PropertyMixin::test_update_w_user_project tests/unit/test__helpers.py::Test_PropertyMixin::test_update_with_metageneration_not_match tests/unit/test__helpers.py::Test_PropertyMixin::test_user_project_is_abstract tests/unit/test__helpers.py::Test__scalar_property::test_getter tests/unit/test__helpers.py::Test__scalar_property::test_setter tests/unit/test__helpers.py::Test__base64_md5hash::test_it tests/unit/test__helpers.py::Test__base64_md5hash::test_it_with_stubs tests/unit/test__helpers.py::Test__add_generation_match_parameters::test_add_generation_match_parameters_dict tests/unit/test__helpers.py::Test__add_generation_match_parameters::test_add_generation_match_parameters_list tests/unit/test__helpers.py::Test__add_generation_match_parameters::test_add_generation_match_parameters_tuple tests/unit/test_blob.py::Test_Blob::test__do_download_w_chunks_w_range_w_raw tests/unit/test_blob.py::Test_Blob::test__do_download_w_chunks_w_range_wo_raw tests/unit/test_blob.py::Test_Blob::test__do_download_w_chunks_wo_range_w_raw tests/unit/test_blob.py::Test_Blob::test__do_download_w_chunks_wo_range_wo_raw tests/unit/test_blob.py::Test_Blob::test__do_download_wo_chunks_w_range_w_raw tests/unit/test_blob.py::Test_Blob::test__do_download_wo_chunks_w_range_wo_raw tests/unit/test_blob.py::Test_Blob::test__do_download_wo_chunks_wo_range_w_raw tests/unit/test_blob.py::Test_Blob::test__do_download_wo_chunks_wo_range_wo_raw tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_bad_size tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_no_size tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_generation_match tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_generation_not_match tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_kms tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_kms_with_version tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_retry tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_size tests/unit/test_blob.py::Test_Blob::test__do_multipart_upload_with_user_project tests/unit/test_blob.py::Test_Blob::test__do_resumable_upload_no_size tests/unit/test_blob.py::Test_Blob::test__do_resumable_upload_with_predefined_acl tests/unit/test_blob.py::Test_Blob::test__do_resumable_upload_with_retry tests/unit/test_blob.py::Test_Blob::test__do_resumable_upload_with_size tests/unit/test_blob.py::Test_Blob::test__do_upload_uses_multipart tests/unit/test_blob.py::Test_Blob::test__do_upload_uses_resumable tests/unit/test_blob.py::Test_Blob::test__do_upload_with_retry tests/unit/test_blob.py::Test_Blob::test__encryption_headers_w_encryption_key tests/unit/test_blob.py::Test_Blob::test__encryption_headers_wo_encryption_key tests/unit/test_blob.py::Test_Blob::test__get_content_type_default tests/unit/test_blob.py::Test_Blob::test__get_content_type_explicit tests/unit/test_blob.py::Test_Blob::test__get_content_type_from_blob tests/unit/test_blob.py::Test_Blob::test__get_content_type_from_filename tests/unit/test_blob.py::Test_Blob::test__get_download_url_on_the_fly tests/unit/test_blob.py::Test_Blob::test__get_download_url_on_the_fly_with_generation tests/unit/test_blob.py::Test_Blob::test__get_download_url_on_the_fly_with_kms_key_name tests/unit/test_blob.py::Test_Blob::test__get_download_url_on_the_fly_with_user_project tests/unit/test_blob.py::Test_Blob::test__get_download_url_with_generation_match tests/unit/test_blob.py::Test_Blob::test__get_download_url_with_media_link tests/unit/test_blob.py::Test_Blob::test__get_download_url_with_media_link_w_user_project tests/unit/test_blob.py::Test_Blob::test__get_transport tests/unit/test_blob.py::Test_Blob::test__get_upload_arguments tests/unit/test_blob.py::Test_Blob::test__get_writable_metadata_no_changes tests/unit/test_blob.py::Test_Blob::test__get_writable_metadata_unwritable_field tests/unit/test_blob.py::Test_Blob::test__get_writable_metadata_with_changes tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_no_size tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_chunk_size tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_extra_headers tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_generation_match tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_generation_not_match tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_kms tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_kms_with_version tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_predefined_acl tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_retry tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_size tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_with_user_project tests/unit/test_blob.py::Test_Blob::test__initiate_resumable_upload_without_chunk_size tests/unit/test_blob.py::Test_Blob::test__query_params_default tests/unit/test_blob.py::Test_Blob::test__query_params_w_generation tests/unit/test_blob.py::Test_Blob::test__query_params_w_user_project tests/unit/test_blob.py::Test_Blob::test__set_metadata_to_none tests/unit/test_blob.py::Test_Blob::test__set_properties_w_kms_key_name tests/unit/test_blob.py::Test_Blob::test__set_properties_wo_kms_key_name tests/unit/test_blob.py::Test_Blob::test_acl_property tests/unit/test_blob.py::Test_Blob::test_bucket_readonly_property tests/unit/test_blob.py::Test_Blob::test_cache_control_getter tests/unit/test_blob.py::Test_Blob::test_cache_control_setter tests/unit/test_blob.py::Test_Blob::test_chunk_size_ctor tests/unit/test_blob.py::Test_Blob::test_chunk_size_getter tests/unit/test_blob.py::Test_Blob::test_chunk_size_setter tests/unit/test_blob.py::Test_Blob::test_chunk_size_setter_bad_value tests/unit/test_blob.py::Test_Blob::test_client tests/unit/test_blob.py::Test_Blob::test_component_count tests/unit/test_blob.py::Test_Blob::test_component_count_string_val tests/unit/test_blob.py::Test_Blob::test_component_count_unset tests/unit/test_blob.py::Test_Blob::test_compose_minimal_w_user_project tests/unit/test_blob.py::Test_Blob::test_compose_w_additional_property_changes tests/unit/test_blob.py::Test_Blob::test_compose_wo_content_type_set tests/unit/test_blob.py::Test_Blob::test_content_disposition_getter tests/unit/test_blob.py::Test_Blob::test_content_disposition_setter tests/unit/test_blob.py::Test_Blob::test_content_encoding_getter tests/unit/test_blob.py::Test_Blob::test_content_encoding_setter tests/unit/test_blob.py::Test_Blob::test_content_language_getter tests/unit/test_blob.py::Test_Blob::test_content_language_setter tests/unit/test_blob.py::Test_Blob::test_content_type_getter tests/unit/test_blob.py::Test_Blob::test_content_type_setter tests/unit/test_blob.py::Test_Blob::test_crc32c_getter tests/unit/test_blob.py::Test_Blob::test_crc32c_setter tests/unit/test_blob.py::Test_Blob::test_create_resumable_upload_session tests/unit/test_blob.py::Test_Blob::test_create_resumable_upload_session_with_failure tests/unit/test_blob.py::Test_Blob::test_create_resumable_upload_session_with_origin tests/unit/test_blob.py::Test_Blob::test_ctor_w_encryption_key tests/unit/test_blob.py::Test_Blob::test_ctor_w_kms_key_name tests/unit/test_blob.py::Test_Blob::test_ctor_w_kms_key_name_and_encryption_key tests/unit/test_blob.py::Test_Blob::test_ctor_with_encoded_unicode tests/unit/test_blob.py::Test_Blob::test_ctor_with_generation tests/unit/test_blob.py::Test_Blob::test_ctor_wo_encryption_key tests/unit/test_blob.py::Test_Blob::test_delete_w_generation tests/unit/test_blob.py::Test_Blob::test_delete_w_generation_match tests/unit/test_blob.py::Test_Blob::test_delete_wo_generation tests/unit/test_blob.py::Test_Blob::test_download_as_string_w_generation_match tests/unit/test_blob.py::Test_Blob::test_download_as_string_w_raw tests/unit/test_blob.py::Test_Blob::test_download_as_string_wo_raw tests/unit/test_blob.py::Test_Blob::test_download_to_file_w_chunks_w_raw tests/unit/test_blob.py::Test_Blob::test_download_to_file_w_chunks_wo_raw tests/unit/test_blob.py::Test_Blob::test_download_to_file_w_generation_match tests/unit/test_blob.py::Test_Blob::test_download_to_file_with_failure tests/unit/test_blob.py::Test_Blob::test_download_to_file_wo_chunks_w_raw tests/unit/test_blob.py::Test_Blob::test_download_to_file_wo_chunks_wo_raw tests/unit/test_blob.py::Test_Blob::test_download_to_file_wo_media_link tests/unit/test_blob.py::Test_Blob::test_download_to_filename_corrupted tests/unit/test_blob.py::Test_Blob::test_download_to_filename_w_generation_match tests/unit/test_blob.py::Test_Blob::test_download_to_filename_w_key tests/unit/test_blob.py::Test_Blob::test_download_to_filename_w_updated_w_raw tests/unit/test_blob.py::Test_Blob::test_download_to_filename_w_updated_wo_raw tests/unit/test_blob.py::Test_Blob::test_download_to_filename_wo_updated_w_raw tests/unit/test_blob.py::Test_Blob::test_download_to_filename_wo_updated_wo_raw tests/unit/test_blob.py::Test_Blob::test_etag tests/unit/test_blob.py::Test_Blob::test_event_based_hold_getter_false tests/unit/test_blob.py::Test_Blob::test_event_based_hold_getter_missing tests/unit/test_blob.py::Test_Blob::test_event_based_hold_getter_true tests/unit/test_blob.py::Test_Blob::test_event_based_hold_setter tests/unit/test_blob.py::Test_Blob::test_exists_hit_w_generation tests/unit/test_blob.py::Test_Blob::test_exists_hit_w_user_project tests/unit/test_blob.py::Test_Blob::test_exists_miss tests/unit/test_blob.py::Test_Blob::test_exists_w_generation_match tests/unit/test_blob.py::Test_Blob::test_from_string_w_domain_name_bucket tests/unit/test_blob.py::Test_Blob::test_from_string_w_invalid_uri tests/unit/test_blob.py::Test_Blob::test_from_string_w_valid_uri tests/unit/test_blob.py::Test_Blob::test_generate_signed_url_w_invalid_version tests/unit/test_blob.py::Test_Blob::test_generation tests/unit/test_blob.py::Test_Blob::test_generation_string_val tests/unit/test_blob.py::Test_Blob::test_generation_unset tests/unit/test_blob.py::Test_Blob::test_get_iam_policy tests/unit/test_blob.py::Test_Blob::test_get_iam_policy_w_requested_policy_version tests/unit/test_blob.py::Test_Blob::test_get_iam_policy_w_user_project tests/unit/test_blob.py::Test_Blob::test_id tests/unit/test_blob.py::Test_Blob::test_make_private tests/unit/test_blob.py::Test_Blob::test_make_public tests/unit/test_blob.py::Test_Blob::test_md5_hash_getter tests/unit/test_blob.py::Test_Blob::test_md5_hash_setter tests/unit/test_blob.py::Test_Blob::test_media_link tests/unit/test_blob.py::Test_Blob::test_metadata_getter tests/unit/test_blob.py::Test_Blob::test_metadata_setter tests/unit/test_blob.py::Test_Blob::test_metadata_setter_w_nan tests/unit/test_blob.py::Test_Blob::test_metageneration tests/unit/test_blob.py::Test_Blob::test_metageneration_string_val tests/unit/test_blob.py::Test_Blob::test_metageneration_unset tests/unit/test_blob.py::Test_Blob::test_owner tests/unit/test_blob.py::Test_Blob::test_path_bad_bucket tests/unit/test_blob.py::Test_Blob::test_path_no_name tests/unit/test_blob.py::Test_Blob::test_path_normal tests/unit/test_blob.py::Test_Blob::test_path_w_slash_in_name tests/unit/test_blob.py::Test_Blob::test_path_with_non_ascii tests/unit/test_blob.py::Test_Blob::test_public_url tests/unit/test_blob.py::Test_Blob::test_public_url_w_slash_in_name tests/unit/test_blob.py::Test_Blob::test_public_url_w_tilde_in_name tests/unit/test_blob.py::Test_Blob::test_public_url_with_non_ascii tests/unit/test_blob.py::Test_Blob::test_retention_expiration_time tests/unit/test_blob.py::Test_Blob::test_retention_expiration_time_unset tests/unit/test_blob.py::Test_Blob::test_rewrite_other_bucket_other_name_no_encryption_partial tests/unit/test_blob.py::Test_Blob::test_rewrite_response_without_resource tests/unit/test_blob.py::Test_Blob::test_rewrite_same_name_no_key_new_key_w_token tests/unit/test_blob.py::Test_Blob::test_rewrite_same_name_no_old_key_new_key_done_w_user_project tests/unit/test_blob.py::Test_Blob::test_rewrite_same_name_w_old_key_new_kms_key tests/unit/test_blob.py::Test_Blob::test_rewrite_w_generation_match tests/unit/test_blob.py::Test_Blob::test_rewrite_w_generations tests/unit/test_blob.py::Test_Blob::test_self_link tests/unit/test_blob.py::Test_Blob::test_set_iam_policy tests/unit/test_blob.py::Test_Blob::test_set_iam_policy_w_user_project tests/unit/test_blob.py::Test_Blob::test_size tests/unit/test_blob.py::Test_Blob::test_size_string_val tests/unit/test_blob.py::Test_Blob::test_size_unset tests/unit/test_blob.py::Test_Blob::test_storage_class_getter tests/unit/test_blob.py::Test_Blob::test_storage_class_setter tests/unit/test_blob.py::Test_Blob::test_temporary_hold_getter_false tests/unit/test_blob.py::Test_Blob::test_temporary_hold_getter_missing tests/unit/test_blob.py::Test_Blob::test_temporary_hold_getter_true tests/unit/test_blob.py::Test_Blob::test_temporary_hold_setter tests/unit/test_blob.py::Test_Blob::test_test_iam_permissions tests/unit/test_blob.py::Test_Blob::test_test_iam_permissions_w_user_project tests/unit/test_blob.py::Test_Blob::test_time_created tests/unit/test_blob.py::Test_Blob::test_time_created_unset tests/unit/test_blob.py::Test_Blob::test_time_deleted tests/unit/test_blob.py::Test_Blob::test_time_deleted_unset tests/unit/test_blob.py::Test_Blob::test_update_storage_class_invalid tests/unit/test_blob.py::Test_Blob::test_update_storage_class_large_file tests/unit/test_blob.py::Test_Blob::test_update_storage_class_w_encryption_key_w_user_project tests/unit/test_blob.py::Test_Blob::test_update_storage_class_w_generation_match tests/unit/test_blob.py::Test_Blob::test_update_storage_class_wo_encryption_key tests/unit/test_blob.py::Test_Blob::test_updated tests/unit/test_blob.py::Test_Blob::test_updated_unset tests/unit/test_blob.py::Test_Blob::test_upload_from_file_failure tests/unit/test_blob.py::Test_Blob::test_upload_from_file_success tests/unit/test_blob.py::Test_Blob::test_upload_from_file_with_retries tests/unit/test_blob.py::Test_Blob::test_upload_from_file_with_rewind tests/unit/test_blob.py::Test_Blob::test_upload_from_filename tests/unit/test_blob.py::Test_Blob::test_upload_from_string_w_bytes tests/unit/test_blob.py::Test_Blob::test_upload_from_string_w_text tests/unit/test_blob.py::Test_Blob::test_user_project tests/unit/test_blob.py::Test__quote::test_bad_type tests/unit/test_blob.py::Test__quote::test_bytes tests/unit/test_blob.py::Test__quote::test_unicode tests/unit/test_blob.py::Test__quote::test_w_slash_default tests/unit/test_blob.py::Test__quote::test_w_slash_w_safe tests/unit/test_blob.py::Test__quote::test_w_tilde tests/unit/test_blob.py::Test__maybe_rewind::test_default tests/unit/test_blob.py::Test__maybe_rewind::test_do_not_rewind tests/unit/test_blob.py::Test__maybe_rewind::test_do_rewind tests/unit/test_blob.py::Test__raise_from_invalid_response::test_default tests/unit/test_blob.py::Test__raise_from_invalid_response::test_w_206_and_args tests/unit/test_blob.py::Test__add_query_parameters::test_w_empty_list tests/unit/test_blob.py::Test__add_query_parameters::test_w_existing_qs tests/unit/test_blob.py::Test__add_query_parameters::test_wo_existing_qs tests/unit/test_bucket.py::Test_LifecycleRuleConditions::test_ctor_w_age_and_matches_storage_class tests/unit/test_bucket.py::Test_LifecycleRuleConditions::test_ctor_w_created_before_and_is_live tests/unit/test_bucket.py::Test_LifecycleRuleConditions::test_ctor_w_number_of_newer_versions tests/unit/test_bucket.py::Test_LifecycleRuleConditions::test_ctor_wo_conditions tests/unit/test_bucket.py::Test_LifecycleRuleConditions::test_from_api_repr tests/unit/test_bucket.py::Test_LifecycleRuleDelete::test_ctor_w_condition tests/unit/test_bucket.py::Test_LifecycleRuleDelete::test_ctor_wo_conditions tests/unit/test_bucket.py::Test_LifecycleRuleDelete::test_from_api_repr tests/unit/test_bucket.py::Test_LifecycleRuleSetStorageClass::test_ctor_w_condition tests/unit/test_bucket.py::Test_LifecycleRuleSetStorageClass::test_ctor_wo_conditions tests/unit/test_bucket.py::Test_LifecycleRuleSetStorageClass::test_from_api_repr tests/unit/test_bucket.py::Test_IAMConfiguration::test_bucket_policy_only_enabled_setter tests/unit/test_bucket.py::Test_IAMConfiguration::test_ctor_defaults tests/unit/test_bucket.py::Test_IAMConfiguration::test_ctor_ubla_and_bpo_enabled tests/unit/test_bucket.py::Test_IAMConfiguration::test_from_api_repr_w_disabled tests/unit/test_bucket.py::Test_IAMConfiguration::test_from_api_repr_w_empty_bpo tests/unit/test_bucket.py::Test_IAMConfiguration::test_from_api_repr_w_empty_resource tests/unit/test_bucket.py::Test_IAMConfiguration::test_uniform_bucket_level_access_enabled_setter tests/unit/test_bucket.py::Test_Bucket::test_acl_property tests/unit/test_bucket.py::Test_Bucket::test_add_lifecycle_delete_rule tests/unit/test_bucket.py::Test_Bucket::test_add_lifecycle_set_storage_class_rule tests/unit/test_bucket.py::Test_Bucket::test_blob_w_encryption_key tests/unit/test_bucket.py::Test_Bucket::test_blob_w_generation tests/unit/test_bucket.py::Test_Bucket::test_blob_w_kms_key_name tests/unit/test_bucket.py::Test_Bucket::test_blob_wo_keys tests/unit/test_bucket.py::Test_Bucket::test_bucket_name_value tests/unit/test_bucket.py::Test_Bucket::test_clear_lifecycle_rules tests/unit/test_bucket.py::Test_Bucket::test_configure_website tests/unit/test_bucket.py::Test_Bucket::test_configure_website_defaults tests/unit/test_bucket.py::Test_Bucket::test_copy_blobs_preserve_acl tests/unit/test_bucket.py::Test_Bucket::test_copy_blobs_source_generation tests/unit/test_bucket.py::Test_Bucket::test_copy_blobs_w_generation_match tests/unit/test_bucket.py::Test_Bucket::test_copy_blobs_w_name_and_user_project tests/unit/test_bucket.py::Test_Bucket::test_copy_blobs_wo_name tests/unit/test_bucket.py::Test_Bucket::test_cors_getter tests/unit/test_bucket.py::Test_Bucket::test_cors_setter tests/unit/test_bucket.py::Test_Bucket::test_ctor tests/unit/test_bucket.py::Test_Bucket::test_ctor_w_invalid_name tests/unit/test_bucket.py::Test_Bucket::test_ctor_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_cumulative_prefixes tests/unit/test_bucket.py::Test_Bucket::test_default_kms_key_name_getter tests/unit/test_bucket.py::Test_Bucket::test_default_kms_key_name_setter tests/unit/test_bucket.py::Test_Bucket::test_default_object_acl_property tests/unit/test_bucket.py::Test_Bucket::test_delete_blob_hit_with_generation tests/unit/test_bucket.py::Test_Bucket::test_delete_blob_hit_with_user_project tests/unit/test_bucket.py::Test_Bucket::test_delete_blob_miss tests/unit/test_bucket.py::Test_Bucket::test_delete_blob_with_generation_match tests/unit/test_bucket.py::Test_Bucket::test_delete_blobs_empty tests/unit/test_bucket.py::Test_Bucket::test_delete_blobs_hit_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_delete_blobs_miss_no_on_error tests/unit/test_bucket.py::Test_Bucket::test_delete_blobs_miss_w_on_error tests/unit/test_bucket.py::Test_Bucket::test_delete_force_delete_blobs tests/unit/test_bucket.py::Test_Bucket::test_delete_force_miss_blobs tests/unit/test_bucket.py::Test_Bucket::test_delete_hit_with_user_project tests/unit/test_bucket.py::Test_Bucket::test_delete_miss tests/unit/test_bucket.py::Test_Bucket::test_delete_too_many tests/unit/test_bucket.py::Test_Bucket::test_delete_with_metageneration_match tests/unit/test_bucket.py::Test_Bucket::test_disable_logging tests/unit/test_bucket.py::Test_Bucket::test_disable_website tests/unit/test_bucket.py::Test_Bucket::test_enable_logging tests/unit/test_bucket.py::Test_Bucket::test_enable_logging_defaults tests/unit/test_bucket.py::Test_Bucket::test_etag tests/unit/test_bucket.py::Test_Bucket::test_exists_hit_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_exists_miss tests/unit/test_bucket.py::Test_Bucket::test_exists_with_metageneration_match tests/unit/test_bucket.py::Test_Bucket::test_generate_signed_url_w_invalid_version tests/unit/test_bucket.py::Test_Bucket::test_generate_upload_policy tests/unit/test_bucket.py::Test_Bucket::test_generate_upload_policy_args tests/unit/test_bucket.py::Test_Bucket::test_generate_upload_policy_bad_credentials tests/unit/test_bucket.py::Test_Bucket::test_get_blob_hit_w_generation tests/unit/test_bucket.py::Test_Bucket::test_get_blob_hit_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_get_blob_hit_with_kwargs tests/unit/test_bucket.py::Test_Bucket::test_get_blob_miss tests/unit/test_bucket.py::Test_Bucket::test_get_blob_w_generation_match tests/unit/test_bucket.py::Test_Bucket::test_get_bucket_from_string_w_domain_name_bucket tests/unit/test_bucket.py::Test_Bucket::test_get_bucket_from_string_w_invalid_uri tests/unit/test_bucket.py::Test_Bucket::test_get_bucket_from_string_w_valid_uri tests/unit/test_bucket.py::Test_Bucket::test_get_iam_policy tests/unit/test_bucket.py::Test_Bucket::test_get_iam_policy_w_requested_policy_version tests/unit/test_bucket.py::Test_Bucket::test_get_iam_policy_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_get_logging_w_prefix tests/unit/test_bucket.py::Test_Bucket::test_get_notification tests/unit/test_bucket.py::Test_Bucket::test_get_notification_miss tests/unit/test_bucket.py::Test_Bucket::test_iam_configuration_policy_missing tests/unit/test_bucket.py::Test_Bucket::test_id tests/unit/test_bucket.py::Test_Bucket::test_labels_getter tests/unit/test_bucket.py::Test_Bucket::test_labels_setter tests/unit/test_bucket.py::Test_Bucket::test_labels_setter_with_nan tests/unit/test_bucket.py::Test_Bucket::test_labels_setter_with_removal tests/unit/test_bucket.py::Test_Bucket::test_lifecycle_rules_getter tests/unit/test_bucket.py::Test_Bucket::test_lifecycle_rules_getter_unknown_action_type tests/unit/test_bucket.py::Test_Bucket::test_lifecycle_rules_setter_w_dicts tests/unit/test_bucket.py::Test_Bucket::test_lifecycle_rules_setter_w_helpers tests/unit/test_bucket.py::Test_Bucket::test_list_blobs_defaults tests/unit/test_bucket.py::Test_Bucket::test_list_blobs_w_all_arguments_and_user_project tests/unit/test_bucket.py::Test_Bucket::test_list_notifications tests/unit/test_bucket.py::Test_Bucket::test_location_getter tests/unit/test_bucket.py::Test_Bucket::test_location_setter tests/unit/test_bucket.py::Test_Bucket::test_location_type_getter_set tests/unit/test_bucket.py::Test_Bucket::test_location_type_getter_unset tests/unit/test_bucket.py::Test_Bucket::test_lock_retention_policy_already_locked tests/unit/test_bucket.py::Test_Bucket::test_lock_retention_policy_no_metageneration tests/unit/test_bucket.py::Test_Bucket::test_lock_retention_policy_no_policy_set tests/unit/test_bucket.py::Test_Bucket::test_lock_retention_policy_ok tests/unit/test_bucket.py::Test_Bucket::test_lock_retention_policy_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_make_private_defaults tests/unit/test_bucket.py::Test_Bucket::test_make_private_recursive tests/unit/test_bucket.py::Test_Bucket::test_make_private_recursive_too_many tests/unit/test_bucket.py::Test_Bucket::test_make_private_w_future tests/unit/test_bucket.py::Test_Bucket::test_make_private_w_future_reload_default tests/unit/test_bucket.py::Test_Bucket::test_make_public_defaults tests/unit/test_bucket.py::Test_Bucket::test_make_public_recursive tests/unit/test_bucket.py::Test_Bucket::test_make_public_recursive_too_many tests/unit/test_bucket.py::Test_Bucket::test_make_public_w_future tests/unit/test_bucket.py::Test_Bucket::test_make_public_w_future_reload_default tests/unit/test_bucket.py::Test_Bucket::test_metageneration tests/unit/test_bucket.py::Test_Bucket::test_metageneration_string_val tests/unit/test_bucket.py::Test_Bucket::test_metageneration_unset tests/unit/test_bucket.py::Test_Bucket::test_notification_defaults tests/unit/test_bucket.py::Test_Bucket::test_notification_explicit tests/unit/test_bucket.py::Test_Bucket::test_owner tests/unit/test_bucket.py::Test_Bucket::test_page_empty_response tests/unit/test_bucket.py::Test_Bucket::test_page_non_empty_response tests/unit/test_bucket.py::Test_Bucket::test_path_no_name tests/unit/test_bucket.py::Test_Bucket::test_path_w_name tests/unit/test_bucket.py::Test_Bucket::test_project_number tests/unit/test_bucket.py::Test_Bucket::test_project_number_string_val tests/unit/test_bucket.py::Test_Bucket::test_project_number_unset tests/unit/test_bucket.py::Test_Bucket::test_reload_bucket_w_generation_match tests/unit/test_bucket.py::Test_Bucket::test_reload_bucket_w_metageneration_match tests/unit/test_bucket.py::Test_Bucket::test_rename_blob tests/unit/test_bucket.py::Test_Bucket::test_rename_blob_to_itself tests/unit/test_bucket.py::Test_Bucket::test_requester_pays_getter tests/unit/test_bucket.py::Test_Bucket::test_requester_pays_getter_missing tests/unit/test_bucket.py::Test_Bucket::test_requester_pays_setter tests/unit/test_bucket.py::Test_Bucket::test_retention_period_getter tests/unit/test_bucket.py::Test_Bucket::test_retention_period_getter_policymissing tests/unit/test_bucket.py::Test_Bucket::test_retention_period_getter_pr_missing tests/unit/test_bucket.py::Test_Bucket::test_retention_period_setter_w_int tests/unit/test_bucket.py::Test_Bucket::test_retention_period_setter_w_none tests/unit/test_bucket.py::Test_Bucket::test_retention_policy_effective_time tests/unit/test_bucket.py::Test_Bucket::test_retention_policy_effective_time_et_missing tests/unit/test_bucket.py::Test_Bucket::test_retention_policy_effective_time_policy_missing tests/unit/test_bucket.py::Test_Bucket::test_retention_policy_locked_false tests/unit/test_bucket.py::Test_Bucket::test_retention_policy_locked_missing tests/unit/test_bucket.py::Test_Bucket::test_retention_policy_locked_true tests/unit/test_bucket.py::Test_Bucket::test_self_link tests/unit/test_bucket.py::Test_Bucket::test_set_iam_policy tests/unit/test_bucket.py::Test_Bucket::test_set_iam_policy_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_storage_class_getter tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_ARCHIVE tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_COLDLINE tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_DURABLE_REDUCED_AVAILABILITY tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_MULTI_REGIONAL tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_NEARLINE tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_REGIONAL tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_STANDARD tests/unit/test_bucket.py::Test_Bucket::test_storage_class_setter_invalid tests/unit/test_bucket.py::Test_Bucket::test_test_iam_permissions tests/unit/test_bucket.py::Test_Bucket::test_test_iam_permissions_w_user_project tests/unit/test_bucket.py::Test_Bucket::test_time_created tests/unit/test_bucket.py::Test_Bucket::test_time_created_unset tests/unit/test_bucket.py::Test_Bucket::test_update_bucket_w_generation_match tests/unit/test_bucket.py::Test_Bucket::test_update_bucket_w_metageneration_match tests/unit/test_bucket.py::Test_Bucket::test_user_project tests/unit/test_bucket.py::Test_Bucket::test_versioning_enabled_getter tests/unit/test_bucket.py::Test_Bucket::test_versioning_enabled_getter_missing tests/unit/test_bucket.py::Test_Bucket::test_versioning_enabled_setter
google/cloud/storage/client.py google/cloud/storage/_helpers.py google/cloud/storage/blob.py google/cloud/storage/bucket.py
google/cloud/storage/client.py google/cloud/storage/_helpers.py google/cloud/storage/blob.py google/cloud/storage/bucket.py