Skip to content

Commit c13a024

Browse files
committed
Make digest Ractor safe
1 parent 736436c commit c13a024

File tree

4 files changed

+109
-2
lines changed

4 files changed

+109
-2
lines changed

Rakefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ require "bundler/gem_tasks"
22
require "rake/testtask"
33

44
Rake::TestTask.new(:test) do |t|
5-
t.libs << "test" << "test/lib"
6-
t.libs << "lib"
5+
ENV["RUBYOPT"] = "-Itest -Itest/lib -Ilib"
76
t.test_files = FileList["test/**/test_*.rb"]
87
end
98

109
require 'rake/extensiontask'
10+
Rake::ExtensionTask.new("digest")
1111
%w(bubblebabble md5 rmd160 sha1 sha2).each do |ext|
1212
Rake::ExtensionTask.new("digest/#{ext}")
1313
end

ext/digest/digest.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,10 @@ InitVM_digest(void)
765765
*/
766766
rb_mDigest = rb_define_module("Digest");
767767

768+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
769+
rb_ext_ractor_safe(true);
770+
#endif
771+
768772
/* module functions */
769773
rb_define_module_function(rb_mDigest, "hexencode", rb_digest_s_hexencode, 1);
770774

ext/digest/extconf.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@
88
"digest.h" => "$(HDRDIR)"
99
}
1010

11+
have_func("rb_ext_ractor_safe")
12+
1113
create_makefile("digest")

test/digest/test_ractor.rb

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# frozen_string_literal: false
2+
require 'test/unit'
3+
4+
require 'digest'
5+
%w[digest/md5 digest/rmd160 digest/sha1 digest/sha2 digest/bubblebabble].each do |lib|
6+
begin
7+
require lib
8+
rescue LoadError
9+
end
10+
end
11+
12+
module TestDigestRactor
13+
Data1 = "abc"
14+
Data2 = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
15+
16+
def setup
17+
skip unless defined?(Ractor)
18+
end
19+
20+
def test_s_hexdigest
21+
assert_in_out_err([], <<-"end;", ["true", "true"], [])
22+
$VERBOSE = nil
23+
require "digest"
24+
require "#{self.class::LIB}"
25+
DATA = #{self.class::DATA.inspect}
26+
rs = DATA.map do |str, hexdigest|
27+
r = Ractor.new str do |x|
28+
#{self.class::ALGO}.hexdigest(x)
29+
end
30+
[r, hexdigest]
31+
end
32+
rs.each do |r, hexdigest|
33+
puts r.take == hexdigest
34+
end
35+
end;
36+
end
37+
38+
class TestMD5Ractor < Test::Unit::TestCase
39+
include TestDigestRactor
40+
LIB = "digest/md5"
41+
ALGO = Digest::MD5
42+
DATA = {
43+
Data1 => "900150983cd24fb0d6963f7d28e17f72",
44+
Data2 => "8215ef0796a20bcaaae116d3876c664a",
45+
}
46+
end if defined?(Digest::MD5)
47+
48+
class TestSHA1Ractor < Test::Unit::TestCase
49+
include TestDigestRactor
50+
LIB = "digest/sha1"
51+
ALGO = Digest::SHA1
52+
DATA = {
53+
Data1 => "a9993e364706816aba3e25717850c26c9cd0d89d",
54+
Data2 => "84983e441c3bd26ebaae4aa1f95129e5e54670f1",
55+
}
56+
end if defined?(Digest::SHA1)
57+
58+
class TestSHA256Ractor < Test::Unit::TestCase
59+
include TestDigestRactor
60+
LIB = "digest/sha2"
61+
ALGO = Digest::SHA256
62+
DATA = {
63+
Data1 => "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
64+
Data2 => "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
65+
}
66+
end if defined?(Digest::SHA256)
67+
68+
class TestSHA384Ractor < Test::Unit::TestCase
69+
include TestDigestRactor
70+
LIB = "digest/sha2"
71+
ALGO = Digest::SHA384
72+
DATA = {
73+
Data1 => "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed"\
74+
"8086072ba1e7cc2358baeca134c825a7",
75+
Data2 => "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6"\
76+
"b0455a8520bc4e6f5fe95b1fe3c8452b",
77+
}
78+
end if defined?(Digest::SHA384)
79+
80+
class TestSHA512Ractor < Test::Unit::TestCase
81+
include TestDigestRactor
82+
LIB = "digest/sha2"
83+
ALGO = Digest::SHA512
84+
DATA = {
85+
Data1 => "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"\
86+
"2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
87+
Data2 => "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c335"\
88+
"96fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445",
89+
}
90+
end if defined?(Digest::SHA512)
91+
92+
class TestRMD160Ractor < Test::Unit::TestCase
93+
include TestDigestRactor
94+
LIB = "digest/rmd160"
95+
ALGO = Digest::RMD160
96+
DATA = {
97+
Data1 => "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc",
98+
Data2 => "12a053384a9c0c88e405a06c27dcf49ada62eb2b",
99+
}
100+
end if defined?(Digest::RMD160)
101+
end

0 commit comments

Comments
 (0)