Skip to content

Commit

Permalink
Merge pull request #1054 from herwinw/openssl_digest
Browse files Browse the repository at this point in the history
Add more specs for OpenSSL::Digest
  • Loading branch information
andrykonchin authored Oct 29, 2023
2 parents 7eefa90 + e83b3f0 commit 09d73f4
Show file tree
Hide file tree
Showing 10 changed files with 426 additions and 7 deletions.
4 changes: 4 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ Lint/AssignmentInCondition:
Lint/BooleanSymbol:
Enabled: false

Lint/DeprecatedOpenSSLConstant:
Exclude:
- library/openssl/digest/**/*.rb

Lint/InterpolationCheck:
Enabled: false

Expand Down
6 changes: 6 additions & 0 deletions library/openssl/digest/append_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
require_relative '../../../spec_helper'
require_relative 'shared/update'

describe "OpenSSL::Digest#<<" do
it_behaves_like :openssl_digest_update, :<<
end
44 changes: 44 additions & 0 deletions library/openssl/digest/block_length_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
require_relative '../../../spec_helper'
require_relative '../../../library/digest/sha1/shared/constants'
require_relative '../../../library/digest/sha256/shared/constants'
require_relative '../../../library/digest/sha384/shared/constants'
require_relative '../../../library/digest/sha512/shared/constants'
require 'openssl'

describe "OpenSSL::Digest#block_length" do
context "when the digest object is created via a name argument" do
it "returns a SHA1 block length" do
OpenSSL::Digest.new('sha1').block_length.should == SHA1Constants::BlockLength
end

it "returns a SHA256 block length" do
OpenSSL::Digest.new('sha256').block_length.should == SHA256Constants::BlockLength
end

it "returns a SHA384 block length" do
OpenSSL::Digest.new('sha384').block_length.should == SHA384Constants::BlockLength
end

it "returns a SHA512 block length" do
OpenSSL::Digest.new('sha512').block_length.should == SHA512Constants::BlockLength
end
end

context "when the digest object is created via a subclass" do
it "returns a SHA1 block length" do
OpenSSL::Digest::SHA1.new.block_length.should == SHA1Constants::BlockLength
end

it "returns a SHA256 block length" do
OpenSSL::Digest::SHA256.new.block_length.should == SHA256Constants::BlockLength
end

it "returns a SHA384 block length" do
OpenSSL::Digest::SHA384.new.block_length.should == SHA384Constants::BlockLength
end

it "returns a SHA512 block length" do
OpenSSL::Digest::SHA512.new.block_length.should == SHA512Constants::BlockLength
end
end
end
44 changes: 44 additions & 0 deletions library/openssl/digest/digest_length_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
require_relative '../../../spec_helper'
require_relative '../../../library/digest/sha1/shared/constants'
require_relative '../../../library/digest/sha256/shared/constants'
require_relative '../../../library/digest/sha384/shared/constants'
require_relative '../../../library/digest/sha512/shared/constants'
require 'openssl'

describe "OpenSSL::Digest#digest_length" do
context "when the digest object is created via a name argument" do
it "returns a SHA1 digest length" do
OpenSSL::Digest.new('sha1').digest_length.should == SHA1Constants::DigestLength
end

it "returns a SHA256 digest length" do
OpenSSL::Digest.new('sha256').digest_length.should == SHA256Constants::DigestLength
end

it "returns a SHA384 digest length" do
OpenSSL::Digest.new('sha384').digest_length.should == SHA384Constants::DigestLength
end

it "returns a SHA512 digest length" do
OpenSSL::Digest.new('sha512').digest_length.should == SHA512Constants::DigestLength
end
end

context "when the digest object is created via a subclass" do
it "returns a SHA1 digest length" do
OpenSSL::Digest::SHA1.new.digest_length.should == SHA1Constants::DigestLength
end

it "returns a SHA256 digest length" do
OpenSSL::Digest::SHA256.new.digest_length.should == SHA256Constants::DigestLength
end

it "returns a SHA384 digest length" do
OpenSSL::Digest::SHA384.new.digest_length.should == SHA384Constants::DigestLength
end

