File: io_digest_spec.cr

package info (click to toggle)
crystal 1.14.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 24,384 kB
  • sloc: javascript: 6,400; sh: 695; makefile: 269; ansic: 121; python: 105; cpp: 77; xml: 32
file content (96 lines) | stat: -rw-r--r-- 3,261 bytes parent folder | download | duplicates (2)
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