github.com/ncw/rclone@v1.48.1-0.20190724201158-a35aa1360e3e/fs/hash/hash_test.go (about) 1 package hash_test 2 3 import ( 4 "bytes" 5 "io" 6 "testing" 7 8 "github.com/ncw/rclone/fs/hash" 9 "github.com/spf13/pflag" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 // Check it satisfies the interface 15 var _ pflag.Value = (*hash.Type)(nil) 16 17 func TestHashSet(t *testing.T) { 18 var h hash.Set 19 20 assert.Equal(t, 0, h.Count()) 21 22 a := h.Array() 23 assert.Len(t, a, 0) 24 25 h = h.Add(hash.MD5) 26 assert.Equal(t, 1, h.Count()) 27 assert.Equal(t, hash.MD5, h.GetOne()) 28 a = h.Array() 29 assert.Len(t, a, 1) 30 assert.Equal(t, a[0], hash.MD5) 31 32 // Test overlap, with all hashes 33 h = h.Overlap(hash.Supported) 34 assert.Equal(t, 1, h.Count()) 35 assert.Equal(t, hash.MD5, h.GetOne()) 36 assert.True(t, h.SubsetOf(hash.Supported)) 37 assert.True(t, h.SubsetOf(hash.NewHashSet(hash.MD5))) 38 39 h = h.Add(hash.SHA1) 40 assert.Equal(t, 2, h.Count()) 41 one := h.GetOne() 42 if !(one == hash.MD5 || one == hash.SHA1) { 43 t.Fatalf("expected to be either MD5 or SHA1, got %v", one) 44 } 45 assert.True(t, h.SubsetOf(hash.Supported)) 46 assert.False(t, h.SubsetOf(hash.NewHashSet(hash.MD5))) 47 assert.False(t, h.SubsetOf(hash.NewHashSet(hash.SHA1))) 48 assert.True(t, h.SubsetOf(hash.NewHashSet(hash.MD5, hash.SHA1))) 49 a = h.Array() 50 assert.Len(t, a, 2) 51 52 ol := h.Overlap(hash.NewHashSet(hash.MD5)) 53 assert.Equal(t, 1, ol.Count()) 54 assert.True(t, ol.Contains(hash.MD5)) 55 assert.False(t, ol.Contains(hash.SHA1)) 56 57 ol = h.Overlap(hash.NewHashSet(hash.MD5, hash.SHA1)) 58 assert.Equal(t, 2, ol.Count()) 59 assert.True(t, ol.Contains(hash.MD5)) 60 assert.True(t, ol.Contains(hash.SHA1)) 61 } 62 63 type hashTest struct { 64 input []byte 65 output map[hash.Type]string 66 } 67 68 var hashTestSet = []hashTest{ 69 { 70 input: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 71 output: map[hash.Type]string{ 72 hash.MD5: "bf13fc19e5151ac57d4252e0e0f87abe", 73 hash.SHA1: "3ab6543c08a75f292a5ecedac87ec41642d12166", 74 hash.Dropbox: "214d2fcf3566e94c99ad2f59bd993daca46d8521a0c447adf4b324f53fddc0c7", 75 hash.QuickXorHash: "0110c000085000031c0001095ec00218d0000700", 76 hash.Whirlpool: "eddf52133d4566d763f716e853d6e4efbabd29e2c2e63f56747b1596172851d34c2df9944beb6640dbdbe3d9b4eb61180720a79e3d15baff31c91e43d63869a4", 77 }, 78 }, 79 // Empty data set 80 { 81 input: []byte{}, 82 output: map[hash.Type]string{ 83 hash.MD5: "d41d8cd98f00b204e9800998ecf8427e", 84 hash.SHA1: "da39a3ee5e6b4b0d3255bfef95601890afd80709", 85 hash.Dropbox: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 86 hash.QuickXorHash: "0000000000000000000000000000000000000000", 87 hash.Whirlpool: "19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3", 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, hash.Dropbox, hash.QuickXorHash) 159 assert.Equal(t, h.String(), "[MD5, SHA-1, DropboxHash, QuickXorHash]") 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 }