Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

test: connection leak test test_discovery_http_is_closed is shadowed and syntactically invalid

オープン 初心者向け
#2,757 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@Capstan がすでに取り組んでいます。

2026年5月31日 から。

  • #2758 @Capstan による — オープン
  • #2801 @skippdot による — オープン
  • #2819 @cristianchiriac による — オープン
  • #2828 @reginaldalfret による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
75/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
静か
技術スタック
python
領域
testing-qa

調査の方向性

tests/test_discovery.py から始め、2つの Discovery クラス定義を比較して test_discovery_http_is_closed を特定します。pytest で対象を絞った Discovery テストを実行し、その後、修正されたテストが一時 HTTP クライアントのクローズを、shadowing や AttributeError なしに検証していることを確認します。

索引モデルが issue の本文から書いたものです。

説明

Environment details
  • OS type and version: Linux (gLinux / Debian based)
  • Python version: 3.13.12 (also affects all supported Python versions 3.10+)
  • pip version: 26.0.1
  • google-api-python-client version: 2.197.0 (at commit 6e471c075039dfef24e28d11658e03d5c949c7c3)

Steps to reproduce
  1. Look at tests/test_discovery.py on main. Note that there are two separate definitions for class Discovery(unittest.TestCase) (one at line 498 and one at line 1566).
  2. In Python, defining a class twice in the same module causes the second definition to silently overwrite the first. This means the first Discovery class—which contains the test case test_discovery_http_is_closed—is completely dead code and is never executed by pytest.
  3. Attempting to manually extract and execute this test case crashes immediately because HttpMock.close() is a regular function, but the test tries to call assert_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
  1. Delete the duplicate class definition at line 498.
  2. Restore test_discovery_http_is_closed inside the active Discovery class (at line 1566).
  3. Correct the test case to use standard unittest.mock.patch on httplib2.Http to verify that the temporary HTTP client created by build() 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'
主要言語
Python
スター
8.9k
フォーク
2.6k
平均マージ
2日 17時間
マージ済み PR(30日)
10

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

googleapis/google-api-python-client のほかの issue

googleapis/google-api-python-client の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。