From cfe8ed5cbc763a3abcfc19ce10619836aeff7682 Mon Sep 17 00:00:00 2001 From: nahi Date: Wed, 31 Aug 2011 08:28:19 +0000 Subject: * 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 --- test/ruby/test_autoload.rb | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) (limited to 'test') 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 -- cgit v1.2.3