Repository: googleapis/python-bigquery

Issue:
default (per API request) timeout of 5 minutes
 **Is your feature request related to a problem? Please describe.**

Since we don't have a timeout by default on our HTTP calls, it's possible that they hang much longer than expected.

 **Describe the solution you'd like**

Set a default timeout to 5 minutes.

As I found in https://github.com/googleapis/python-bigquery/pull/859, many of the backend BigQuery APIs have a deadline of 4 minutes. Giving ourselves 5 minutes per request should be enough time to account for any network latency and download time.

 **Describe alternatives you've considered**

Status quo. -- This makes the time that a request can complete less predicable though.

 **Additional context**

I recall we tried this once before, but reverted it due to too many flakey tests: https://github.com/googleapis/google-cloud-python/pull/10219

That was with 60 seconds, whereas the backend deadline is 4 minutes, so perhaps it's not all too surprising that there were flakes?



Discussion:
Towards internal issue 195337762

Resolving patch:
diff --git a/google/cloud/bigquery/client.py b/google/cloud/bigquery/client.py
--- a/google/cloud/bigquery/client.py
+++ b/google/cloud/bigquery/client.py
@@ -76,17 +76,24 @@
 from google.cloud.bigquery.opentelemetry_tracing import create_span
 from google.cloud.bigquery import job
 from google.cloud.bigquery.job import (
+    CopyJob,
+    CopyJobConfig,
+    ExtractJob,
+    ExtractJobConfig,
+    LoadJob,
     LoadJobConfig,
     QueryJob,
     QueryJobConfig,
-    CopyJobConfig,
-    ExtractJobConfig,
 )
 from google.cloud.bigquery.model import Model
 from google.cloud.bigquery.model import ModelReference
 from google.cloud.bigquery.model import _model_arg_to_model_ref
 from google.cloud.bigquery.query import _QueryResults
-from google.cloud.bigquery.retry import DEFAULT_RETRY, DEFAULT_JOB_RETRY
+from google.cloud.bigquery.retry import (
+    DEFAULT_JOB_RETRY,
+    DEFAULT_RETRY,
+    DEFAULT_TIMEOUT,
+)
 from google.cloud.bigquery.routine import Routine
 from google.cloud.bigquery.routine import RoutineReference
 from google.cloud.bigquery.schema import SchemaField
