Skip to content

Commit

Permalink
fix #13166 tioselectors flaky test on freebsd+OSX (#14634)
Browse files Browse the repository at this point in the history
  • Loading branch information
timotheecour authored Jun 13, 2020
1 parent 5a26c37 commit d149823
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 5 deletions.
3 changes: 2 additions & 1 deletion testament/important_packages.nim
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ pkg1 "delaunay"
pkg1 "docopt"
pkg1 "easygl", true, "nim c -o:egl -r src/easygl.nim", "https://github.com/jackmott/easygl"
pkg1 "elvis"
pkg1 "fidget", true, "nim c -d:release -r tests/runNative.nim"
# pkg1 "fidget", true, "nim c -d:release -r tests/runNative.nim"
# Error: cannot open 'tests/runNative.nim'
pkg1 "fragments", false, "nim c -r fragments/dsl.nim"
pkg1 "gara"
pkg1 "ggplotnim", true, "nim c -d:noCairo -r -d:nimWorkaround14447 tests/tests.nim"
Expand Down
9 changes: 5 additions & 4 deletions tests/async/tioselectors.nim
Original file line number Diff line number Diff line change
Expand Up @@ -145,14 +145,15 @@ when not defined(windows):
proc timer_notification_test(): bool =
var selector = newSelector[int]()
var timer = selector.registerTimer(100, false, 0)
var rc1 = selector.select(140)
var rc2 = selector.select(140)
var rc1 = selector.select(10000)
var rc2 = selector.select(10000)
# if this flakes, see tests/m14634.nim
assert len(rc1) == 1 and len(rc2) == 1, $(len(rc1), len(rc2))
selector.unregister(timer)
discard selector.select(0)
selector.registerTimer(100, true, 0)
var rc4 = selector.select(120)
var rc5 = selector.select(120)
var rc4 = selector.select(10000)
var rc5 = selector.select(1000) # this will be an actual wait, keep it small
assert len(rc4) == 1 and len(rc5) == 0, $(len(rc4), len(rc5))
assert(selector.isEmpty())
selector.close()
Expand Down
48 changes: 48 additions & 0 deletions tests/m14634.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#[
Tool to investigate underlying reasons for https://github.com/nim-lang/Nim/pull/14634
nim r --threads:on -d:threadsafe tests/m14634.nim
]#

when not defined(windows):
import std/selectors

type TestData = object
s1, s2, s3: int

proc timerNotificationTestImpl(data: var TestData) =
var selector = newSelector[int]()
let t0 = 5
var timer = selector.registerTimer(t0, false, 0)
let t = 2000
# values too close to `t0` cause the test to be flaky in CI on OSX+freebsd
# When running locally, t0=100, t=98 will succeed some of the time which indicates
# there is some lag involved. Note that the higher `t-t0` is, the less times
# the test fails.
var rc1 = selector.select(t)
var rc2 = selector.select(t)
assert len(rc1) <= 1 and len(rc2) <= 1
data.s1 += ord(len(rc1) == 1)
data.s2 += ord(len(rc2) == 1)
selector.unregister(timer)
discard selector.select(0)
selector.registerTimer(t0, true, 0)
# same comment as above
var rc4 = selector.select(t)
let t2 = 100
# this can't be too large as it'll actually wait that long:
# timer_notification_test.n * t2
var rc5 = selector.select(t2)
assert len(rc4) + len(rc5) <= 1
data.s3 += ord(len(rc4) + len(rc5) == 1)
assert(selector.isEmpty())
selector.close()

proc timerNotificationTest() =
var data: TestData
let n = 10
for i in 0..<n:
timerNotificationTestImpl(data)
doAssert data.s1 == n and data.s2 == n and data.s3 == n, $data

when isMainModule:
timerNotificationTest()

0 comments on commit d149823

Please sign in to comment.