Skip to content

Commit 09d73f4

Browse files
authored
Merge pull request #1054 from herwinw/openssl_digest
Add more specs for OpenSSL::Digest
2 parents 7eefa90 + e83b3f0 commit 09d73f4

File tree

10 files changed

+426
-7
lines changed

10 files changed

+426
-7
lines changed

.rubocop.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ Lint/AssignmentInCondition:
3333
Lint/BooleanSymbol:
3434
Enabled: false
3535

36+
Lint/DeprecatedOpenSSLConstant:
37+
Exclude:
38+
- library/openssl/digest/**/*.rb
39+
3640
Lint/InterpolationCheck:
3741
Enabled: false
3842

library/openssl/digest/append_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
require_relative '../../../spec_helper'
2+
require_relative 'shared/update'
3+
4+
describe "OpenSSL::Digest#<<" do
5+
it_behaves_like :openssl_digest_update, :<<
6+
end
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
require_relative '../../../spec_helper'
2+
require_relative '../../../library/digest/sha1/shared/constants'
3+
require_relative '../../../library/digest/sha256/shared/constants'
4+
require_relative '../../../library/digest/sha384/shared/constants'
5+
require_relative '../../../library/digest/sha512/shared/constants'
6+
require 'openssl'
7+
8+
describe "OpenSSL::Digest#block_length" do
9+
context "when the digest object is created via a name argument" do
10+
it "returns a SHA1 block length" do
11+
OpenSSL::Digest.new('sha1').block_length.should == SHA1Constants::BlockLength
12+
end
13+
14+
it "returns a SHA256 block length" do
15+
OpenSSL::Digest.new('sha256').block_length.should == SHA256Constants::BlockLength
16+
end
17+
18+
it "returns a SHA384 block length" do
19+
OpenSSL::Digest.new('sha384').block_length.should == SHA384Constants::BlockLength
20+
end
21+
22+
it "returns a SHA512 block length" do
23+
OpenSSL::Digest.new('sha512').block_length.should == SHA512Constants::BlockLength
24+
end
25+
end
26+
27+
context "when the digest object is created via a subclass" do
28+
it "returns a SHA1 block length" do
29+
OpenSSL::Digest::SHA1.new.block_length.should == SHA1Constants::BlockLength
30+
end
31+
32+
it "returns a SHA256 block length" do
33+
OpenSSL::Digest::SHA256.new.block_length.should == SHA256Constants::BlockLength
34+
end
35+
36+
it "returns a SHA384 block length" do
37+
OpenSSL::Digest::SHA384.new.block_length.should == SHA384Constants::BlockLength
38+
end
39+
40+
it "returns a SHA512 block length" do
41+
OpenSSL::Digest::SHA512.new.block_length.should == SHA512Constants::BlockLength
42+
end
43+
end
44+
end
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
require_relative '../../../spec_helper'
2+
require_relative '../../../library/digest/sha1/shared/constants'
3+
require_relative '../../../library/digest/sha256/shared/constants'
4+
require_relative '../../../library/digest/sha384/shared/constants'
5+
require_relative '../../../library/digest/sha512/shared/constants'
6+
require 'openssl'
7+
8+
describe "OpenSSL::Digest#digest_length" do
9+
context "when the digest object is created via a name argument" do
10+
it "returns a SHA1 digest length" do
11+
OpenSSL::Digest.new('sha1').digest_length.should == SHA1Constants::DigestLength
12+
end
13+
14+
it "returns a SHA256 digest length" do
15+
OpenSSL::Digest.new('sha256').digest_length.should == SHA256Constants::DigestLength
16+
end
17+
18+
it "returns a SHA384 digest length" do
19+
OpenSSL::Digest.new('sha384').digest_length.should == SHA384Constants::DigestLength
20+
end
21+
22+
it "returns a SHA512 digest length" do
23+
OpenSSL::Digest.new('sha512').digest_length.should == SHA512Constants::DigestLength
24+
end
25+
end
26+
27+
context "when the digest object is created via a subclass" do
28+
it "returns a SHA1 digest length" do
29+
OpenSSL::Digest::SHA1.new.digest_length.should == SHA1Constants::DigestLength
30+
end
31+
32+
it "returns a SHA256 digest length" do
33+
OpenSSL::Digest::SHA256.new.digest_length.should == SHA256Constants::DigestLength
34+
end
35+
36+
it "returns a SHA384 digest length" do
37+
OpenSSL::Digest::SHA384.new.digest_length.should == SHA384Constants::DigestLength
38+
end
39+
40+
it "returns a SHA512 digest length" do
41+
OpenSSL::Digest::SHA512.new.digest_length.should == SHA512Constants::DigestLength
42+
end
43+
end
44+
end