it "returns a SHA512 digest length" do
OpenSSL::Digest::SHA512.new.digest_length.should == SHA512Constants::DigestLength
end
end
end
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
require_relative '../../spec_helper'
require_relative '../../library/digest/sha1/shared/constants'
require_relative '../../library/digest/sha256/shared/constants'
require_relative '../../library/digest/sha384/shared/constants'
require_relative '../../library/digest/sha512/shared/constants'
require_relative '../../../spec_helper'
require_relative '../../../library/digest/sha1/shared/constants'
require_relative '../../../library/digest/sha256/shared/constants'
require_relative '../../../library/digest/sha384/shared/constants'
require_relative '../../../library/digest/sha512/shared/constants'
require 'openssl'

describe "OpenSSL::Digest" do

describe "OpenSSL::Digest class methods" do
describe ".digest" do
it "returns a SHA1 digest" do
OpenSSL::Digest.digest('sha1', SHA1Constants::Contents).should == SHA1Constants::Digest
Expand Down
141 changes: 141 additions & 0 deletions library/openssl/digest/initialize_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
require_relative '../../../spec_helper'
require_relative '../../../library/digest/sha1/shared/constants'
require_relative '../../../library/digest/sha256/shared/constants'
require_relative '../../../library/digest/sha384/shared/constants'
require_relative '../../../library/digest/sha512/shared/constants'
require 'openssl'

describe "OpenSSL::Digest#initialize" do
describe "can be called with a digest name" do
it "returns a SHA1 object" do
OpenSSL::Digest.new("sha1").name.should == "SHA1"
end

it "returns a SHA256 object" do
OpenSSL::Digest.new("sha256").name.should == "SHA256"
end

it "returns a SHA384 object" do
OpenSSL::Digest.new("sha384").name.should == "SHA384"
end

it "returns a SHA512 object" do
OpenSSL::Digest.new("sha512").name.should == "SHA512"
end

it "throws an error when called with an unknown digest" do
-> { OpenSSL::Digest.new("wd40") }.should raise_error(RuntimeError, /Unsupported digest algorithm \(wd40\)/)
end

it "cannot be called with a symbol" do
-> { OpenSSL::Digest.new(:SHA1) }.should raise_error(TypeError, /wrong argument type Symbol/)
end

it "does not call #to_str on the argument" do
name = mock("digest name")
name.should_not_receive(:to_str)
-> { OpenSSL::Digest.new(name) }.should raise_error(TypeError, /wrong argument type/)
end
end

describe "can be called with a digest object" do
it "returns a SHA1 object" do
OpenSSL::Digest.new(OpenSSL::Digest::SHA1.new).name.should == "SHA1"
end

it "returns a SHA256 object" do
OpenSSL::Digest.new(OpenSSL::Digest::SHA256.new).name.should == "SHA256"
end

it "returns a SHA384 object" do
OpenSSL::Digest.new(OpenSSL::Digest::SHA384.new).name.should == "SHA384"
end

it "returns a SHA512 object" do
OpenSSL::Digest.new(OpenSSL::Digest::SHA512.new).name.should == "SHA512"
end

it "ignores the state of the digest object" do
sha1 = OpenSSL::Digest.new('sha1', SHA1Constants::Contents)
OpenSSL::Digest.new(sha1).digest.should == SHA1Constants::BlankDigest
end
end

it "cannot be called with a digest class" do
-> { OpenSSL::Digest.new(OpenSSL::Digest::SHA1) }.should raise_error(TypeError, /wrong argument type Class/)
end

context "when called without an initial String argument" do
it "returns a SHA1 digest" do
OpenSSL::Digest.new("sha1").digest.should == SHA1Constants::BlankDigest
end

it "returns a SHA256 digest" do
OpenSSL::Digest.new("sha256").digest.should == SHA256Constants::BlankDigest
end

it "returns a SHA384 digest" do
OpenSSL::Digest.new("sha384").digest.should == SHA384Constants::BlankDigest
end

it "returns a SHA512 digest" do
OpenSSL::Digest.new("sha512").digest.should == SHA512Constants::BlankDigest
end
end

