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 }