@@ -245,7 +252,7 @@ def get_service_account_email(
         self,
         project: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> str:
         """Get the email address of the project's BigQuery service account
 
@@ -292,7 +299,7 @@ def list_projects(
         max_results: int = None,
         page_token: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         page_size: int = None,
     ) -> page_iterator.Iterator:
         """List projects for the project associated with this client.
@@ -358,7 +365,7 @@ def list_datasets(
         max_results: int = None,
         page_token: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         page_size: int = None,
     ) -> page_iterator.Iterator:
         """List datasets for the project associated with this client.
@@ -549,7 +556,7 @@ def create_dataset(
         dataset: Union[str, Dataset, DatasetReference],
         exists_ok: bool = False,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Dataset:
         """API call: create the dataset via a POST request.
 
@@ -624,7 +631,7 @@ def create_routine(
         routine: Routine,
         exists_ok: bool = False,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Routine:
         """[Beta] Create a routine via a POST request.
 
@@ -679,7 +686,7 @@ def create_table(
         table: Union[str, Table, TableReference],
         exists_ok: bool = False,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Table:
         """API call:  create a table via a PUT request
 
@@ -751,7 +758,7 @@ def get_dataset(
         self,
         dataset_ref: Union[DatasetReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Dataset:
         """Fetch the dataset referenced by ``dataset_ref``
 
@@ -795,7 +802,7 @@ def get_iam_policy(
         table: Union[Table, TableReference],
         requested_policy_version: int = 1,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Policy:
         if not isinstance(table, (Table, TableReference)):
             raise TypeError("table must be a Table or TableReference")
@@ -825,7 +832,7 @@ def set_iam_policy(
         policy: Policy,
         updateMask: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Policy:
         if not isinstance(table, (Table, TableReference)):
             raise TypeError("table must be a Table or TableReference")
@@ -858,7 +865,7 @@ def test_iam_permissions(
         table: Union[Table, TableReference],
         permissions: Sequence[str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Dict[str, Any]:
         if not isinstance(table, (Table, TableReference)):
             raise TypeError("table must be a Table or TableReference")
@@ -883,7 +890,7 @@ def get_model(
         self,
         model_ref: Union[ModelReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Model:
         """[Beta] Fetch the model referenced by ``model_ref``.
 
@@ -926,7 +933,7 @@ def get_routine(
         self,
         routine_ref: Union[Routine, RoutineReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Routine:
         """[Beta] Get the routine referenced by ``routine_ref``.
 
@@ -970,7 +977,7 @@ def get_table(
         self,
         table: Union[Table, TableReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Table:
         """Fetch the table referenced by ``table``.
 
@@ -1012,7 +1019,7 @@ def update_dataset(
         dataset: Dataset,
         fields: Sequence[str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Dataset:
         """Change some fields of a dataset.
 
@@ -1082,7 +1089,7 @@ def update_model(
         model: Model,
         fields: Sequence[str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Model:
         """[Beta] Change some fields of a model.
 
@@ -1146,7 +1153,7 @@ def update_routine(
         routine: Routine,
         fields: Sequence[str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Routine:
         """[Beta] Change some fields of a routine.
 
@@ -1220,7 +1227,7 @@ def update_table(
         table: Table,
         fields: Sequence[str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Table:
         """Change some fields of a table.
 
@@ -1286,7 +1293,7 @@ def list_models(
         max_results: int = None,
         page_token: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         page_size: int = None,
     ) -> page_iterator.Iterator:
         """[Beta] List models in the dataset.
@@ -1363,7 +1370,7 @@ def list_routines(
         max_results: int = None,
         page_token: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         page_size: int = None,
     ) -> page_iterator.Iterator:
         """[Beta] List routines in the dataset.
@@ -1440,7 +1447,7 @@ def list_tables(
         max_results: int = None,
         page_token: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         page_size: int = None,
     ) -> page_iterator.Iterator:
         """List tables in the dataset.
@@ -1515,7 +1522,7 @@ def delete_dataset(
         dataset: Union[Dataset, DatasetReference, str],
         delete_contents: bool = False,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         not_found_ok: bool = False,
     ) -> None:
         """Delete a dataset.
@@ -1574,7 +1581,7 @@ def delete_model(
         self,
         model: Union[Model, ModelReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         not_found_ok: bool = False,
     ) -> None:
         """[Beta] Delete a model
@@ -1624,12 +1631,12 @@ def delete_model(
 
     def delete_job_metadata(
         self,
-        job_id,
-        project=None,
-        location=None,
-        retry=DEFAULT_RETRY,
-        timeout=None,
-        not_found_ok=False,
+        job_id: Union[str, LoadJob, CopyJob, ExtractJob, QueryJob],
+        project: Optional[str] = None,
+        location: Optional[str] = None,
+        retry: retries.Retry = DEFAULT_RETRY,
+        timeout: float = DEFAULT_TIMEOUT,
+        not_found_ok: bool = False,
     ):
         """[Beta] Delete job metadata from job history.
 
@@ -1637,26 +1644,20 @@ def delete_job_metadata(
         :func:`~google.cloud.bigquery.client.Client.cancel_job` instead.
 
         Args:
-            job_id (Union[ \
-                str, \
-                google.cloud.bigquery.job.LoadJob, \
-                google.cloud.bigquery.job.CopyJob, \
-                google.cloud.bigquery.job.ExtractJob, \
-                google.cloud.bigquery.job.QueryJob \
-            ]): Job identifier.
+            job_id: Job or job identifier.
 
         Keyword Arguments:
-            project (Optional[str]):
+            project:
                 ID of the project which owns the job (defaults to the client's project).
-            location (Optional[str]):
+            location:
                 Location where the job was run. Ignored if ``job_id`` is a job
                 object.
-            retry (Optional[google.api_core.retry.Retry]):
+            retry:
                 How to retry the RPC.
-            timeout (Optional[float]):
+            timeout:
                 The number of seconds to wait for the underlying HTTP transport
                 before using ``retry``.
-            not_found_ok (Optional[bool]):
+            not_found_ok:
                 Defaults to ``False``. If ``True``, ignore "not found" errors
                 when deleting the job.
         """
@@ -1697,7 +1698,7 @@ def delete_routine(
         self,
         routine: Union[Routine, RoutineReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         not_found_ok: bool = False,
     ) -> None:
         """[Beta] Delete a routine.
@@ -1751,7 +1752,7 @@ def delete_table(
         self,
         table: Union[Table, TableReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         not_found_ok: bool = False,
     ) -> None:
         """Delete a table
@@ -1804,7 +1805,7 @@ def _get_query_results(
         project: str = None,
         timeout_ms: int = None,
         location: str = None,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> _QueryResults:
         """Get the query results object for a query job.
 
@@ -1893,7 +1894,7 @@ def create_job(
         self,
         job_config: dict,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Union[job.LoadJob, job.CopyJob, job.ExtractJob, job.QueryJob]:
         """Create a new job.
         Args:
@@ -1990,7 +1991,7 @@ def get_job(
         project: str = None,
         location: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Union[job.LoadJob, job.CopyJob, job.ExtractJob, job.QueryJob]:
         """Fetch a job for the project associated with this client.
 
@@ -2064,7 +2065,7 @@ def cancel_job(
         project: str = None,
         location: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Union[job.LoadJob, job.CopyJob, job.ExtractJob, job.QueryJob]:
         """Attempt to cancel a job from a job ID.
 
@@ -2141,7 +2142,7 @@ def list_jobs(
         all_users: bool = None,
         state_filter: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         min_creation_time: datetime.datetime = None,
         max_creation_time: datetime.datetime = None,
         page_size: int = None,
@@ -2256,7 +2257,7 @@ def load_table_from_uri(
         project: str = None,
         job_config: LoadJobConfig = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> job.LoadJob:
         """Starts a job for loading data into a table from CloudStorage.
 
@@ -2340,7 +2341,7 @@ def load_table_from_file(
         location: str = None,
         project: str = None,
         job_config: LoadJobConfig = None,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> job.LoadJob:
         """Upload the contents of this table from a file-like object.
 
@@ -2443,7 +2444,7 @@ def load_table_from_dataframe(
         project: str = None,
         job_config: LoadJobConfig = None,
         parquet_compression: str = "snappy",
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> job.LoadJob:
         """Upload the contents of a table from a pandas DataFrame.
 
@@ -2678,7 +2679,7 @@ def load_table_from_json(
         location: str = None,
         project: str = None,
         job_config: LoadJobConfig = None,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> job.LoadJob:
         """Upload the contents of a table from a JSON string or dict.
 
@@ -2961,7 +2962,7 @@ def copy_table(
         project: str = None,
         job_config: CopyJobConfig = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> job.CopyJob:
         """Copy one or more tables to another table.
 
@@ -3064,7 +3065,7 @@ def extract_table(
         project: str = None,
         job_config: ExtractJobConfig = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         source_type: str = "Table",
     ) -> job.ExtractJob:
         """Start a job to extract a table into Cloud Storage files.
@@ -3162,7 +3163,7 @@ def query(
         location: str = None,
         project: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
         job_retry: retries.Retry = DEFAULT_JOB_RETRY,
     ) -> job.QueryJob:
         """Run a SQL query.
@@ -3444,7 +3445,7 @@ def insert_rows_json(
         ignore_unknown_values: bool = None,
         template_suffix: str = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Sequence[dict]:
         """Insert rows into a table without applying local type conversions.
 
@@ -3579,7 +3580,7 @@ def list_partitions(
         self,
         table: Union[Table, TableReference, str],
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> Sequence[str]:
         """List the partitions in a table.
 
@@ -3629,7 +3630,7 @@ def list_rows(
         start_index: int = None,
         page_size: int = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> RowIterator:
         """List the rows of the table.
 
@@ -3741,7 +3742,7 @@ def _list_rows_from_query_results(
         start_index: int = None,
         page_size: int = None,
         retry: retries.Retry = DEFAULT_RETRY,
-        timeout: float = None,
+        timeout: float = DEFAULT_TIMEOUT,
     ) -> RowIterator:
         """List the rows of a completed query.
         See
diff --git a/google/cloud/bigquery/retry.py b/google/cloud/bigquery/retry.py
--- a/google/cloud/bigquery/retry.py
+++ b/google/cloud/bigquery/retry.py
@@ -29,6 +29,7 @@
     exceptions.BadGateway,
     requests.exceptions.ChunkedEncodingError,
     requests.exceptions.ConnectionError,
+    requests.exceptions.Timeout,
     auth_exceptions.TransportError,
 )
 
@@ -59,6 +60,13 @@ def _should_retry(exc):
 pass ``retry=bigquery.DEFAULT_RETRY.with_deadline(30)``.
 """
 
+DEFAULT_TIMEOUT = 5.0 * 60.0
+"""The default API timeout.
+
+This is the time to wait per request. To adjust the total wait time, set a
+deadline on the retry object.
+"""
+
 job_retry_reasons = "rateLimitExceeded", "backendError"
 
 
diff --git a/noxfile.py b/noxfile.py
--- a/noxfile.py
+++ b/noxfile.py
@@ -160,10 +160,6 @@ def snippets(session):
     if os.environ.get("RUN_SNIPPETS_TESTS", "true") == "false":
         session.skip("RUN_SNIPPETS_TESTS is set to false, skipping")
 
-    # Sanity check: Only run snippets tests if the environment variable is set.
-    if not os.environ.get("GOOGLE_APPLICATION_CREDENTIALS", ""):
-        session.skip("Credentials must be set via environment variable.")
-
     constraints_path = str(
         CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt"
     )


Test patch:
diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py
--- a/tests/unit/test_client.py
+++ b/tests/unit/test_client.py
@@ -56,6 +56,7 @@
 import google.cloud._helpers
 from google.cloud import bigquery_v2
 from google.cloud.bigquery.dataset import DatasetReference
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 
 try:
     from google.cloud import bigquery_storage
@@ -367,7 +368,7 @@ def test__get_query_results_miss_w_client_location(self):
             method="GET",
             path="/projects/PROJECT/queries/nothere",
             query_params={"maxResults": 0, "location": self.LOCATION},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test__get_query_results_hit(self):
@@ -428,7 +429,9 @@ def test_get_service_account_email_w_alternate_project(self):
             service_account_email = client.get_service_account_email(project=project)
 
         final_attributes.assert_called_once_with({"path": path}, client, None)
-        conn.api_request.assert_called_once_with(method="GET", path=path, timeout=None)
+        conn.api_request.assert_called_once_with(
+            method="GET", path=path, timeout=DEFAULT_TIMEOUT
+        )
         self.assertEqual(service_account_email, email)
 
     def test_get_service_account_email_w_custom_retry(self):
@@ -771,7 +774,7 @@ def test_create_routine_w_conflict(self):
             }
         }
         conn.api_request.assert_called_once_with(
-            method="POST", path=path, data=resource, timeout=None,
+            method="POST", path=path, data=resource, timeout=DEFAULT_TIMEOUT,
         )
 
     @unittest.skipIf(opentelemetry is None, "Requires `opentelemetry`")
@@ -807,7 +810,7 @@ def test_span_status_is_set(self):
             }
         }
         conn.api_request.assert_called_once_with(
-            method="POST", path=path, data=resource, timeout=None,
+            method="POST", path=path, data=resource, timeout=DEFAULT_TIMEOUT,
         )
 
     def test_create_routine_w_conflict_exists_ok(self):
@@ -843,11 +846,13 @@ def test_create_routine_w_conflict_exists_ok(self):
         self.assertEqual(actual_routine.routine_id, "minimal_routine")
         conn.api_request.assert_has_calls(
             [
-                mock.call(method="POST", path=path, data=resource, timeout=None,),
+                mock.call(
+                    method="POST", path=path, data=resource, timeout=DEFAULT_TIMEOUT,
+                ),
                 mock.call(
                     method="GET",
                     path="/projects/test-routine-project/datasets/test_routines/routines/minimal_routine",
-                    timeout=None,
+                    timeout=DEFAULT_TIMEOUT,
                 ),
             ]
         )
@@ -923,7 +928,7 @@ def test_create_table_w_custom_property(self):
                 "newAlphaProperty": "unreleased property",
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got._properties["newAlphaProperty"], "unreleased property")
         self.assertEqual(got.table_id, self.TABLE_ID)
@@ -964,7 +969,7 @@ def test_create_table_w_encryption_configuration(self):
                 "labels": {},
                 "encryptionConfiguration": {"kmsKeyName": self.KMS_KEY_NAME},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got.table_id, self.TABLE_ID)
 
@@ -1000,7 +1005,7 @@ def test_create_table_w_day_partition_and_expire(self):
                 "timePartitioning": {"type": "DAY", "expirationMs": "100"},
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(table.time_partitioning.type_, "DAY")
         self.assertEqual(table.time_partitioning.expiration_ms, 100)
@@ -1081,7 +1086,7 @@ def test_create_table_w_schema_and_query(self):
                 "view": {"query": query, "useLegacySql": False},
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got.table_id, self.TABLE_ID)
         self.assertEqual(got.project, self.PROJECT)
@@ -1136,7 +1141,7 @@ def test_create_table_w_external(self):
                 },
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got.table_id, self.TABLE_ID)
         self.assertEqual(got.project, self.PROJECT)
@@ -1175,7 +1180,7 @@ def test_create_table_w_reference(self):
                 },
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got.table_id, self.TABLE_ID)
 
@@ -1209,7 +1214,7 @@ def test_create_table_w_fully_qualified_string(self):
                 },
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got.table_id, self.TABLE_ID)
 
@@ -1241,7 +1246,7 @@ def test_create_table_w_string(self):
                 },
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(got.table_id, self.TABLE_ID)
 
@@ -1276,7 +1281,7 @@ def test_create_table_alreadyexists_w_exists_ok_false(self):
                 },
                 "labels": {},
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_create_table_alreadyexists_w_exists_ok_true(self):
@@ -1319,9 +1324,9 @@ def test_create_table_alreadyexists_w_exists_ok_true(self):
                         },
                         "labels": {},
                     },
-                    timeout=None,
+                    timeout=DEFAULT_TIMEOUT,
                 ),
-                mock.call(method="GET", path=get_path, timeout=None),
+                mock.call(method="GET", path=get_path, timeout=DEFAULT_TIMEOUT),
             ]
         )
 
@@ -1394,7 +1399,7 @@ def test_get_model_w_string(self):
         final_attributes.assert_called_once_with({"path": "/%s" % path}, client, None)
 
         conn.api_request.assert_called_once_with(
-            method="GET", path="/%s" % path, timeout=None
+            method="GET", path="/%s" % path, timeout=DEFAULT_TIMEOUT
         )
         self.assertEqual(got.model_id, self.MODEL_ID)
 
@@ -1503,7 +1508,7 @@ def test_get_table_sets_user_agent(self):
                 "User-Agent": expected_user_agent,
             },
             data=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertIn("my-application/1.2.3", expected_user_agent)
 
@@ -1846,7 +1851,7 @@ def test_update_dataset_w_custom_property(self):
             data={"newAlphaProperty": "unreleased property"},
             path=path,
             headers=None,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         self.assertEqual(dataset.dataset_id, self.DS_ID)
@@ -2136,7 +2141,7 @@ def test_update_table_w_custom_property(self):
             path="/%s" % path,
             data={"newAlphaProperty": "unreleased property"},
             headers=None,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(
             updated_table._properties["newAlphaProperty"], "unreleased property"
@@ -2171,7 +2176,7 @@ def test_update_table_only_use_legacy_sql(self):
             path="/%s" % path,
             data={"view": {"useLegacySql": True}},
             headers=None,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertEqual(updated_table.view_use_legacy_sql, table.view_use_legacy_sql)
 
@@ -2269,7 +2274,7 @@ def test_update_table_w_query(self):
                 "schema": schema_resource,
             },
             headers=None,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_update_table_w_schema_None(self):
@@ -2398,7 +2403,7 @@ def test_delete_job_metadata_not_found(self):
             method="DELETE",
             path="/projects/client-proj/jobs/my-job/delete",
             query_params={"location": "client-loc"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_delete_job_metadata_with_id(self):
@@ -2412,7 +2417,7 @@ def test_delete_job_metadata_with_id(self):
             method="DELETE",
             path="/projects/param-proj/jobs/my-job/delete",
             query_params={"location": "param-loc"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_delete_job_metadata_with_resource(self):
@@ -2437,7 +2442,7 @@ def test_delete_job_metadata_with_resource(self):
             method="DELETE",
             path="/projects/job-based-proj/jobs/query_job/delete",
             query_params={"location": "us-east1"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_delete_model(self):
@@ -2492,7 +2497,9 @@ def test_delete_model_w_not_found_ok_false(self):
         with self.assertRaises(google.api_core.exceptions.NotFound):
             client.delete_model("{}.{}".format(self.DS_ID, self.MODEL_ID))
 
-        conn.api_request.assert_called_with(method="DELETE", path=path, timeout=None)
+        conn.api_request.assert_called_with(
+            method="DELETE", path=path, timeout=DEFAULT_TIMEOUT
+        )
 
     def test_delete_model_w_not_found_ok_true(self):
         path = "/projects/{}/datasets/{}/models/{}".format(
@@ -2513,7 +2520,9 @@ def test_delete_model_w_not_found_ok_true(self):
 
         final_attributes.assert_called_once_with({"path": path}, client, None)
 
-        conn.api_request.assert_called_with(method="DELETE", path=path, timeout=None)
+        conn.api_request.assert_called_with(
+            method="DELETE", path=path, timeout=DEFAULT_TIMEOUT
+        )
 
     def test_delete_routine(self):
         from google.cloud.bigquery.routine import Routine
@@ -2567,7 +2576,7 @@ def test_delete_routine_w_not_found_ok_false(self):
         final_attributes.assert_called_once_with({"path": path}, client, None)
 
         conn.api_request.assert_called_with(
-            method="DELETE", path=path, timeout=None,
+            method="DELETE", path=path, timeout=DEFAULT_TIMEOUT,
         )
 
     def test_delete_routine_w_not_found_ok_true(self):
@@ -2589,7 +2598,7 @@ def test_delete_routine_w_not_found_ok_true(self):
         final_attributes.assert_called_once_with({"path": path}, client, None)
 
         conn.api_request.assert_called_with(
-            method="DELETE", path=path, timeout=None,
+            method="DELETE", path=path, timeout=DEFAULT_TIMEOUT,
         )
 
     def test_delete_table(self):
@@ -2653,7 +2662,9 @@ def test_delete_table_w_not_found_ok_false(self):
 
         final_attributes.assert_called_once_with({"path": path}, client, None)
 
-        conn.api_request.assert_called_with(method="DELETE", path=path, timeout=None)
+        conn.api_request.assert_called_with(
+            method="DELETE", path=path, timeout=DEFAULT_TIMEOUT
+        )
 
     def test_delete_table_w_not_found_ok_true(self):
         path = "/projects/{}/datasets/{}/tables/{}".format(
@@ -2675,7 +2686,9 @@ def test_delete_table_w_not_found_ok_true(self):
 
         final_attributes.assert_called_once_with({"path": path}, client, None)
 
-        conn.api_request.assert_called_with(method="DELETE", path=path, timeout=None)
+        conn.api_request.assert_called_with(
+            method="DELETE", path=path, timeout=DEFAULT_TIMEOUT
+        )
 
     def _create_job_helper(self, job_config):
         from google.cloud.bigquery import _helpers
@@ -2697,7 +2710,7 @@ def _create_job_helper(self, job_config):
             method="POST",
             path="/projects/%s/jobs" % self.PROJECT,
             data=RESOURCE,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_create_job_load_config(self):
@@ -2846,7 +2859,7 @@ def test_create_job_query_config_w_rateLimitExceeded_error(self):
                 method="POST",
                 path="/projects/PROJECT/jobs",
                 data=data_without_destination,
-                timeout=None,
+                timeout=DEFAULT_TIMEOUT,
             ),
         )
 
@@ -2886,7 +2899,7 @@ def test_get_job_miss_w_explict_project(self):
             method="GET",
             path="/projects/OTHER_PROJECT/jobs/NONESUCH",
             query_params={"projection": "full"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_get_job_miss_w_client_location(self):
@@ -2904,7 +2917,7 @@ def test_get_job_miss_w_client_location(self):
             method="GET",
             path="/projects/client-proj/jobs/NONESUCH",
             query_params={"projection": "full", "location": "client-loc"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_get_job_hit_w_timeout(self):
@@ -2973,7 +2986,7 @@ def test_cancel_job_miss_w_explict_project(self):
             method="POST",
             path="/projects/OTHER_PROJECT/jobs/NONESUCH/cancel",
             query_params={"projection": "full", "location": self.LOCATION},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_cancel_job_miss_w_client_location(self):
@@ -2992,7 +3005,7 @@ def test_cancel_job_miss_w_client_location(self):
             method="POST",
             path="/projects/OTHER_PROJECT/jobs/NONESUCH/cancel",
             query_params={"projection": "full", "location": self.LOCATION},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_cancel_job_hit(self):
@@ -3028,7 +3041,7 @@ def test_cancel_job_hit(self):
             method="POST",
             path="/projects/job-based-proj/jobs/query_job/cancel",
             query_params={"projection": "full", "location": "asia-northeast1"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_cancel_job_w_timeout(self):
@@ -3154,7 +3167,7 @@ def test_load_table_from_uri_w_explicit_project(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_load_table_from_uri_w_client_location(self):
@@ -3198,7 +3211,7 @@ def test_load_table_from_uri_w_client_location(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_load_table_from_uri_w_invalid_job_config(self):
@@ -3486,7 +3499,7 @@ def test_copy_table_w_multiple_sources(self):
             method="POST",
             path="/projects/%s/jobs" % self.PROJECT,
             data=expected_resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertIsInstance(job, CopyJob)
         self.assertIs(job._client, client)
@@ -3548,7 +3561,7 @@ def test_copy_table_w_explicit_project(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_copy_table_w_client_location(self):
@@ -3598,7 +3611,7 @@ def test_copy_table_w_client_location(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_copy_table_w_source_strings(self):
@@ -3691,7 +3704,7 @@ def test_copy_table_w_valid_job_config(self):
             method="POST",
             path="/projects/%s/jobs" % self.PROJECT,
             data=RESOURCE,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         self.assertIsInstance(job._configuration, CopyJobConfig)
 
@@ -3797,7 +3810,7 @@ def test_extract_table_w_explicit_project(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_extract_table_w_client_location(self):
@@ -3841,7 +3854,7 @@ def test_extract_table_w_client_location(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_extract_table_generated_job_id(self):
@@ -3884,7 +3897,7 @@ def test_extract_table_generated_job_id(self):
         self.assertEqual(req["method"], "POST")
         self.assertEqual(req["path"], "/projects/PROJECT/jobs")
         self.assertIsInstance(req["data"]["jobReference"]["jobId"], str)
-        self.assertIsNone(req["timeout"])
+        self.assertEqual(req["timeout"], DEFAULT_TIMEOUT)
 
         # Check the job resource.
         self.assertIsInstance(job, ExtractJob)
@@ -3929,7 +3942,7 @@ def test_extract_table_w_destination_uris(self):
         _, req = conn.api_request.call_args
         self.assertEqual(req["method"], "POST")
         self.assertEqual(req["path"], "/projects/PROJECT/jobs")
-        self.assertIsNone(req["timeout"])
+        self.assertEqual(req["timeout"], DEFAULT_TIMEOUT)
 
         # Check the job resource.
         self.assertIsInstance(job, ExtractJob)
@@ -4099,7 +4112,7 @@ def test_query_defaults(self):
         _, req = conn.api_request.call_args
         self.assertEqual(req["method"], "POST")
         self.assertEqual(req["path"], "/projects/PROJECT/jobs")
-        self.assertIsNone(req["timeout"])
+        self.assertEqual(req["timeout"], DEFAULT_TIMEOUT)
         sent = req["data"]
         self.assertIsInstance(sent["jobReference"]["jobId"], str)
         sent_config = sent["configuration"]["query"]
@@ -4152,7 +4165,7 @@ def test_query_w_explicit_project(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_query_w_explicit_job_config(self):
@@ -4208,7 +4221,10 @@ def test_query_w_explicit_job_config(self):
 
         # Check that query actually starts the job.
         conn.api_request.assert_called_once_with(
-            method="POST", path="/projects/PROJECT/jobs", data=resource, timeout=None
+            method="POST",
+            path="/projects/PROJECT/jobs",
+            data=resource,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         # the original config object should not have been modified
@@ -4252,7 +4268,10 @@ def test_query_preserving_explicit_job_config(self):
 
         # Check that query actually starts the job.
         conn.api_request.assert_called_once_with(
-            method="POST", path="/projects/PROJECT/jobs", data=resource, timeout=None
+            method="POST",
+            path="/projects/PROJECT/jobs",
+            data=resource,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         # the original config object should not have been modified
@@ -4304,7 +4323,10 @@ def test_query_preserving_explicit_default_job_config(self):
 
         # Check that query actually starts the job.
         conn.api_request.assert_called_once_with(
-            method="POST", path="/projects/PROJECT/jobs", data=resource, timeout=None
+            method="POST",
+            path="/projects/PROJECT/jobs",
+            data=resource,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         # the original default config object should not have been modified
@@ -4389,7 +4411,10 @@ def test_query_w_explicit_job_config_override(self):
 
         # Check that query actually starts the job.
         conn.api_request.assert_called_once_with(
-            method="POST", path="/projects/PROJECT/jobs", data=resource, timeout=None
+            method="POST",
+            path="/projects/PROJECT/jobs",
+            data=resource,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_query_w_client_default_config_no_incoming(self):
@@ -4430,7 +4455,10 @@ def test_query_w_client_default_config_no_incoming(self):
 
         # Check that query actually starts the job.
         conn.api_request.assert_called_once_with(
-            method="POST", path="/projects/PROJECT/jobs", data=resource, timeout=None
+            method="POST",
+            path="/projects/PROJECT/jobs",
+            data=resource,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_query_w_invalid_default_job_config(self):
@@ -4475,7 +4503,7 @@ def test_query_w_client_location(self):
             method="POST",
             path="/projects/other-project/jobs",
             data=resource,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_query_detect_location(self):
@@ -4546,7 +4574,7 @@ def test_query_w_udf_resources(self):
         _, req = conn.api_request.call_args
         self.assertEqual(req["method"], "POST")
         self.assertEqual(req["path"], "/projects/PROJECT/jobs")
-        self.assertIsNone(req["timeout"])
+        self.assertEqual(req["timeout"], DEFAULT_TIMEOUT)
         sent = req["data"]
         self.assertIsInstance(sent["jobReference"]["jobId"], str)
         sent_config = sent["configuration"]["query"]
@@ -4602,7 +4630,7 @@ def test_query_w_query_parameters(self):
         _, req = conn.api_request.call_args
         self.assertEqual(req["method"], "POST")
         self.assertEqual(req["path"], "/projects/PROJECT/jobs")
-        self.assertIsNone(req["timeout"])
+        self.assertEqual(req["timeout"], DEFAULT_TIMEOUT)
         sent = req["data"]
         self.assertEqual(sent["jobReference"]["jobId"], JOB)
         sent_config = sent["configuration"]["query"]
@@ -4794,7 +4822,7 @@ def _row_data(row):
         self.assertEqual(req["method"], "POST")
         self.assertEqual(req["path"], "/%s" % PATH)
         self.assertEqual(req["data"], SENT)
-        self.assertIsNone(req["timeout"])
+        self.assertEqual(req["timeout"], DEFAULT_TIMEOUT)
 
     def test_insert_rows_w_list_of_dictionaries(self):
         import datetime
@@ -4862,7 +4890,7 @@ def _row_data(row):
 
         self.assertEqual(len(errors), 0)
         conn.api_request.assert_called_once_with(
-            method="POST", path="/%s" % PATH, data=SENT, timeout=None
+            method="POST", path="/%s" % PATH, data=SENT, timeout=DEFAULT_TIMEOUT
         )
 
     def test_insert_rows_w_list_of_Rows(self):
@@ -4907,7 +4935,7 @@ def _row_data(row):
 
         self.assertEqual(len(errors), 0)
         conn.api_request.assert_called_once_with(
-            method="POST", path="/%s" % PATH, data=SENT, timeout=None
+            method="POST", path="/%s" % PATH, data=SENT, timeout=DEFAULT_TIMEOUT
         )
 
     def test_insert_rows_w_skip_invalid_and_ignore_unknown(self):
@@ -4984,7 +5012,7 @@ def _row_data(row):
             errors[0]["errors"][0], RESPONSE["insertErrors"][0]["errors"][0]
         )
         conn.api_request.assert_called_once_with(
-            method="POST", path="/%s" % PATH, data=SENT, timeout=None
+            method="POST", path="/%s" % PATH, data=SENT, timeout=DEFAULT_TIMEOUT
         )
 
     def test_insert_rows_w_repeated_fields(self):
@@ -5085,7 +5113,7 @@ def test_insert_rows_w_repeated_fields(self):
 
         self.assertEqual(len(errors), 0)
         conn.api_request.assert_called_once_with(
-            method="POST", path="/%s" % PATH, data=SENT, timeout=None,
+            method="POST", path="/%s" % PATH, data=SENT, timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_w_record_schema(self):
@@ -5151,7 +5179,7 @@ def test_insert_rows_w_record_schema(self):
 
         self.assertEqual(len(errors), 0)
         conn.api_request.assert_called_once_with(
-            method="POST", path="/%s" % PATH, data=SENT, timeout=None
+            method="POST", path="/%s" % PATH, data=SENT, timeout=DEFAULT_TIMEOUT
         )
 
     def test_insert_rows_w_explicit_none_insert_ids(self):
@@ -5185,7 +5213,7 @@ def _row_data(row):
 
         self.assertEqual(len(errors), 0)
         conn.api_request.assert_called_once_with(
-            method="POST", path="/{}".format(PATH), data=SENT, timeout=None,
+            method="POST", path="/{}".format(PATH), data=SENT, timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_errors(self):
@@ -5269,7 +5297,7 @@ def test_insert_rows_w_numeric(self):
                     project, ds_id, table_id
                 ),
                 data=sent,
-                timeout=None,
+                timeout=DEFAULT_TIMEOUT,
             )
 
     @unittest.skipIf(pandas is None, "Requires `pandas`")
@@ -5461,7 +5489,10 @@ def test_insert_rows_from_dataframe_many_columns(self):
             ]
         }
         expected_call = mock.call(
-            method="POST", path=API_PATH, data=EXPECTED_SENT_DATA, timeout=None
+            method="POST",
+            path=API_PATH,
+            data=EXPECTED_SENT_DATA,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         actual_calls = conn.api_request.call_args_list
@@ -5514,7 +5545,10 @@ def test_insert_rows_from_dataframe_w_explicit_none_insert_ids(self):
         actual_calls = conn.api_request.call_args_list
         assert len(actual_calls) == 1
         assert actual_calls[0] == mock.call(
-            method="POST", path=API_PATH, data=EXPECTED_SENT_DATA, timeout=None
+            method="POST",
+            path=API_PATH,
+            data=EXPECTED_SENT_DATA,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_json_default_behavior(self):
@@ -5594,7 +5628,7 @@ def test_insert_rows_json_w_explicitly_requested_autogenerated_insert_ids(self):
             method="POST",
             path="/projects/proj/datasets/dset/tables/tbl/insertAll",
             data=expected_row_data,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_json_w_explicitly_disabled_insert_ids(self):
@@ -5624,7 +5658,7 @@ def test_insert_rows_json_w_explicitly_disabled_insert_ids(self):
             method="POST",
             path="/projects/proj/datasets/dset/tables/tbl/insertAll",
             data=expected_row_data,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_json_with_iterator_row_ids(self):
@@ -5651,7 +5685,7 @@ def test_insert_rows_json_with_iterator_row_ids(self):
             method="POST",
             path="/projects/proj/datasets/dset/tables/tbl/insertAll",
             data=expected_row_data,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_json_with_non_iterable_row_ids(self):
@@ -5704,7 +5738,7 @@ def test_insert_rows_json_w_explicit_none_insert_ids(self):
             method="POST",
             path="/projects/proj/datasets/dset/tables/tbl/insertAll",
             data=expected,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_json_w_none_insert_ids_sequence(self):
@@ -5743,7 +5777,7 @@ def test_insert_rows_json_w_none_insert_ids_sequence(self):
             method="POST",
             path="/projects/proj/datasets/dset/tables/tbl/insertAll",
             data=expected_row_data,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_insert_rows_w_wrong_arg(self):
@@ -5938,7 +5972,7 @@ def test_list_rows_w_start_index_w_page_size(self):
                         "maxResults": 2,
                         "formatOptions.useInt64Timestamp": True,
                     },
-                    timeout=None,
+                    timeout=DEFAULT_TIMEOUT,
                 ),
                 mock.call(
                     method="GET",
@@ -5948,7 +5982,7 @@ def test_list_rows_w_start_index_w_page_size(self):
                         "maxResults": 2,
                         "formatOptions.useInt64Timestamp": True,
                     },
-                    timeout=None,
+                    timeout=DEFAULT_TIMEOUT,
                 ),
             ]
         )
@@ -6099,7 +6133,7 @@ def test_list_rows_repeated_fields(self):
                 "selectedFields": "color,struct",
                 "formatOptions.useInt64Timestamp": True,
             },
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_list_rows_w_record_schema(self):
@@ -6169,7 +6203,7 @@ def test_list_rows_w_record_schema(self):
             method="GET",
             path="/%s" % PATH,
             query_params={"formatOptions.useInt64Timestamp": True},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     def test_list_rows_with_missing_schema(self):
@@ -6224,7 +6258,7 @@ def test_list_rows_with_missing_schema(self):
             row_iter = client.list_rows(table)
 
             conn.api_request.assert_called_once_with(
-                method="GET", path=table_path, timeout=None
+                method="GET", path=table_path, timeout=DEFAULT_TIMEOUT
             )
             conn.api_request.reset_mock()
             self.assertEqual(row_iter.total_rows, 2, msg=repr(table))
@@ -6234,7 +6268,7 @@ def test_list_rows_with_missing_schema(self):
                 method="GET",
                 path=tabledata_path,
                 query_params={"formatOptions.useInt64Timestamp": True},
-                timeout=None,
+                timeout=DEFAULT_TIMEOUT,
             )
             self.assertEqual(row_iter.total_rows, 3, msg=repr(table))
             self.assertEqual(rows[0].name, "Phred Phlyntstone", msg=repr(table))
@@ -6407,7 +6441,7 @@ def test_load_table_from_file_resumable(self):
             file_obj,
             self.EXPECTED_CONFIGURATION,
             _DEFAULT_NUM_RETRIES,
-            None,
+            DEFAULT_TIMEOUT,
             project=self.EXPECTED_CONFIGURATION["jobReference"]["projectId"],
         )
 
@@ -6440,7 +6474,7 @@ def test_load_table_from_file_w_explicit_project(self):
             file_obj,
             expected_resource,
             _DEFAULT_NUM_RETRIES,
-            None,
+            DEFAULT_TIMEOUT,
             project="other-project",
         )
 
@@ -6474,7 +6508,7 @@ def test_load_table_from_file_w_client_location(self):
             file_obj,
             expected_resource,
             _DEFAULT_NUM_RETRIES,
-            None,
+            DEFAULT_TIMEOUT,
             project="other-project",
         )
 
@@ -6536,7 +6570,7 @@ def test_load_table_from_file_resumable_metadata(self):
             file_obj,
             expected_config,
             _DEFAULT_NUM_RETRIES,
-            None,
+            DEFAULT_TIMEOUT,
             project=self.EXPECTED_CONFIGURATION["jobReference"]["projectId"],
         )
 
@@ -6565,7 +6599,7 @@ def test_load_table_from_file_multipart(self):
             self.EXPECTED_CONFIGURATION,
             file_obj_size,
             _DEFAULT_NUM_RETRIES,
-            None,
+            DEFAULT_TIMEOUT,
             project=self.PROJECT,
         )
 
@@ -6590,7 +6624,7 @@ def test_load_table_from_file_with_retries(self):
             file_obj,
             self.EXPECTED_CONFIGURATION,
             num_retries,
-            None,
+            DEFAULT_TIMEOUT,
             project=self.EXPECTED_CONFIGURATION["jobReference"]["projectId"],
         )
 
@@ -6627,7 +6661,7 @@ def test_load_table_from_file_with_readable_gzip(self):
             gzip_file,
             self.EXPECTED_CONFIGURATION,
             _DEFAULT_NUM_RETRIES,
-            None,
+            DEFAULT_TIMEOUT,
             project=self.EXPECTED_CONFIGURATION["jobReference"]["projectId"],
         )
 
@@ -6750,7 +6784,7 @@ def test_load_table_from_dataframe(self):
             location=None,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_file = load_table_from_file.mock_calls[0][1][1]
@@ -6808,7 +6842,7 @@ def test_load_table_from_dataframe_w_client_location(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_file = load_table_from_file.mock_calls[0][1][1]
@@ -6862,7 +6896,7 @@ def test_load_table_from_dataframe_w_custom_job_config_wihtout_source_format(sel
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -6918,7 +6952,7 @@ def test_load_table_from_dataframe_w_custom_job_config_w_source_format(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7012,7 +7046,7 @@ def test_load_table_from_dataframe_w_automatic_schema(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7073,7 +7107,7 @@ def test_load_table_from_dataframe_w_index_and_auto_schema(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7120,7 +7154,7 @@ def test_load_table_from_dataframe_unknown_table(self):
             location=None,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
     @unittest.skipIf(
@@ -7162,7 +7196,7 @@ def test_load_table_from_dataframe_w_nullable_int64_datatype(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7210,7 +7244,7 @@ def test_load_table_from_dataframe_w_nullable_int64_datatype_automatic_schema(se
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7272,7 +7306,7 @@ def test_load_table_from_dataframe_struct_fields(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7347,7 +7381,7 @@ def test_load_table_from_dataframe_w_partial_schema(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7442,7 +7476,7 @@ def test_load_table_from_dataframe_w_partial_schema_missing_types(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         assert warned  # there should be at least one warning
@@ -7592,7 +7626,7 @@ def test_load_table_from_dataframe_w_nulls(self):
             location=self.LOCATION,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7658,7 +7692,7 @@ def test_load_table_from_dataframe_with_csv_source_format(self):
             location=None,
             project=None,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_file = load_table_from_file.mock_calls[0][1][1]
@@ -7696,7 +7730,7 @@ def test_load_table_from_json_basic_use(self):
             location=client.location,
             project=client.project,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7749,7 +7783,7 @@ def test_load_table_from_json_non_default_args(self):
             location="EU",
             project="project-x",
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_config = load_table_from_file.mock_calls[0][2]["job_config"]
@@ -7809,7 +7843,7 @@ def test_load_table_from_json_unicode_emoji_data_case(self):
             location=client.location,
             project=client.project,
             job_config=mock.ANY,
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
 
         sent_data_file = load_table_from_file.mock_calls[0][1][1]
diff --git a/tests/unit/test_create_dataset.py b/tests/unit/test_create_dataset.py
--- a/tests/unit/test_create_dataset.py
+++ b/tests/unit/test_create_dataset.py
@@ -15,6 +15,7 @@
 from google.cloud.bigquery.dataset import Dataset, DatasetReference
 from .helpers import make_connection, dataset_polymorphic, make_client
 import google.cloud.bigquery.dataset
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 import mock
 import pytest
 
@@ -111,7 +112,7 @@ def test_create_dataset_w_attrs(client, PROJECT, DS_ID):
             "access": [{"role": "OWNER", "userByEmail": USER_EMAIL}, {"view": VIEW}],
             "labels": LABELS,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -143,7 +144,7 @@ def test_create_dataset_w_custom_property(client, PROJECT, DS_ID):
             "newAlphaProperty": "unreleased property",
             "labels": {},
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -176,7 +177,7 @@ def test_create_dataset_w_client_location_wo_dataset_location(PROJECT, DS_ID, LO
             "labels": {},
             "location": LOCATION,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -211,7 +212,7 @@ def test_create_dataset_w_client_location_w_dataset_location(PROJECT, DS_ID, LOC
             "labels": {},
             "location": OTHER_LOCATION,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -241,7 +242,7 @@ def test_create_dataset_w_reference(PROJECT, DS_ID, LOCATION):
             "labels": {},
             "location": LOCATION,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -271,7 +272,7 @@ def test_create_dataset_w_fully_qualified_string(PROJECT, DS_ID, LOCATION):
             "labels": {},
             "location": LOCATION,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -306,7 +307,7 @@ def test_create_dataset_w_string(PROJECT, DS_ID, LOCATION):
             "labels": {},
             "location": LOCATION,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -356,8 +357,8 @@ def test_create_dataset_alreadyexists_w_exists_ok_true(PROJECT, DS_ID, LOCATION)
                     "labels": {},
                     "location": LOCATION,
                 },
-                timeout=None,
+                timeout=DEFAULT_TIMEOUT,
             ),
-            mock.call(method="GET", path=get_path, timeout=None),
+            mock.call(method="GET", path=get_path, timeout=DEFAULT_TIMEOUT),
         ]
     )
diff --git a/tests/unit/test_delete_dataset.py b/tests/unit/test_delete_dataset.py
--- a/tests/unit/test_delete_dataset.py
+++ b/tests/unit/test_delete_dataset.py
@@ -14,6 +14,7 @@
 
 from .helpers import make_connection, make_client, dataset_polymorphic
 import google.api_core.exceptions
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 import pytest
 
 
@@ -40,7 +41,7 @@ def test_delete_dataset_delete_contents(
         method="DELETE",
         path="/%s" % PATH,
         query_params={"deleteContents": "true"},
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -61,7 +62,7 @@ def test_delete_dataset_w_not_found_ok_false(PROJECT, DS_ID):
         client.delete_dataset(DS_ID)
 
     conn.api_request.assert_called_with(
-        method="DELETE", path=path, query_params={}, timeout=None
+        method="DELETE", path=path, query_params={}, timeout=DEFAULT_TIMEOUT
     )
 
 
@@ -74,5 +75,5 @@ def test_delete_dataset_w_not_found_ok_true(PROJECT, DS_ID):
     )
     client.delete_dataset(DS_ID, not_found_ok=True)
     conn.api_request.assert_called_with(
-        method="DELETE", path=path, query_params={}, timeout=None
+        method="DELETE", path=path, query_params={}, timeout=DEFAULT_TIMEOUT
     )
diff --git a/tests/unit/test_list_datasets.py b/tests/unit/test_list_datasets.py
--- a/tests/unit/test_list_datasets.py
+++ b/tests/unit/test_list_datasets.py
@@ -1,11 +1,11 @@
 # Copyright 2021 Google LLC
-
+#
 # 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
-
+#
 #     https://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.
@@ -15,6 +15,7 @@
 import mock
 import pytest
 
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 from .helpers import make_connection
 
 
@@ -65,7 +66,7 @@ def test_list_datasets_defaults(client, PROJECT, extra, query):
     assert token == TOKEN
 
     conn.api_request.assert_called_once_with(
-        method="GET", path="/%s" % PATH, query_params=query, timeout=None
+        method="GET", path="/%s" % PATH, query_params=query, timeout=DEFAULT_TIMEOUT
     )
 
 
@@ -120,5 +121,5 @@ def test_list_datasets_explicit_response_missing_datasets_key(client, PROJECT):
             "maxResults": 3,
             "pageToken": TOKEN,
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
diff --git a/tests/unit/test_list_jobs.py b/tests/unit/test_list_jobs.py
--- a/tests/unit/test_list_jobs.py
+++ b/tests/unit/test_list_jobs.py
@@ -1,11 +1,11 @@
 # Copyright 2021 Google LLC
-
+#
 # 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
-
+#
 #     https://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.
@@ -17,6 +17,7 @@
 import mock
 import pytest
 
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 from .helpers import make_connection
 
 
@@ -136,7 +137,7 @@ def test_list_jobs_defaults(client, PROJECT, DS_ID, extra, query):
         method="GET",
         path="/%s" % PATH,
         query_params=dict({"projection": "full"}, **query),
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -185,7 +186,7 @@ def test_list_jobs_load_job_wo_sourceUris(client, PROJECT, DS_ID):
         method="GET",
         path="/%s" % PATH,
         query_params={"projection": "full"},
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -220,7 +221,7 @@ def test_list_jobs_explicit_missing(client, PROJECT):
             "allUsers": True,
             "stateFilter": "done",
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -233,7 +234,7 @@ def test_list_jobs_w_project(client, PROJECT):
         method="GET",
         path="/projects/other-project/jobs",
         query_params={"projection": "full"},
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -269,7 +270,7 @@ def test_list_jobs_w_time_filter(client, PROJECT):
             "minCreationTime": "1",
             "maxCreationTime": str(end_time_millis),
         },
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
@@ -286,6 +287,6 @@ def test_list_jobs_w_parent_job_filter(client, PROJECT):
             method="GET",
             path="/projects/%s/jobs" % PROJECT,
             query_params={"projection": "full", "parentJobId": "parent-job-123"},
-            timeout=None,
+            timeout=DEFAULT_TIMEOUT,
         )
         conn.api_request.reset_mock()
diff --git a/tests/unit/test_list_models.py b/tests/unit/test_list_models.py
--- a/tests/unit/test_list_models.py
+++ b/tests/unit/test_list_models.py
@@ -1,20 +1,22 @@
 # Copyright 2021 Google LLC
-
+#
 # 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
-
+#
 #     https://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.
 
-from .helpers import make_connection, dataset_polymorphic
 import pytest
 
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
+from .helpers import make_connection, dataset_polymorphic
+
 
 def test_list_models_empty_w_timeout(client, PROJECT, DS_ID):
     path = "/projects/{}/datasets/{}/models".format(PROJECT, DS_ID)
@@ -82,7 +84,7 @@ def test_list_models_defaults(
     assert token == TOKEN
 
     conn.api_request.assert_called_once_with(
-        method="GET", path="/%s" % PATH, query_params=query, timeout=None
+        method="GET", path="/%s" % PATH, query_params=query, timeout=DEFAULT_TIMEOUT
     )
 
 
diff --git a/tests/unit/test_list_projects.py b/tests/unit/test_list_projects.py
--- a/tests/unit/test_list_projects.py
+++ b/tests/unit/test_list_projects.py
@@ -1,11 +1,11 @@
 # Copyright 2021 Google LLC
-
+#
 # 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
-
+#
 #     https://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.
@@ -15,6 +15,7 @@
 import mock
 import pytest
 
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 from .helpers import make_connection
 
 
@@ -66,7 +67,7 @@ def test_list_projects_defaults(client, PROJECT, extra, query):
     assert token == TOKEN
 
     conn.api_request.assert_called_once_with(
-        method="GET", path="/projects", query_params=query, timeout=None
+        method="GET", path="/projects", query_params=query, timeout=DEFAULT_TIMEOUT
     )
 
 
@@ -115,5 +116,5 @@ def test_list_projects_explicit_response_missing_projects_key(client):
         method="GET",
         path="/projects",
         query_params={"maxResults": 3, "pageToken": TOKEN},
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
diff --git a/tests/unit/test_list_routines.py b/tests/unit/test_list_routines.py
--- a/tests/unit/test_list_routines.py
+++ b/tests/unit/test_list_routines.py
@@ -1,20 +1,22 @@
 # Copyright 2021 Google LLC
-
+#
 # 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
-
+#
 #     https://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.
 
-from .helpers import make_connection, dataset_polymorphic
 import pytest
 
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
+from .helpers import make_connection, dataset_polymorphic
+
 
 def test_list_routines_empty_w_timeout(client):
     conn = client._connection = make_connection({})
@@ -85,7 +87,7 @@ def test_list_routines_defaults(
     assert actual_token == token
 
     conn.api_request.assert_called_once_with(
-        method="GET", path=path, query_params=query, timeout=None
+        method="GET", path=path, query_params=query, timeout=DEFAULT_TIMEOUT
     )
 
 
diff --git a/tests/unit/test_list_tables.py b/tests/unit/test_list_tables.py
--- a/tests/unit/test_list_tables.py
+++ b/tests/unit/test_list_tables.py
@@ -1,21 +1,23 @@
 # Copyright 2021 Google LLC
-
+#
 # 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
-
+#
 #     https://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.
 
-from .helpers import make_connection, dataset_polymorphic
-import google.cloud.bigquery.dataset
 import pytest
 
+import google.cloud.bigquery.dataset
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
+from .helpers import make_connection, dataset_polymorphic
+
 
 @dataset_polymorphic
 def test_list_tables_empty_w_timeout(
@@ -89,7 +91,7 @@ def test_list_tables_defaults(make_dataset, get_reference, client, PROJECT, DS_I
     assert token == TOKEN
 
     conn.api_request.assert_called_once_with(
-        method="GET", path="/%s" % PATH, query_params={}, timeout=None
+        method="GET", path="/%s" % PATH, query_params={}, timeout=DEFAULT_TIMEOUT
     )
 
 
@@ -150,7 +152,7 @@ def test_list_tables_explicit(client, PROJECT, DS_ID):
         method="GET",
         path="/%s" % PATH,
         query_params={"maxResults": 3, "pageToken": TOKEN},
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
 
 
diff --git a/tests/unit/test_magics.py b/tests/unit/test_magics.py
--- a/tests/unit/test_magics.py
+++ b/tests/unit/test_magics.py
@@ -32,6 +32,7 @@
 from google.cloud.bigquery import job
 from google.cloud.bigquery import table
 from google.cloud.bigquery.magics import magics
+from google.cloud.bigquery.retry import DEFAULT_TIMEOUT
 from tests.unit.helpers import make_connection
 from test_utils.imports import maybe_fail_import
 
@@ -185,7 +186,7 @@ def test_context_with_default_connection():
         method="POST",
         path="/projects/project-from-env/jobs",
         data=mock.ANY,
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
     query_results_call = mock.call(
         method="GET",
@@ -249,7 +250,7 @@ def test_context_with_custom_connection():
         method="POST",
         path="/projects/project-from-env/jobs",
         data=mock.ANY,
-        timeout=None,
+        timeout=DEFAULT_TIMEOUT,
     )
     query_results_call = mock.call(
         method="GET",
diff --git a/tests/unit/test_retry.py b/tests/unit/test_retry.py
--- a/tests/unit/test_retry.py
+++ b/tests/unit/test_retry.py
@@ -55,6 +55,18 @@ def test_w_unstructured_requests_chunked_encoding_error(self):
         exc = requests.exceptions.ChunkedEncodingError()
         self.assertTrue(self._call_fut(exc))
 
+    def test_w_unstructured_requests_connecttimeout(self):
+        exc = requests.exceptions.ConnectTimeout()
+        self.assertTrue(self._call_fut(exc))
+
+    def test_w_unstructured_requests_readtimeout(self):
+        exc = requests.exceptions.ReadTimeout()
+        self.assertTrue(self._call_fut(exc))
+
+    def test_w_unstructured_requests_timeout(self):
+        exc = requests.exceptions.Timeout()
+        self.assertTrue(self._call_fut(exc))
+
     def test_w_auth_transporterror(self):
         from google.auth.exceptions import TransportError