aboutsummaryrefslogtreecommitdiffstats
path: root/test/digest
diff options
context:
space:
mode:
Diffstat (limited to 'test/digest')
-rw-r--r--test/digest/digest/foo.rb10
-rw-r--r--test/digest/test_digest.rb61
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