36 lines
1014 B
Ruby
36 lines
1014 B
Ruby
require 'em_test_helper'
|
|
|
|
class TestConnectionWrite < Test::Unit::TestCase
|
|
|
|
# This test takes advantage of the fact that EM::_RunSelectOnce iterates over the connections twice:
|
|
# - once to determine which ones to call Write() on
|
|
# - and once to call Write() on each of them.
|
|
#
|
|
# But state may change in the meantime before Write() is finally called.
|
|
# And that is what we try to exploit to get Write() to be called when bWatchOnly is true, and bNotifyWritable is false,
|
|
# to cause an assertion failure.
|
|
|
|
module SimpleClient
|
|
def notify_writable
|
|
$conn2.notify_writable = false # Being naughty in callback
|
|
# If this doesn't crash anything, the test passed!
|
|
end
|
|
end
|
|
|
|
def test_with_naughty_callback
|
|
EM.run do
|
|
r1, _ = IO.pipe
|
|
r2, _ = IO.pipe
|
|
|
|
# Adding EM.watches
|
|
$conn1 = EM.watch(r1, SimpleClient)
|
|
$conn2 = EM.watch(r2, SimpleClient)
|
|
|
|
$conn1.notify_writable = true
|
|
$conn2.notify_writable = true
|
|
|
|
EM.stop
|
|
end
|
|
end
|
|
end
|