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 |