test: connection leak test test_discovery_http_is_closed is shadowed and syntactically invalid
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 75/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Quiet
- Tech stack
- python
- Domain
- testing-qa
Research direction
Start in tests/test_discovery.py by comparing the two Discovery class definitions and locating test_discovery_http_is_closed. Run the focused discovery tests with pytest, then verify the corrected test observes closure of the temporary HTTP client without shadowing or AttributeError.
Written by the indexing model from the issue text.
Description
Environment details
- OS type and version: Linux (gLinux / Debian based)
- Python version:
3.13.12(also affects all supported Python versions3.10+) - pip version:
26.0.1 google-api-python-clientversion:2.197.0(at commit6e471c075039dfef24e28d11658e03d5c949c7c3)
Steps to reproduce
- Look at
tests/test_discovery.pyonmain. Note that there are two separate definitions forclass Discovery(unittest.TestCase)(one at line 498 and one at line 1566). - In Python, defining a class twice in the same module causes the second definition to silently overwrite the first. This means the first
Discoveryclass—which contains the test casetest_discovery_http_is_closed—is completely dead code and is never executed bypytest. - Attempting to manually extract and execute this test case crashes immediately because
HttpMock.close()is a regular function, but the test tries to callassert_called_once()on it.
Code example
The shadowed class in tests/test_discovery.py contains this test definition:
class Discovery(unittest.TestCase):
def test_discovery_http_is_closed(self):
http = HttpMock(datafile("malformed.json"), {"status": "200"})
# build() is called without passing the 'http' mock client!
service = build("plus", "v1", credentials=mock.sentinel.credentials)
# Fails: HttpMock.close is a standard method, not a mock object
http.close.assert_called_once()
Historical Context
This bug was introduced in September 2020 by commit 98888dadf ("fix: add method to close httplib2 connections (#1038)").
That commit added test_discovery_http_is_closed by declaring a new class Discovery(unittest.TestCase) block near the top of the file, without realizing that a class Discovery(unittest.TestCase) block was already defined and active near the bottom of the file (which immediately shadowed the new test).
The Proposed Solution
- Delete the duplicate class definition at line 498.
- Restore
test_discovery_http_is_closedinside the activeDiscoveryclass (at line 1566). - Correct the test case to use standard
unittest.mock.patchonhttplib2.Httpto verify that the temporary HTTP client created bybuild()to fetch the discovery document is safely closed after initialization completes, preventing connection/socket leaks.
@mock.patch("httplib2.Http")
def test_discovery_http_is_closed(self, mock_http_class):
mock_http = mock_http_class.return_value
mock_http.request.return_value = (
httplib2.Response({"status": "200"}),
read_datafile("plus.json"),
)
service = build("plus", "v1", static_discovery=False)
mock_http.close.assert_called_once()
Stack trace
If you isolate the legacy test case and run it, it crashes immediately with an AttributeError:
AttributeError: 'function' object has no attribute 'assert_called_once'
- Dominant language
- Python
- Stars
- 8.9k
- Forks
- 2.6k
- Avg merge
- 2d 1h
- Merged PRs (30d)
- 16
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from googleapis/google-api-python-client
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
เมตาแมส Open
Difficulty 1/5 Under an hour Newbie friendliness 10/100
-
Difficulty 4/5 3-5 days Newbie friendliness 52/100
-
samples type: docs
Difficulty 3/5 1-2 days Newbie friendliness 52/100
All issues in googleapis/google-api-python-client
Similar issues
-
area: harness bug status: needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Human-Agent-Society/reef#625 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
Difficulty 1/5 Under an hour Newbie friendliness 80/100
learningequality/kolibri#15351 · 2 comments ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
Name consistency Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
eellak/triplestore#65 · 1 comment ·