Commit 9fafad8e authored by Kirill Smelkov's avatar Kirill Smelkov

time: test: Explicitly release Timer/Ticker resources

In the light of discovered memory leaks (see nexedi/pygolang!24),
it is better to explicitly make sure that resources allocated by every
test are explicitly released. Even though timers are released
automatically on their expiration, there is generally no guarantee that
the tests will finish after all timers are expired. And even more so for
Ticker - without explicit stop, the ticker continues to be active
forever.

So stop all created timers and tickers where we can in the tests.

/proposed-for-review-on nexedi/pygolang!26
parent 2ec5e96b
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2019 Nexedi SA and Contributors. # Copyright (C) 2019-2024 Nexedi SA and Contributors.
# Kirill Smelkov <kirr@nexedi.com> # Kirill Smelkov <kirr@nexedi.com>
# #
# This program is free software: you can Use, Study, Modify and Redistribute # This program is free software: you can Use, Study, Modify and Redistribute
# it under the terms of the GNU General Public License version 3, or (at your # it under the terms of the GNU General Public License version 3, or (at your
...@@ -20,8 +20,8 @@ ...@@ -20,8 +20,8 @@
from __future__ import print_function, absolute_import from __future__ import print_function, absolute_import
from golang import select from golang import select, func, defer
from golang import time from golang import time, sync
from golang.golang_test import panics from golang.golang_test import panics
# all timer tests operate in dt units # all timer tests operate in dt units
...@@ -65,6 +65,7 @@ def test_ticker_time(): ...@@ -65,6 +65,7 @@ def test_ticker_time():
# test_timer verifies that Timer/Ticker fire as expected. # test_timer verifies that Timer/Ticker fire as expected.
@func
def test_timer(): def test_timer():
# start timers at x5, x7 and x11 intervals an verify that the timers fire # start timers at x5, x7 and x11 intervals an verify that the timers fire
# in expected sequence. The times when the timers fire do not overlap in # in expected sequence. The times when the timers fire do not overlap in
...@@ -73,15 +74,15 @@ def test_timer(): ...@@ -73,15 +74,15 @@ def test_timer():
tv = [] # timer events tv = [] # timer events
Tstart = time.now() Tstart = time.now()
t23 = time.Timer(23*dt) t23 = time.Timer(23*dt); defer(t23.stop)
t5 = time.Timer( 5*dt) t5 = time.Timer( 5*dt); defer(t5 .stop)
def _(): def _():
tv.append(7) tv.append(7)
t7f.reset(7*dt) t7f.reset(7*dt)
t7f = time.Timer( 7*dt, f=_) t7f = time.Timer( 7*dt, f=_); defer(t7f.stop)
tx11 = time.Ticker(11*dt) tx11 = time.Ticker(11*dt); defer(tx11.stop)
while 1: while 1:
_, _rx = select( _, _rx = select(
...@@ -108,19 +109,20 @@ def test_timer(): ...@@ -108,19 +109,20 @@ def test_timer():
# test_timer_misc, similarly to test_timer, verifies misc timer convenience functions. # test_timer_misc, similarly to test_timer, verifies misc timer convenience functions.
@func
def test_timer_misc(): def test_timer_misc():
tv = [] tv = []
Tstart = time.now() Tstart = time.now()
c23 = time.after(23*dt) c23 = time.after(23*dt) # cannot stop
c5 = time.after( 5*dt) c5 = time.after( 5*dt) # cannot stop
def _(): def _():
tv.append(7) tv.append(7)
t7f.reset(7*dt) t7f.reset(7*dt)
t7f = time.after_func(7*dt, _) t7f = time.after_func(7*dt, _); defer(t7f.stop)
cx11 = time.tick(11*dt) cx11 = time.tick(11*dt) # cannot stop
while 1: while 1:
_, _rx = select( _, _rx = select(
...@@ -148,13 +150,14 @@ def test_timer_misc(): ...@@ -148,13 +150,14 @@ def test_timer_misc():
# test_timer_stop verifies that .stop() cancels Timer or Ticker. # test_timer_stop verifies that .stop() cancels Timer or Ticker.
@func
def test_timer_stop(): def test_timer_stop():
tv = [] tv = []
t10 = time.Timer (10*dt) t10 = time.Timer (10*dt); defer(t10.stop)
t2 = time.Timer ( 2*dt) # will fire and cancel t3, tx5 t2 = time.Timer ( 2*dt); defer(t2 .stop) # will fire and cancel t3, tx5
t3 = time.Timer ( 3*dt) # will be canceled t3 = time.Timer ( 3*dt); defer(t3 .stop) # will be canceled
tx5 = time.Ticker( 5*dt) # will be canceled tx5 = time.Ticker( 5*dt); defer(tx5.stop) # will be canceled
while 1: while 1:
_, _rx = select( _, _rx = select(
...@@ -180,9 +183,10 @@ def test_timer_stop(): ...@@ -180,9 +183,10 @@ def test_timer_stop():
# test_timer_stop_drain verifies that Timer/Ticker .stop() drains timer channel. # test_timer_stop_drain verifies that Timer/Ticker .stop() drains timer channel.
@func
def test_timer_stop_drain(): def test_timer_stop_drain():
t = time.Timer (1*dt) t = time.Timer (1*dt); defer(t.stop)
tx = time.Ticker(1*dt) tx = time.Ticker(1*dt); defer(tx.stop)
time.sleep(2*dt) time.sleep(2*dt)
assert len(t.c) == 1 assert len(t.c) == 1
...@@ -196,8 +200,9 @@ def test_timer_stop_drain(): ...@@ -196,8 +200,9 @@ def test_timer_stop_drain():
# test_timer_reset_armed verifies that .reset() panics if called on armed timer. # test_timer_reset_armed verifies that .reset() panics if called on armed timer.
@func
def test_timer_reset_armed(): def test_timer_reset_armed():
# reset while armed # reset while armed
t = time.Timer(10*dt) t = time.Timer(10*dt); defer(t.stop)
with panics("Timer.reset: the timer is armed; must be stopped or expired"): with panics("Timer.reset: the timer is armed; must be stopped or expired"):
t.reset(5*dt) t.reset(5*dt)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment