From: Daniele Varrazzo Date: Tue, 12 Jan 2021 22:47:39 +0000 (+0100) Subject: Added reference leak test for other fetch methods X-Git-Tag: 3.0.dev0~164 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4bff439c020812634be4d602d6eef4be4f17316;p=thirdparty%2Fpsycopg.git Added reference leak test for other fetch methods --- diff --git a/tests/fix_faker.py b/tests/fix_faker.py index cb9823455..d6928ae86 100644 --- a/tests/fix_faker.py +++ b/tests/fix_faker.py @@ -106,12 +106,12 @@ class Faker: fields, self.table_name ) - def choose_schema(self, types=None, nfields=20): + def choose_schema(self, types=None, ncols=20): if not types: types = self.get_supported_types() types_list = sorted(types, key=lambda cls: cls.__name__) - schema = [choice(types_list) for i in range(nfields)] + schema = [choice(types_list) for i in range(ncols)] for i, cls in enumerate(schema): # choose the type of the array if cls is list: @@ -121,9 +121,7 @@ class Faker: break schema[i] = [scls] elif cls is tuple: - schema[i] = tuple( - self.choose_schema(types=types, nfields=nfields) - ) + schema[i] = tuple(self.choose_schema(types=types, ncols=ncols)) return schema diff --git a/tests/test_cursor.py b/tests/test_cursor.py index c32dff95a..d9869f891 100644 --- a/tests/test_cursor.py +++ b/tests/test_cursor.py @@ -406,13 +406,14 @@ def test_str(conn): @pytest.mark.slow @pytest.mark.parametrize("fmt", [Format.AUTO, Format.TEXT, Format.BINARY]) -def test_leak_fetchall(dsn, faker, fmt): +@pytest.mark.parametrize("fetch", ["one", "many", "all", "iter"]) +def test_leak(dsn, faker, fmt, fetch): if fmt != Format.BINARY: pytest.xfail("faker to extend to all text dumpers") faker.format = fmt - faker.choose_schema() - faker.make_records(100) + faker.choose_schema(ncols=5) + faker.make_records(10) n = [] for i in range(3): @@ -422,8 +423,31 @@ def test_leak_fetchall(dsn, faker, fmt): cur.execute(faker.create_stmt) cur.executemany(faker.insert_stmt, faker.records) cur.execute(faker.select_stmt) - for got, want in zip(cur.fetchall(), faker.records): + + recs = [] + if fetch == "one": + while 1: + tmp = cur.fetchone() + if tmp is None: + break + recs.append(tmp) + elif fetch == "many": + while 1: + tmp = cur.fetchmany(3) + if not tmp: + break + recs.extend(tmp) + elif fetch == "all": + recs.extend(cur.fetchall()) + elif fetch == "iter": + for rec in cur: + recs.append(rec) + + for got, want in zip(recs, faker.records): faker.assert_record(got, want) + + recs = tmp = None + del cur, conn gc.collect() gc.collect()