library/openssl/digest_spec.rb renamed to library/openssl/digest/digest_spec.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
require_relative '../../spec_helper'
2-
require_relative '../../library/digest/sha1/shared/constants'
3-
require_relative '../../library/digest/sha256/shared/constants'
4-
require_relative '../../library/digest/sha384/shared/constants'
5-
require_relative '../../library/digest/sha512/shared/constants'
1+
require_relative '../../../spec_helper'
2+
require_relative '../../../library/digest/sha1/shared/constants'
3+
require_relative '../../../library/digest/sha256/shared/constants'
4+
require_relative '../../../library/digest/sha384/shared/constants'
5+
require_relative '../../../library/digest/sha512/shared/constants'
66
require 'openssl'
77

8-
describe "OpenSSL::Digest" do
9-
8+
describe "OpenSSL::Digest class methods" do
109
describe ".digest" do
1110
it "returns a SHA1 digest" do
1211
OpenSSL::Digest.digest('sha1', SHA1Constants::Contents).should == SHA1Constants::Digest
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
require_relative '../../../spec_helper'
2+
require_relative '../../../library/digest/sha1/shared/constants'
3+
require_relative '../../../library/digest/sha256/shared/constants'
4+
require_relative '../../../library/digest/sha384/shared/constants'
5+
require_relative '../../../library/digest/sha512/shared/constants'
6+
require 'openssl'
7+
8+
describe "OpenSSL::Digest#initialize" do
9+
describe "can be called with a digest name" do
10+
it "returns a SHA1 object" do
11+
OpenSSL::Digest.new("sha1").name.should == "SHA1"
12+
end
13+
14+
it "returns a SHA256 object" do
15+
OpenSSL::Digest.new("sha256").name.should == "SHA256"
16+
end
17+
18+
it "returns a SHA384 object" do
19+
OpenSSL::Digest.new("sha384").name.should == "SHA384"
20+
end
21+
22+
it "returns a SHA512 object" do
23+
OpenSSL::Digest.new("sha512").name.should == "SHA512"
24+
end
25+
26+
it "throws an error when called with an unknown digest" do
27+
-> { OpenSSL::Digest.new("wd40") }.should raise_error(RuntimeError, /Unsupported digest algorithm \(wd40\)/)
28+
end
29+
30+
it "cannot be called with a symbol" do
31+
-> { OpenSSL::Digest.new(:SHA1) }.should raise_error(TypeError, /wrong argument type Symbol/)
32+
end
33+
34+
it "does not call #to_str on the argument" do
35+
name = mock("digest name")
36+
name.should_not_receive(:to_str)
37+
-> { OpenSSL::Digest.new(name) }.should raise_error(TypeError, /wrong argument type/)
38+
end
39+
end
40+
41+
describe "can be called with a digest object" do
42+
it "returns a SHA1 object" do
43+
OpenSSL::Digest.new(OpenSSL::Digest::SHA1.new).name.should == "SHA1"
44+
end
45+
46+
it "returns a SHA256 object" do
47+
OpenSSL::Digest.new(OpenSSL::Digest::SHA256.new).name.should == "SHA256"
48+
end
49+
50+
it "returns a SHA384 object" do
51+
OpenSSL::Digest.new(OpenSSL::Digest::SHA384.new).name.should == "SHA384"
52+
end
53+
54+
it "returns a SHA512 object" do
55+
OpenSSL::Digest.new(OpenSSL::Digest::SHA512.new).name.should == "SHA512"
56+
end
57+
58+
it "ignores the state of the digest object" do
59+
sha1 = OpenSSL::Digest.new('sha1', SHA1Constants::Contents)
60+
OpenSSL::Digest.new(sha1).digest.should == SHA1Constants::BlankDigest
61+
end
62+
end
63+
64+
it "cannot be called with a digest class" do
65+
-> { OpenSSL::Digest.new(OpenSSL::Digest::SHA1) }.should raise_error(TypeError, /wrong argument type Class/)
66+
end
67+
68+
context "when called without an initial String argument" do
69+
it "returns a SHA1 digest" do
70+
OpenSSL::Digest.new("sha1").digest.should == SHA1Constants::BlankDigest
71+
end
72+
73+
it "returns a SHA256 digest" do
74+
OpenSSL::Digest.new("sha256").digest.should == SHA256Constants::BlankDigest
75+
end
76+
77+
it "returns a SHA384 digest" do
78+
OpenSSL::Digest.new("sha384").digest.should == SHA384Constants::BlankDigest
79+
end
80+
81+
it "returns a SHA512 digest" do
82+
OpenSSL::Digest.new("sha512").digest.should == SHA512Constants::BlankDigest
83+
end
84+
end
85+
86+
context "when called with an initial String argument" do
87+
it "returns a SHA1 digest of that argument" do
88+
OpenSSL::Digest.new("sha1", SHA1Constants::Contents).digest.should == SHA1Constants::Digest
89+
end
90+
91+
it "returns a SHA256 digest of that argument" do
92+
OpenSSL::Digest.new("sha256", SHA256Constants::Contents).digest.should == SHA256Constants::Digest
93+
end
94+
95+
it "returns a SHA384 digest of that argument" do
96+
OpenSSL::Digest.new("sha384", SHA384Constants::Contents).digest.should == SHA384Constants::Digest
97+
end
98+
99+
it "returns a SHA512 digest of that argument" do
100+
OpenSSL::Digest.new("sha512", SHA512Constants::Contents).digest.should == SHA512Constants::Digest
101+
end
102+
end
103+
104+
context "can be called on subclasses" do
105+
describe "can be called without an initial String argument on subclasses" do
106+
it "returns a SHA1 digest" do
107+
OpenSSL::Digest::SHA1.new.digest.should == SHA1Constants::BlankDigest
108+
end
109+
110+
it "returns a SHA256 digest" do
111+
OpenSSL::Digest::SHA256.new.digest.should == SHA256Constants::BlankDigest
112+
end
113+
114+
it "returns a SHA384 digest" do
115+
OpenSSL::Digest::SHA384.new.digest.should == SHA384Constants::BlankDigest
116+
end
117+
118+
it "returns a SHA512 digest" do
119+
OpenSSL::Digest::SHA512.new.digest.should == SHA512Constants::BlankDigest
120+
end
121+
end
122+
123+
describe "can be called with an initial String argument on subclasses" do
124+
it "returns a SHA1 digest" do
125+
OpenSSL::Digest::SHA1.new(SHA1Constants::Contents).digest.should == SHA1Constants::Digest
126+
end
127+
128+
it "returns a SHA256 digest" do
129+
OpenSSL::Digest::SHA256.new(SHA256Constants::Contents).digest.should == SHA256Constants::Digest
130+
end
131+
132+
it "returns a SHA384 digest" do
133+
OpenSSL::Digest::SHA384.new(SHA384Constants::Contents).digest.should == SHA384Constants::Digest
134+
end
135+
136+
it "returns a SHA512 digest" do
137+
OpenSSL::Digest::SHA512.new(SHA512Constants::Contents).digest.should == SHA512Constants::Digest
138+
end
139+
end
140+
end
141+
end

