github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/fs/hash/hash_test.go (about)

     1  package hash_test
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"log"
     7  	"testing"
     8  
     9  	"github.com/rclone/rclone/fs/hash"
    10  	"github.com/spf13/pflag"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  // Check it satisfies the interface
    16  var _ pflag.Value = (*hash.Type)(nil)
    17  
    18  func TestHashSet(t *testing.T) {
    19  	var h hash.Set
    20  
    21  	assert.Equal(t, 0, h.Count())
    22  
    23  	a := h.Array()
    24  	assert.Len(t, a, 0)
    25  
    26  	h = h.Add(hash.MD5)
    27  	log.Println(h)
    28  	assert.Equal(t, 1, h.Count())
    29  	assert.Equal(t, hash.MD5, h.GetOne())
    30  	a = h.Array()
    31  	assert.Len(t, a, 1)
    32  	assert.Equal(t, a[0], hash.MD5)
    33  
    34  	// Test overlap, with all hashes
    35  	h = h.Overlap(hash.Supported())
    36  	assert.Equal(t, 1, h.Count())
    37  	assert.Equal(t, hash.MD5, h.GetOne())
    38  	assert.True(t, h.SubsetOf(hash.Supported()))
    39  	assert.True(t, h.SubsetOf(hash.NewHashSet(hash.MD5)))
    40  
    41  	h = h.Add(hash.SHA1)
    42  	assert.Equal(t, 2, h.Count())
    43  	one := h.GetOne()
    44  	if !(one == hash.MD5 || one == hash.SHA1) {
    45  		t.Fatalf("expected to be either MD5 or SHA1, got %v", one)
    46  	}
    47  	assert.True(t, h.SubsetOf(hash.Supported()))
    48  	assert.False(t, h.SubsetOf(hash.NewHashSet(hash.MD5)))
    49  	assert.False(t, h.SubsetOf(hash.NewHashSet(hash.SHA1)))
    50  	assert.True(t, h.SubsetOf(hash.NewHashSet(hash.MD5, hash.SHA1)))
    51  	a = h.Array()
    52  	assert.Len(t, a, 2)
    53  
    54  	ol := h.Overlap(hash.NewHashSet(hash.MD5))
    55  	assert.Equal(t, 1, ol.Count())
    56  	assert.True(t, ol.Contains(hash.MD5))
    57  	assert.False(t, ol.Contains(hash.SHA1))
    58  
    59  	ol = h.Overlap(hash.NewHashSet(hash.MD5, hash.SHA1))
    60  	assert.Equal(t, 2, ol.Count())
    61  	assert.True(t, ol.Contains(hash.MD5))
    62  	assert.True(t, ol.Contains(hash.SHA1))
    63  }
    64  
    65  type hashTest struct {
    66  	input  []byte
    67  	output map[hash.Type]string
    68  }
    69  
    70  var hashTestSet = []hashTest{
    71  	{
    72  		input: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
    73  		output: map[hash.Type]string{
    74  			hash.MD5:       "bf13fc19e5151ac57d4252e0e0f87abe",
    75  			hash.SHA1:      "3ab6543c08a75f292a5ecedac87ec41642d12166",
    76  			hash.Whirlpool: "eddf52133d4566d763f716e853d6e4efbabd29e2c2e63f56747b1596172851d34c2df9944beb6640dbdbe3d9b4eb61180720a79e3d15baff31c91e43d63869a4",
    77  			hash.CRC32:     "a6041d7e",
    78  		},
    79  	},
    80  	// Empty data set
    81  	{
    82  		input: []byte{},
    83  		output: map[hash.Type]string{
    84  			hash.MD5:       "d41d8cd98f00b204e9800998ecf8427e",
    85  			hash.SHA1:      "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    86  			hash.Whirlpool: "19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3",
    87  			hash.CRC32:     "00000000",
    88  		},
    89  	},
    90  }
    91  
    92  func TestMultiHasher(t *testing.T) {
    93  	for _, test := range hashTestSet {
    94  		mh := hash.NewMultiHasher()
    95  		n, err := io.Copy(mh, bytes.NewBuffer(test.input))
    96  		require.NoError(t, err)
    97  		assert.Len(t, test.input, int(n))
    98  		sums := mh.Sums()
    99  		for k, v := range sums {
   100  			expect, ok := test.output[k]
   101  			require.True(t, ok, "test output for hash not found")
   102  			assert.Equal(t, expect, v)
   103  		}
   104  		// Test that all are present
   105  		for k, v := range test.output {
   106  			expect, ok := sums[k]
   107  			require.True(t, ok, "test output for hash not found")
   108  			assert.Equal(t, expect, v)
   109  		}
   110  	}
   111  }
   112  
   113  func TestMultiHasherTypes(t *testing.T) {
   114  	h := hash.SHA1
   115  	for _, test := range hashTestSet {
   116  		mh, err := hash.NewMultiHasherTypes(hash.NewHashSet(h))
   117  		if err != nil {
   118  			t.Fatal(err)
   119  		}
   120  		n, err := io.Copy(mh, bytes.NewBuffer(test.input))
   121  		require.NoError(t, err)
   122  		assert.Len(t, test.input, int(n))
   123  		sums := mh.Sums()
   124  		assert.Len(t, sums, 1)
   125  		assert.Equal(t, sums[h], test.output[h])
   126  	}
   127  }
   128  
   129  func TestHashStream(t *testing.T) {
   130  	for _, test := range hashTestSet {
   131  		sums, err := hash.Stream(bytes.NewBuffer(test.input))
   132  		require.NoError(t, err)
   133  		for k, v := range sums {
   134  			expect, ok := test.output[k]
   135  			require.True(t, ok)
   136  			assert.Equal(t, v, expect)
   137  		}
   138  		// Test that all are present
   139  		for k, v := range test.output {
   140  			expect, ok := sums[k]
   141  			require.True(t, ok)
   142  			assert.Equal(t, v, expect)
   143  		}
   144  	}
   145  }
   146  
   147  func TestHashStreamTypes(t *testing.T) {
   148  	h := hash.SHA1
   149  	for _, test := range hashTestSet {
   150  		sums, err := hash.StreamTypes(bytes.NewBuffer(test.input), hash.NewHashSet(h))
   151  		require.NoError(t, err)
   152  		assert.Len(t, sums, 1)
   153  		assert.Equal(t, sums[h], test.output[h])
   154  	}
   155  }
   156  
   157  func TestHashSetStringer(t *testing.T) {
   158  	h := hash.NewHashSet(hash.SHA1, hash.MD5)
   159  	assert.Equal(t, h.String(), "[MD5, SHA-1]")
   160  	h = hash.NewHashSet(hash.SHA1)
   161  	assert.Equal(t, h.String(), "[SHA-1]")
   162  	h = hash.NewHashSet()
   163  	assert.Equal(t, h.String(), "[]")
   164  }
   165  
   166  func TestHashStringer(t *testing.T) {
   167  	h := hash.MD5
   168  	assert.Equal(t, h.String(), "MD5")
   169  	h = hash.None
   170  	assert.Equal(t, h.String(), "None")
   171  }