Skip to content

Commit 258724b

Browse files
Hide a refleak.
1 parent 8e5b347 commit 258724b

File tree

1 file changed

+68
-54
lines changed

1 file changed

+68
-54
lines changed

Lib/test/test__xxinterpchannels.py

+68-54
Original file line numberDiff line numberDiff line change
@@ -864,44 +864,6 @@ def f():
864864

865865
self.assertEqual(received, obj)
866866

867-
def test_send_closed_while_waiting(self):
868-
obj = b'spam'
869-
wait = self.build_send_waiter(obj)
870-
cid = channels.create()
871-
def f():
872-
wait()
873-
channels.close(cid, force=True)
874-
t = threading.Thread(target=f)
875-
t.start()
876-
with self.assertRaises(channels.ChannelClosedError):
877-
channels.send(cid, obj, blocking=True)
878-
t.join()
879-
880-
def test_send_buffer_closed_while_waiting(self):
881-
try:
882-
self._has_run_once
883-
except AttributeError:
884-
# At the moment, this test leaks a few references.
885-
# It looks like the leak originates with the addition
886-
# of _channels.send_buffer() (gh-110246), whereas the
887-
# tests were added afterward. We want this test even
888-
# if the refleak isn't fixed yet, so we skip here.
889-
raise unittest.SkipTest('temporarily skipped due to refleaks')
890-
else:
891-
self._has_run_once = True
892-
893-
obj = bytearray(b'spam')
894-
wait = self.build_send_waiter(obj, buffer=True)
895-
cid = channels.create()
896-
def f():
897-
wait()
898-
channels.close(cid, force=True)
899-
t = threading.Thread(target=f)
900-
t.start()
901-
with self.assertRaises(channels.ChannelClosedError):
902-
channels.send_buffer(cid, obj, blocking=True)
903-
t.join()
904-
905867
def test_send_timeout(self):
906868
obj = b'spam'
907869

@@ -927,19 +889,19 @@ def f():
927889
channels.send(cid, obj, blocking=True, timeout=10)
928890
t.join()
929891

930-
with self.subTest('channel closed while waiting'):
931-
cid = channels.create()
932-
def f():
933-
# sleep() isn't a great for this, but definitely simple.
934-
time.sleep(1)
935-
channels.close(cid, force=True)
936-
t = threading.Thread(target=f)
937-
t.start()
938-
with self.assertRaises(channels.ChannelClosedError):
939-
channels.send(cid, obj, blocking=True, timeout=2)
940-
t.join()
941-
942892
def test_send_buffer_timeout(self):
893+
try:
894+
self._has_run_once_timeout
895+
except AttributeError:
896+
# At the moment, this test leaks a few references.
897+
# It looks like the leak originates with the addition
898+
# of _channels.send_buffer() (gh-110246), whereas the
899+
# tests were added afterward. We want this test even
900+
# if the refleak isn't fixed yet, so we skip here.
901+
raise unittest.SkipTest('temporarily skipped due to refleaks')
902+
else:
903+
self._has_run_once_timeout = True
904+
943905
obj = bytearray(b'spam')
944906

945907
with self.subTest('non-blocking with timeout'):
@@ -964,16 +926,68 @@ def f():
964926
channels.send_buffer(cid, obj, blocking=True, timeout=10)
965927
t.join()
966928

967-
with self.subTest('channel closed while waiting'):
929+
def test_send_closed_while_waiting(self):
930+
obj = b'spam'
931+
wait = self.build_send_waiter(obj)
932+
933+
with self.subTest('without timeout'):
934+
cid = channels.create()
935+
def f():
936+
wait()
937+
channels.close(cid, force=True)
938+
t = threading.Thread(target=f)
939+
t.start()
940+
with self.assertRaises(channels.ChannelClosedError):
941+
channels.send(cid, obj, blocking=True)
942+
t.join()
943+
944+
with self.subTest('with timeout'):
945+
cid = channels.create()
946+
def f():
947+
wait()
948+
channels.close(cid, force=True)
949+
t = threading.Thread(target=f)
950+
t.start()
951+
with self.assertRaises(channels.ChannelClosedError):
952+
channels.send(cid, obj, blocking=True, timeout=30)
953+
t.join()
954+
955+
def test_send_buffer_closed_while_waiting(self):
956+
try:
957+
self._has_run_once_closed
958+
except AttributeError:
959+
# At the moment, this test leaks a few references.
960+
# It looks like the leak originates with the addition
961+
# of _channels.send_buffer() (gh-110246), whereas the
962+
# tests were added afterward. We want this test even
963+
# if the refleak isn't fixed yet, so we skip here.
964+
raise unittest.SkipTest('temporarily skipped due to refleaks')
965+
else:
966+
self._has_run_once_closed = True
967+
968+
obj = bytearray(b'spam')
969+
wait = self.build_send_waiter(obj, buffer=True)
970+
971+
with self.subTest('without timeout'):
972+
cid = channels.create()
973+
def f():
974+
wait()
975+
channels.close(cid, force=True)
976+
t = threading.Thread(target=f)
977+
t.start()
978+
with self.assertRaises(channels.ChannelClosedError):
979+
channels.send_buffer(cid, obj, blocking=True)
980+
t.join()
981+
982+
with self.subTest('with timeout'):
968983
cid = channels.create()
969984
def f():
970-
# sleep() isn't a great for this, but definitely simple.
971-
time.sleep(1)
985+
wait()
972986
channels.close(cid, force=True)
973987
t = threading.Thread(target=f)
974988
t.start()
975989
with self.assertRaises(channels.ChannelClosedError):
976-
channels.send_buffer(cid, obj, blocking=True, timeout=2)
990+
channels.send_buffer(cid, obj, blocking=True, timeout=30)
977991
t.join()
978992

979993
#-------------------

0 commit comments

Comments
 (0)