library/openssl/digest/name_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
require_relative '../../../spec_helper'
2+
require 'openssl'
3+
4+
describe "OpenSSL::Digest#name" do
5+
it "returns the name of digest" do
6+
OpenSSL::Digest.new('SHA1').name.should == 'SHA1'
7+
end
8+
9+
it "converts the name to the internal representation of OpenSSL" do
10+
OpenSSL::Digest.new('sha1').name.should == 'SHA1'
11+
end
12+
13+
it "works on subclasses too" do
14+
OpenSSL::Digest::SHA1.new.name.should == 'SHA1'
15+
end
16+
end

library/openssl/digest/reset_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
require_relative '../../../spec_helper'
2+
require_relative '../../../library/digest/sha1/shared/constants'
3+
require_relative '../../../library/digest/sha256/shared/constants'
4+
require_relative '../../../library/digest/sha384/shared/constants'
5+
require_relative '../../../library/digest/sha512/shared/constants'
6+
require 'openssl'
7+
8+
describe "OpenSSL::Digest#reset" do
9+
it "works for a SHA1 digest" do
10+
digest = OpenSSL::Digest.new('sha1', SHA1Constants::Contents)
11+
digest.reset
12+
digest.update(SHA1Constants::Contents)
13+
digest.digest.should == SHA1Constants::Digest
14+
end
15+
16+
it "works for a SHA256 digest" do
17+
digest = OpenSSL::Digest.new('sha256', SHA256Constants::Contents)
18+
digest.reset
19+
digest.update(SHA256Constants::Contents)
20+
digest.digest.should == SHA256Constants::Digest
21+
end
22+
23+
it "works for a SHA384 digest" do
24+
digest = OpenSSL::Digest.new('sha384', SHA384Constants::Contents)
25+
digest.reset
26+
digest.update(SHA384Constants::Contents)
27+
digest.digest.should == SHA384Constants::Digest
28+
end
29+
30+
it "works for a SHA512 digest" do
31+
digest = OpenSSL::Digest.new('sha512', SHA512Constants::Contents)
32+
digest.reset
33+
digest.update(SHA512Constants::Contents)
34+
digest.digest.should == SHA512Constants::Digest
35+
end
36+
end

0 commit comments

Comments
 (0)