63 lines
1.8 KiB
Ruby
63 lines
1.8 KiB
Ruby
|
require 'test/unit'
|
||
|
require 'radius'
|
||
|
|
||
|
class MultithreadTest < Test::Unit::TestCase
|
||
|
|
||
|
def setup
|
||
|
Thread.abort_on_exception
|
||
|
@context = Radius::Context.new do |c|
|
||
|
c.define_tag('thread') do |tag|
|
||
|
"#{tag.locals.thread_id} / #{tag.globals.object_id}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if RUBY_PLATFORM == 'java'
|
||
|
require 'java'
|
||
|
# call once before the thread to keep from using hidden require in a thread
|
||
|
Radius::Parser.new
|
||
|
def test_runs_multithreaded
|
||
|
lock = java.lang.String.new("lock")
|
||
|
threads = []
|
||
|
1000.times do |t|
|
||
|
thread = Thread.new do
|
||
|
parser = Radius::Parser.new(@context, :tag_prefix => 'r')
|
||
|
parser.context.globals.thread_id = Thread.current.object_id
|
||
|
expected = "#{Thread.current.object_id} / "+
|
||
|
"#{parser.context.globals.object_id}"
|
||
|
actual = parser.parse('<r:thread />')
|
||
|
assert_equal expected, actual
|
||
|
end
|
||
|
lock.synchronized do
|
||
|
threads << thread
|
||
|
end
|
||
|
end
|
||
|
lock.synchronized do
|
||
|
threads.each{|t| t.join }
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
def test_runs_multithreaded
|
||
|
threads = []
|
||
|
mute = Mutex.new
|
||
|
1000.times do |t|
|
||
|
thread = Thread.new do
|
||
|
parser = Radius::Parser.new(@context, :tag_prefix => 'r')
|
||
|
parser.context.globals.thread_id = Thread.current.object_id
|
||
|
expected = "#{Thread.current.object_id} / "+
|
||
|
"#{parser.context.globals.object_id}"
|
||
|
actual = parser.parse('<r:thread />')
|
||
|
assert_equal expected, actual
|
||
|
end
|
||
|
mute.synchronize do
|
||
|
threads << thread
|
||
|
end
|
||
|
end
|
||
|
mute.synchronize do
|
||
|
threads.each{|t| t.join }
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|