1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
require "spec"
require "digest"
describe IO::Digest do
it "calculates digest from reading" do
base_io = IO::Memory.new("foo")
io = IO::Digest.new(base_io, ::Digest::SHA256.new)
slice = Bytes.new(256)
io.read(slice).should eq(3)
slice[0, 3].should eq("foo".to_slice)
io.final.should eq("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae".hexbytes)
end
it "can be created with ongoing digest" do
base_digest = OpenSSL::Digest.new("SHA256")
base_digest.update("foo")
base_io = IO::Memory.new("bar")
io = IO::Digest.new(base_io, base_digest)
slice = Bytes.new(256)
io.read(slice).should eq(3)
base_digest.update("baz")
# sha256("foobarbaz")
io.final.should eq("97df3588b5a3f24babc3851b372f0ba71a9dcdded43b14b9d06961bfc1707d9d".hexbytes)
end
it "calculates digest from multiple reads" do
base_io = IO::Memory.new("foo")
base_digest = OpenSSL::Digest.new("SHA256")
io = IO::Digest.new(base_io, base_digest)
slice = Bytes.new(2)
io.read(slice).should eq(2)
slice[0, 2].should eq("fo".to_slice)
io.read(slice).should eq(1)
slice[0, 1].should eq("o".to_slice)
io.final.should eq("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae".hexbytes)
end
it "does not calculate digest on read" do
base_io = IO::Memory.new("foo")
base_digest = OpenSSL::Digest.new("SHA256")
empty_digest = OpenSSL::Digest.new("SHA256").final
io = IO::Digest.new(base_io, base_digest, IO::Digest::DigestMode::Write)
slice = Bytes.new(256)
io.read(slice).should eq(3)
slice[0, 3].should eq("foo".to_slice)
io.final.should eq(empty_digest)
end
it "calculates digest from writing" do
base_io = IO::Memory.new
base_digest = OpenSSL::Digest.new("SHA256")
io = IO::Digest.new(base_io, base_digest, IO::Digest::DigestMode::Write)
io.write("foo".to_slice)
base_io.to_slice[0, 3].should eq("foo".to_slice)
io.final.should eq("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae".hexbytes)
end
it "calculates digest from writing a string" do
base_io = IO::Memory.new
base_digest = OpenSSL::Digest.new("SHA256")
io = IO::Digest.new(base_io, base_digest, IO::Digest::DigestMode::Write)
io.print("foo")
base_io.to_slice[0, 3].should eq("foo".to_slice)
io.final.should eq("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae".hexbytes)
end
it "calculates digest from multiple writes" do
base_io = IO::Memory.new
base_digest = OpenSSL::Digest.new("SHA256")
io = IO::Digest.new(base_io, base_digest, IO::Digest::DigestMode::Write)
io.write("fo".to_slice)
io.write("o".to_slice)
base_io.to_slice[0, 3].should eq("foo".to_slice)
io.final.should eq("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae".hexbytes)
end
it "does not calculate digest on write" do
base_io = IO::Memory.new
base_digest = OpenSSL::Digest.new("SHA256")
empty_digest = OpenSSL::Digest.new("SHA256").final
io = IO::Digest.new(base_io, base_digest, IO::Digest::DigestMode::Read)
io.write("foo".to_slice)
base_io.to_slice[0, 3].should eq("foo".to_slice)
io.final.should eq(empty_digest)
end
end
|