github.com/mckael/restic@v0.8.3/internal/hashing/reader_test.go (about)

     1  package hashing
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"crypto/sha256"
     7  	"io"
     8  	"io/ioutil"
     9  	"testing"
    10  )
    11  
    12  func TestReader(t *testing.T) {
    13  	tests := []int{5, 23, 2<<18 + 23, 1 << 20}
    14  
    15  	for _, size := range tests {
    16  		data := make([]byte, size)
    17  		_, err := io.ReadFull(rand.Reader, data)
    18  		if err != nil {
    19  			t.Fatalf("ReadFull: %v", err)
    20  		}
    21  
    22  		expectedHash := sha256.Sum256(data)
    23  
    24  		rd := NewReader(bytes.NewReader(data), sha256.New())
    25  		n, err := io.Copy(ioutil.Discard, rd)
    26  		if err != nil {
    27  			t.Fatal(err)
    28  		}
    29  
    30  		if n != int64(size) {
    31  			t.Errorf("Reader: invalid number of bytes written: got %d, expected %d",
    32  				n, size)
    33  		}
    34  
    35  		resultingHash := rd.Sum(nil)
    36  
    37  		if !bytes.Equal(expectedHash[:], resultingHash) {
    38  			t.Errorf("Reader: hashes do not match: expected %02x, got %02x",
    39  				expectedHash, resultingHash)
    40  		}
    41  	}
    42  }
    43  
    44  func BenchmarkReader(b *testing.B) {
    45  	buf := make([]byte, 1<<22)
    46  	_, err := io.ReadFull(rand.Reader, buf)
    47  	if err != nil {
    48  		b.Fatal(err)
    49  	}
    50  
    51  	expectedHash := sha256.Sum256(buf)
    52  
    53  	b.SetBytes(int64(len(buf)))
    54  	b.ResetTimer()
    55  	for i := 0; i < b.N; i++ {
    56  		rd := NewReader(bytes.NewReader(buf), sha256.New())
    57  		n, err := io.Copy(ioutil.Discard, rd)
    58  		if err != nil {
    59  			b.Fatal(err)
    60  		}
    61  
    62  		if n != int64(len(buf)) {
    63  			b.Errorf("Reader: invalid number of bytes written: got %d, expected %d",
    64  				n, len(buf))
    65  		}
    66  
    67  		resultingHash := rd.Sum(nil)
    68  		if !bytes.Equal(expectedHash[:], resultingHash) {
    69  			b.Errorf("Reader: hashes do not match: expected %02x, got %02x",
    70  				expectedHash, resultingHash)
    71  		}
    72  	}
    73  }