context "when called with an initial String argument" do
it "returns a SHA1 digest of that argument" do
OpenSSL::Digest.new("sha1", SHA1Constants::Contents).digest.should == SHA1Constants::Digest
end

it "returns a SHA256 digest of that argument" do
OpenSSL::Digest.new("sha256", SHA256Constants::Contents).digest.should == SHA256Constants::Digest
end

it "returns a SHA384 digest of that argument" do
OpenSSL::Digest.new("sha384", SHA384Constants::Contents).digest.should == SHA384Constants::Digest
end

it "returns a SHA512 digest of that argument" do
OpenSSL::Digest.new("sha512", SHA512Constants::Contents).digest.should == SHA512Constants::Digest
end
end

context "can be called on subclasses" do
describe "can be called without an initial String argument on subclasses" do
it "returns a SHA1 digest" do
OpenSSL::Digest::SHA1.new.digest.should == SHA1Constants::BlankDigest
end

it "returns a SHA256 digest" do
OpenSSL::Digest::SHA256.new.digest.should == SHA256Constants::BlankDigest
end

it "returns a SHA384 digest" do
OpenSSL::Digest::SHA384.new.digest.should == SHA384Constants::BlankDigest
end

it "returns a SHA512 digest" do
OpenSSL::Digest::SHA512.new.digest.should == SHA512Constants::BlankDigest
end
end

describe "can be called with an initial String argument on subclasses" do
it "returns a SHA1 digest" do
OpenSSL::Digest::SHA1.new(SHA1Constants::Contents).digest.should == SHA1Constants::Digest
end

it "returns a SHA256 digest" do
OpenSSL::Digest::SHA256.new(SHA256Constants::Contents).digest.should == SHA256Constants::Digest
end

it "returns a SHA384 digest" do
OpenSSL::Digest::SHA384.new(SHA384Constants::Contents).digest.should == SHA384Constants::Digest
end

it "returns a SHA512 digest" do
OpenSSL::Digest::SHA512.new(SHA512Constants::Contents).digest.should == SHA512Constants::Digest
end
end
end
end
16 changes: 16 additions & 0 deletions library/openssl/digest/name_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
require_relative '../../../spec_helper'
require 'openssl'

describe "OpenSSL::Digest#name" do
it "returns the name of digest" do
OpenSSL::Digest.new('SHA1').name.should == 'SHA1'
end

it "converts the name to the internal representation of OpenSSL" do
OpenSSL::Digest.new('sha1').name.should == 'SHA1'
end

it "works on subclasses too" do
OpenSSL::Digest::SHA1.new.name.should == 'SHA1'
end
end
36 changes: 36 additions & 0 deletions library/openssl/digest/reset_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
require_relative '../../../spec_helper'
require_relative '../../../library/digest/sha1/shared/constants'
require_relative '../../../library/digest/sha256/shared/constants'
require_relative '../../../library/digest/sha384/shared/constants'
require_relative '../../../library/digest/sha512/shared/constants'
require 'openssl'

describe "OpenSSL::Digest#reset" do
it "works for a SHA1 digest" do
digest = OpenSSL::Digest.new('sha1', SHA1Constants::Contents)
digest.reset
digest.update(SHA1Constants::Contents)
digest.digest.should == SHA1Constants::Digest
end

it "works for a SHA256 digest" do
digest = OpenSSL::Digest.new('sha256', SHA256Constants::Contents)
digest.reset
digest.update(SHA256Constants::Contents)
digest.digest.should == SHA256Constants::Digest
end

it "works for a SHA384 digest" do
digest = OpenSSL::Digest.new('sha384', SHA384Constants::Contents)
digest.reset
digest.update(SHA384Constants::Contents)
digest.digest.should == SHA384Constants::Digest
end

it "works for a SHA512 digest" do
digest = OpenSSL::Digest.new('sha512', SHA512Constants::Contents)
digest.reset
digest.update(SHA512Constants::Contents)
digest.digest.should == SHA512Constants::Digest
end
end
Loading

0 comments on commit 09d73f4

Please sign in to comment.