diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-31 08:28:19 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-31 08:28:19 +0000 |
commit | cfe8ed5cbc763a3abcfc19ce10619836aeff7682 (patch) | |
tree | 73e1df59ad171cb0b3586efd97f20a9f4c6e1cb5 /test/ruby/test_autoload.rb | |
parent | f653519cbbf9344102502830f6e478ae3d293810 (diff) | |
download | ruby-cfe8ed5cbc763a3abcfc19ce10619836aeff7682.tar.gz |
* 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
Diffstat (limited to 'test/ruby/test_autoload.rb')
-rw-r--r-- | test/ruby/test_autoload.rb | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/test/ruby/test_autoload.rb b/test/ruby/test_autoload.rb index e175e57006..a3a4c5df1a 100644 --- a/test/ruby/test_autoload.rb +++ b/test/ruby/test_autoload.rb @@ -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 |