diff --git a/google/cloud/storage/blob.py b/google/cloud/storage/blob.py
index dcf7d03..0d41244 100644
--- a/google/cloud/storage/blob.py
+++ b/google/cloud/storage/blob.py
@@ -361,6 +361,7 @@ class Blob(_PropertyMixin):
         version=None,
         service_account_email=None,
         access_token=None,
+        virtual_hosted_style=False,
     ):
         """Generates a signed URL for this blob.
 
@@ -454,6 +455,11 @@ class Blob(_PropertyMixin):
         :type access_token: str
         :param access_token: (Optional) Access token for a service account.
 
+        :type virtual_hosted_style: bool
+        :param virtual_hosted_style:
+            (Optional) If true, then construct the URL relative the bucket's
+            virtual hostname, e.g., '<bucket-name>.storage.googleapis.com'.
+
         :raises: :exc:`ValueError` when version is invalid.
         :raises: :exc:`TypeError` when expiration is not a valid type.
         :raises: :exc:`AttributeError` if credentials is not an instance
@@ -469,9 +475,16 @@ class Blob(_PropertyMixin):
             raise ValueError("'version' must be either 'v2' or 'v4'")
 
         quoted_name = _quote(self.name, safe=b"/~")
-        resource = "/{bucket_name}/{quoted_name}".format(
-            bucket_name=self.bucket.name, quoted_name=quoted_name
-        )
+
+        if virtual_hosted_style:
+            api_access_endpoint = "https://{bucket_name}.storage.googleapis.com".format(
+                bucket_name=self.bucket.name
+            )
+            resource = "/{quoted_name}".format(quoted_name=quoted_name)
+        else:
+            resource = "/{bucket_name}/{quoted_name}".format(
+                bucket_name=self.bucket.name, quoted_name=quoted_name
+            )
 
         if credentials is None:
             client = self._require_client(client)
diff --git a/google/cloud/storage/bucket.py b/google/cloud/storage/bucket.py
index fae4310..e71b3cb 100644
--- a/google/cloud/storage/bucket.py
+++ b/google/cloud/storage/bucket.py
@@ -2354,6 +2354,7 @@ class Bucket(_PropertyMixin):
         client=None,
         credentials=None,
         version=None,
+        virtual_hosted_style=False,
     ):
         """Generates a signed URL for this bucket.
 
@@ -2416,6 +2417,11 @@ class Bucket(_PropertyMixin):
         :param version: (Optional) The version of signed credential to create.
                         Must be one of 'v2' | 'v4'.
 
+        :type virtual_hosted_style: bool
+        :param virtual_hosted_style:
+            (Optional) If true, then construct the URL relative the bucket's
+            virtual hostname, e.g., '<bucket-name>.storage.googleapis.com'.
+
         :raises: :exc:`ValueError` when version is invalid.
         :raises: :exc:`TypeError` when expiration is not a valid type.
         :raises: :exc:`AttributeError` if credentials is not an instance
@@ -2430,7 +2436,13 @@ class Bucket(_PropertyMixin):
         elif version not in ("v2", "v4"):
             raise ValueError("'version' must be either 'v2' or 'v4'")
 
-        resource = "/{bucket_name}".format(bucket_name=self.name)
+        if virtual_hosted_style:
+            api_access_endpoint = "https://{bucket_name}.storage.googleapis.com".format(
+                bucket_name=self.name
+            )
+            resource = "/"
+        else:
+            resource = "/{bucket_name}".format(bucket_name=self.name)
 
         if credentials is None:
             client = self._require_client(client)

[Storage] V4 Signature Support for virtual hosted-style signed 
Tracking issue for work defined in companion document.

[New Client Request - Support for virtual hosted-style signed URLs](https://docs.google.com/document/d/1TkoDiZjz6nINNVQrYbrfaODhmcMTR-crb94aR1cXZVA/edit#)
diff --git a/tests/unit/test_blob.py b/tests/unit/test_blob.py
index 5246d37..d679b8d 100644
--- a/tests/unit/test_blob.py
+++ b/tests/unit/test_blob.py
@@ -399,6 +399,7 @@ class Test_Blob(unittest.TestCase):
         encryption_key=None,
         access_token=None,
         service_account_email=None,
+        virtual_hosted_style=False,
     ):
         from six.moves.urllib import parse
         from google.cloud._helpers import UTC
@@ -442,6 +443,7 @@ class Test_Blob(unittest.TestCase):
                 version=version,
                 access_token=access_token,
                 service_account_email=service_account_email,
+                virtual_hosted_style=virtual_hosted_style,
             )
 
         self.assertEqual(signed_uri, signer.return_value)
@@ -452,7 +454,17 @@ class Test_Blob(unittest.TestCase):
             expected_creds = credentials
 
         encoded_name = blob_name.encode("utf-8")
-        expected_resource = "/name/{}".format(parse.quote(encoded_name, safe=b"/~"))
+        quoted_name = parse.quote(encoded_name, safe=b"/~")
+
+        if virtual_hosted_style:
+            expected_api_access_endpoint = "https://{}.storage.googleapis.com".format(
+                bucket.name
+            )
+            expected_resource = "/{}".format(quoted_name)
+        else:
+            expected_api_access_endpoint = api_access_endpoint
+            expected_resource = "/{}/{}".format(bucket.name, quoted_name)
+
         if encryption_key is not None:
             expected_headers = headers or {}
             if effective_version == "v2":
@@ -465,7 +477,7 @@ class Test_Blob(unittest.TestCase):
         expected_kwargs = {
             "resource": expected_resource,
             "expiration": expiration,
-            "api_access_endpoint": api_access_endpoint,
+            "api_access_endpoint": expected_api_access_endpoint,
             "method": method.upper(),
             "content_md5": content_md5,
             "content_type": content_type,
@@ -604,6 +616,9 @@ class Test_Blob(unittest.TestCase):
             encryption_key=os.urandom(32), headers={"x-goog-foo": "bar"}
         )
 
+    def test_generate_signed_url_v4_w_virtual_hostname(self):
+        self._generate_signed_url_v4_helper(virtual_hosted_style=True)
+
     def test_generate_signed_url_v4_w_credentials(self):
         credentials = object()
         self._generate_signed_url_v4_helper(credentials=credentials)
diff --git a/tests/unit/test_bucket.py b/tests/unit/test_bucket.py
index 301dc61..514d016 100644
--- a/tests/unit/test_bucket.py
+++ b/tests/unit/test_bucket.py
@@ -2739,6 +2739,7 @@ class Test_Bucket(unittest.TestCase):
         query_parameters=None,
         credentials=None,
         expiration=None,
+        virtual_hosted_style=False,
     ):
         from six.moves.urllib import parse
         from google.cloud._helpers import UTC
@@ -2773,6 +2774,7 @@ class Test_Bucket(unittest.TestCase):
                 headers=headers,
                 query_parameters=query_parameters,
                 version=version,
+                virtual_hosted_style=virtual_hosted_style,
             )
 
         self.assertEqual(signed_uri, signer.return_value)
@@ -2782,12 +2784,19 @@ class Test_Bucket(unittest.TestCase):
         else:
             expected_creds = credentials
 
-        encoded_name = bucket_name.encode("utf-8")
-        expected_resource = "/{}".format(parse.quote(encoded_name))
+        if virtual_hosted_style:
+            expected_api_access_endpoint = "https://{}.storage.googleapis.com".format(
+                bucket_name
+            )
+            expected_resource = "/"
+        else:
+            expected_api_access_endpoint = api_access_endpoint
+            expected_resource = "/{}".format(parse.quote(bucket_name))
+
         expected_kwargs = {
             "resource": expected_resource,
             "expiration": expiration,
-            "api_access_endpoint": api_access_endpoint,
+            "api_access_endpoint": expected_api_access_endpoint,
             "method": method.upper(),
             "headers": headers,
             "query_parameters": query_parameters,
@@ -2916,6 +2925,9 @@ class Test_Bucket(unittest.TestCase):
         credentials = object()
         self._generate_signed_url_v4_helper(credentials=credentials)
 
+    def test_generate_signed_url_v4_w_virtual_hostname(self):
+        self._generate_signed_url_v4_helper(virtual_hosted_style=True)
+
 
 class _Connection(object):
     _delete_bucket = False

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio mock
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
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.8.0
exceptiongroup==1.2.2
execnet==2.1.1
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@a834d1b54aa96152ced4d841c4e0c241acd2d8d8#egg=google_cloud_storage
google-resumable-media==0.5.1
googleapis-common-protos==1.69.2
idna==3.10
iniconfig==2.1.0
mock==5.2.0
packaging==24.2
pluggy==1.5.0
protobuf==4.25.6
pyasn1==0.6.1
pyasn1_modules==0.4.2
pytest==8.3.5
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
requests==2.32.3
rsa==4.9
six==1.17.0
tomli==2.2.1
typing_extensions==4.13.0
urllib3==2.3.0

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
  - 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
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_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.8.0
      - exceptiongroup==1.2.2
      - execnet==2.1.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
      - iniconfig==2.1.0
      - mock==5.2.0
      - packaging==24.2
      - pluggy==1.5.0
      - protobuf==4.25.6
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pytest==8.3.5
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - requests==2.32.3
      - rsa==4.9
      - six==1.17.0
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - urllib3==2.3.0
prefix: /opt/conda/envs/python-storage

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_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_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_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_kms 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_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_kms 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_wo_generation 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_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_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_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_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_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_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_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_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_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_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_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_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_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/blob.py google/cloud/storage/bucket.py
google/cloud/storage/blob.py google/cloud/storage/bucket.py