mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* Re-apply r33078, thread-safe autoload which is reverted at r33093.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33146 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f653519cbb
commit
cfe8ed5cbc
4 changed files with 279 additions and 32 deletions
|
@ -1,4 +1,6 @@
|
|||
require 'test/unit'
|
||||
require 'tempfile'
|
||||
require 'thread'
|
||||
require_relative 'envutil'
|
||||
|
||||
class TestAutoload < Test::Unit::TestCase
|
||||
|
@ -53,4 +55,112 @@ p Foo::Bar
|
|||
assert_equal(tmpfile, b.autoload?(:X), bug4565)
|
||||
}
|
||||
end
|
||||
|
||||
def test_require_explicit
|
||||
file = Tempfile.open(['autoload', '.rb'])
|
||||
file.puts 'class Object; AutoloadTest = 1; end'
|
||||
file.close
|
||||
add_autoload(file.path)
|
||||
begin
|
||||
assert_nothing_raised do
|
||||
assert(require file.path)
|
||||
assert_equal(1, ::AutoloadTest)
|
||||
end
|
||||
ensure
|
||||
remove_autoload_constant
|
||||
end
|
||||
end
|
||||
|
||||
def test_threaded_accessing_constant
|
||||
file = Tempfile.open(['autoload', '.rb'])
|
||||
file.puts 'sleep 0.5; class AutoloadTest; X = 1; end'
|
||||
file.close
|
||||
add_autoload(file.path)
|
||||
begin
|
||||
assert_nothing_raised do
|
||||
t1 = Thread.new { ::AutoloadTest::X }
|
||||
t2 = Thread.new { ::AutoloadTest::X }
|
||||
[t1, t2].each(&:join)
|
||||
end
|
||||
ensure
|
||||
remove_autoload_constant
|
||||
end
|
||||
end
|
||||
|
||||
def test_threaded_accessing_inner_constant
|
||||
file = Tempfile.open(['autoload', '.rb'])
|
||||
file.puts 'class AutoloadTest; sleep 0.5; X = 1; end'
|
||||
file.close
|
||||
add_autoload(file.path)
|
||||
begin
|
||||
assert_nothing_raised do
|
||||
t1 = Thread.new { ::AutoloadTest::X }
|
||||
t2 = Thread.new { ::AutoloadTest::X }
|
||||
[t1, t2].each(&:join)
|
||||
end
|
||||
ensure
|
||||
remove_autoload_constant
|
||||
end
|
||||
end
|
||||
|
||||
def test_nameerror_when_autoload_did_not_define_the_constant
|
||||
file = Tempfile.open(['autoload', '.rb'])
|
||||
file.puts ''
|
||||
file.close
|
||||
add_autoload(file.path)
|
||||
begin
|
||||
assert_raise(NameError) do
|
||||
AutoloadTest
|
||||
end
|
||||
ensure
|
||||
remove_autoload_constant
|
||||
end
|
||||
end
|
||||
|
||||
def test_override_autoload
|
||||
file = Tempfile.open(['autoload', '.rb'])
|
||||
file.puts ''
|
||||
file.close
|
||||
add_autoload(file.path)
|
||||
begin
|
||||
eval %q(class AutoloadTest; end)
|
||||
assert_equal(Class, AutoloadTest.class)
|
||||
ensure
|
||||
remove_autoload_constant
|
||||
end
|
||||
end
|
||||
|
||||
def test_override_while_autoloading
|
||||
file = Tempfile.open(['autoload', '.rb'])
|
||||
file.puts 'class AutoloadTest; sleep 0.5; end'
|
||||
file.close
|
||||
add_autoload(file.path)
|
||||
begin
|
||||
# while autoloading...
|
||||
t = Thread.new { AutoloadTest }
|
||||
sleep 0.1
|
||||
# override it
|
||||
eval %q(AutoloadTest = 1)
|
||||
t.join
|
||||
assert_equal(1, AutoloadTest)
|
||||
ensure
|
||||
remove_autoload_constant
|
||||
end
|
||||
end
|
||||
|
||||
def add_autoload(path)
|
||||
eval <<-END
|
||||
class ::Object
|
||||
autoload :AutoloadTest, #{path.dump}
|
||||
end
|
||||
END
|
||||
end
|
||||
|
||||
def remove_autoload_constant
|
||||
eval <<-END
|
||||
class ::Object
|
||||
remove_const(:AutoloadTest)
|
||||
end
|
||||
END
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue