diff options
Diffstat (limited to 'test/digest')
-rw-r--r-- | test/digest/digest/foo.rb | 10 | ||||
-rw-r--r-- | test/digest/test_digest.rb | 61 |
2 files changed, 71 insertions, 0 deletions
diff --git a/test/digest/digest/foo.rb b/test/digest/digest/foo.rb new file mode 100644 index 0000000000..d576ef00e0 --- /dev/null +++ b/test/digest/digest/foo.rb @@ -0,0 +1,10 @@ +module Digest + Foo = nil + + sleep 0.2 + + remove_const(:Foo) + + class Foo < Class + end +end diff --git a/test/digest/test_digest.rb b/test/digest/test_digest.rb index f4ec0234f1..ccf0a26b90 100644 --- a/test/digest/test_digest.rb +++ b/test/digest/test_digest.rb @@ -208,4 +208,65 @@ module TestDigest end end end + + class TestDigestParen < Test::Unit::TestCase + def test_sha2 + assert_separately(%w[-rdigest], <<-'end;') + assert_nothing_raised { + Digest(:SHA256).new + Digest(:SHA384).new + Digest(:SHA512).new + } + end; + end + + def test_no_lib + assert_separately(%w[-rdigest], <<-'end;') + class Digest::Nolib < Digest::Class + end + + assert_nothing_raised { + Digest(:Nolib).new + } + end; + end + + def test_no_lib_no_def + assert_separately(%w[-rdigest], <<-'end;') + assert_raise(LoadError) { + Digest(:Nodef).new + } + end; + end + + def test_race + assert_separately(['-rdigest', "-I#{File.dirname(__FILE__)}"], <<-'end;') + assert_nothing_raised { + t = Thread.start { + sleep 0.1 + Digest(:Foo).new + } + Digest(:Foo).new + t.join + } + end; + end + + def test_race_mixed + assert_separately(['-rdigest', "-I#{File.dirname(__FILE__)}"], <<-'end;') + assert_nothing_raised { + t = Thread.start { + sleep 0.1 + Digest::Foo.new + } + Digest(:Foo).new + begin + t.join + rescue NoMethodError, NameError + # NoMethodError is highly likely; NameError is listed just in case + end + } + end; + end + end end |