github.com/artpar/rclone@v1.67.3/backend/mailru/mrhash/mrhash_test.go (about)

     1  package mrhash_test
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/artpar/rclone/backend/mailru/mrhash"
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func testChunk(t *testing.T, chunk int) {
    13  	data := make([]byte, chunk)
    14  	for i := 0; i < chunk; i++ {
    15  		data[i] = 'A'
    16  	}
    17  	for _, test := range []struct {
    18  		n    int
    19  		want string
    20  	}{
    21  		{0, "0000000000000000000000000000000000000000"},
    22  		{1, "4100000000000000000000000000000000000000"},
    23  		{2, "4141000000000000000000000000000000000000"},
    24  		{19, "4141414141414141414141414141414141414100"},
    25  		{20, "4141414141414141414141414141414141414141"},
    26  		{21, "eb1d05e78a18691a5aa196a6c2b60cd40b5faafb"},
    27  		{22, "037e6d960601118a0639afbeff30fe716c66ed2d"},
    28  		{4096, "45a16aa192502b010280fb5b44274c601a91fd9f"},
    29  		{4194303, "fa019d5bd26498cf6abe35e0d61801bf19bf704b"},
    30  		{4194304, "5ed0e07aa6ea5c1beb9402b4d807258f27d40773"},
    31  		{4194305, "67bd0b9247db92e0e7d7e29a0947a50fedcb5452"},
    32  		{8388607, "41a8e2eb044c2e242971b5445d7be2a13fc0dd84"},
    33  		{8388608, "267a970917c624c11fe624276ec60233a66dc2c0"},
    34  		{8388609, "37b60b308d553d2732aefb62b3ea88f74acfa13f"},
    35  	} {
    36  		d := mrhash.New()
    37  		var toWrite int
    38  		for toWrite = test.n; toWrite >= chunk; toWrite -= chunk {
    39  			n, err := d.Write(data)
    40  			assert.Nil(t, err)
    41  			assert.Equal(t, chunk, n)
    42  		}
    43  		n, err := d.Write(data[:toWrite])
    44  		assert.Nil(t, err)
    45  		assert.Equal(t, toWrite, n)
    46  		got1 := hex.EncodeToString(d.Sum(nil))
    47  		assert.Equal(t, test.want, got1, fmt.Sprintf("when testing length %d", n))
    48  		got2 := hex.EncodeToString(d.Sum(nil))
    49  		assert.Equal(t, test.want, got2, fmt.Sprintf("when testing length %d (2nd sum)", n))
    50  	}
    51  }
    52  
    53  func TestHashChunk16M(t *testing.T)  { testChunk(t, 16*1024*1024) }
    54  func TestHashChunk8M(t *testing.T)   { testChunk(t, 8*1024*1024) }
    55  func TestHashChunk4M(t *testing.T)   { testChunk(t, 4*1024*1024) }
    56  func TestHashChunk2M(t *testing.T)   { testChunk(t, 2*1024*1024) }
    57  func TestHashChunk1M(t *testing.T)   { testChunk(t, 1*1024*1024) }
    58  func TestHashChunk64k(t *testing.T)  { testChunk(t, 64*1024) }
    59  func TestHashChunk32k(t *testing.T)  { testChunk(t, 32*1024) }
    60  func TestHashChunk2048(t *testing.T) { testChunk(t, 2048) }
    61  func TestHashChunk2047(t *testing.T) { testChunk(t, 2047) }
    62  
    63  func TestSumCalledTwice(t *testing.T) {
    64  	d := mrhash.New()
    65  	assert.NotPanics(t, func() { d.Sum(nil) })
    66  	d.Reset()
    67  	assert.NotPanics(t, func() { d.Sum(nil) })
    68  	assert.NotPanics(t, func() { d.Sum(nil) })
    69  	_, _ = d.Write([]byte{1})
    70  	assert.NotPanics(t, func() { d.Sum(nil) })
    71  }
    72  
    73  func TestSize(t *testing.T) {
    74  	d := mrhash.New()
    75  	assert.Equal(t, 20, d.Size())
    76  }
    77  
    78  func TestBlockSize(t *testing.T) {
    79  	d := mrhash.New()
    80  	assert.Equal(t, 64, d.BlockSize())
    81  }