github.com/artpar/rclone@v1.67.3/backend/dropbox/dbhash/dbhash_test.go (about)

     1  package dbhash_test
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/artpar/rclone/backend/dropbox/dbhash"
     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, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},
    22  		{1, "1cd6ef71e6e0ff46ad2609d403dc3fee244417089aa4461245a4e4fe23a55e42"},
    23  		{2, "01e0655fb754d10418a73760f57515f4903b298e6d67dda6bf0987fa79c22c88"},
    24  		{4096, "8620913d33852befe09f16fff8fd75f77a83160d29f76f07e0276e9690903035"},
    25  		{4194303, "647c8627d70f7a7d13ce96b1e7710a771a55d41a62c3da490d92e56044d311fa"},
    26  		{4194304, "d4d63bac5b866c71620185392a8a6218ac1092454a2d16f820363b69852befa3"},
    27  		{4194305, "8f553da8d00d0bf509d8470e242888be33019c20c0544811f5b2b89e98360b92"},
    28  		{8388607, "83b30cf4fb5195b04a937727ae379cf3d06673bf8f77947f6a92858536e8369c"},
    29  		{8388608, "e08b3ba1f538804075c5f939accdeaa9efc7b5c01865c94a41e78ca6550a88e7"},
    30  		{8388609, "02c8a4aefc2bfc9036f89a7098001865885938ca580e5c9e5db672385edd303c"},
    31  	} {
    32  		d := dbhash.New()
    33  		var toWrite int
    34  		for toWrite = test.n; toWrite >= chunk; toWrite -= chunk {
    35  			n, err := d.Write(data)
    36  			assert.Nil(t, err)
    37  			assert.Equal(t, chunk, n)
    38  		}
    39  		n, err := d.Write(data[:toWrite])
    40  		assert.Nil(t, err)
    41  		assert.Equal(t, toWrite, n)
    42  		got := hex.EncodeToString(d.Sum(nil))
    43  		assert.Equal(t, test.want, got, fmt.Sprintf("when testing length %d", n))
    44  
    45  	}
    46  }
    47  
    48  func TestHashChunk16M(t *testing.T)  { testChunk(t, 16*1024*1024) }
    49  func TestHashChunk8M(t *testing.T)   { testChunk(t, 8*1024*1024) }
    50  func TestHashChunk4M(t *testing.T)   { testChunk(t, 4*1024*1024) }
    51  func TestHashChunk2M(t *testing.T)   { testChunk(t, 2*1024*1024) }
    52  func TestHashChunk1M(t *testing.T)   { testChunk(t, 1*1024*1024) }
    53  func TestHashChunk64k(t *testing.T)  { testChunk(t, 64*1024) }
    54  func TestHashChunk32k(t *testing.T)  { testChunk(t, 32*1024) }
    55  func TestHashChunk2048(t *testing.T) { testChunk(t, 2048) }
    56  func TestHashChunk2047(t *testing.T) { testChunk(t, 2047) }
    57  
    58  func TestSumCalledTwice(t *testing.T) {
    59  	d := dbhash.New()
    60  	assert.NotPanics(t, func() { d.Sum(nil) })
    61  	d.Reset()
    62  	assert.NotPanics(t, func() { d.Sum(nil) })
    63  	assert.NotPanics(t, func() { d.Sum(nil) })
    64  	_, _ = d.Write([]byte{1})
    65  	assert.Panics(t, func() { d.Sum(nil) })
    66  }
    67  
    68  func TestSize(t *testing.T) {
    69  	d := dbhash.New()
    70  	assert.Equal(t, 32, d.Size())
    71  }
    72  
    73  func TestBlockSize(t *testing.T) {
    74  	d := dbhash.New()
    75  	assert.Equal(t, 64, d.BlockSize())
    76  }
    77  
    78  func TestSum(t *testing.T) {
    79  	assert.Equal(t,
    80  		[64]byte{
    81  			0x1c, 0xd6, 0xef, 0x71, 0xe6, 0xe0, 0xff, 0x46,
    82  			0xad, 0x26, 0x09, 0xd4, 0x03, 0xdc, 0x3f, 0xee,
    83  			0x24, 0x44, 0x17, 0x08, 0x9a, 0xa4, 0x46, 0x12,
    84  			0x45, 0xa4, 0xe4, 0xfe, 0x23, 0xa5, 0x5e, 0x42,
    85  		},
    86  		dbhash.Sum([]byte{'A'}),
    87  	)
    88  }