git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/object/id/id_test.go (about) 1 package oid 2 3 import ( 4 "crypto/rand" 5 "crypto/sha256" 6 "strconv" 7 "testing" 8 9 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs" 10 "github.com/mr-tron/base58" 11 "github.com/stretchr/testify/require" 12 ) 13 14 const emptyID = "11111111111111111111111111111111" 15 16 func randID(t *testing.T) ID { 17 var id ID 18 id.SetSHA256(randSHA256Checksum(t)) 19 20 return id 21 } 22 23 func randSHA256Checksum(t *testing.T) (cs [sha256.Size]byte) { 24 _, err := rand.Read(cs[:]) 25 require.NoError(t, err) 26 27 return 28 } 29 30 func TestIDV2(t *testing.T) { 31 var id ID 32 33 checksum := [sha256.Size]byte{} 34 35 _, err := rand.Read(checksum[:]) 36 require.NoError(t, err) 37 38 id.SetSHA256(checksum) 39 40 var idV2 refs.ObjectID 41 id.WriteToV2(&idV2) 42 43 require.Equal(t, checksum[:], idV2.GetValue()) 44 } 45 46 func TestID_Equal(t *testing.T) { 47 cs := randSHA256Checksum(t) 48 49 var id1 ID 50 id1.SetSHA256(cs) 51 52 var id2 ID 53 id2.SetSHA256(cs) 54 55 var id3 ID 56 id3.SetSHA256(randSHA256Checksum(t)) 57 58 require.True(t, id1.Equals(id2)) 59 require.False(t, id1.Equals(id3)) 60 } 61 62 func TestID_Parse(t *testing.T) { 63 t.Run("should parse successful", func(t *testing.T) { 64 for i := range 10 { 65 t.Run(strconv.Itoa(i), func(t *testing.T) { 66 cs := randSHA256Checksum(t) 67 str := base58.Encode(cs[:]) 68 var oid ID 69 70 require.NoError(t, oid.DecodeString(str)) 71 72 var oidV2 refs.ObjectID 73 oid.WriteToV2(&oidV2) 74 75 require.Equal(t, cs[:], oidV2.GetValue()) 76 }) 77 } 78 }) 79 80 t.Run("should failure on parse", func(t *testing.T) { 81 for i := range 10 { 82 j := i 83 t.Run(strconv.Itoa(j), func(t *testing.T) { 84 cs := []byte{1, 2, 3, 4, 5, byte(j)} 85 str := base58.Encode(cs) 86 var oid ID 87 88 require.Error(t, oid.DecodeString(str)) 89 }) 90 } 91 }) 92 } 93 94 func TestID_String(t *testing.T) { 95 t.Run("zero", func(t *testing.T) { 96 var id ID 97 require.Equal(t, emptyID, id.EncodeToString()) 98 }) 99 100 t.Run("should be equal", func(t *testing.T) { 101 for i := range 10 { 102 t.Run(strconv.Itoa(i), func(t *testing.T) { 103 cs := randSHA256Checksum(t) 104 str := base58.Encode(cs[:]) 105 var oid ID 106 107 require.NoError(t, oid.DecodeString(str)) 108 require.Equal(t, str, oid.EncodeToString()) 109 }) 110 } 111 }) 112 } 113 114 func TestObjectIDEncoding(t *testing.T) { 115 id := randID(t) 116 117 t.Run("binary", func(t *testing.T) { 118 data, err := id.Marshal() 119 require.NoError(t, err) 120 121 var id2 ID 122 require.NoError(t, id2.Unmarshal(data)) 123 124 require.Equal(t, id, id2) 125 }) 126 127 t.Run("json", func(t *testing.T) { 128 data, err := id.MarshalJSON() 129 require.NoError(t, err) 130 131 var id2 ID 132 require.NoError(t, id2.UnmarshalJSON(data)) 133 134 require.Equal(t, id, id2) 135 }) 136 } 137 138 func TestNewIDFromV2(t *testing.T) { 139 t.Run("from zero", func(t *testing.T) { 140 var ( 141 x ID 142 v2 refs.ObjectID 143 ) 144 145 require.Error(t, x.ReadFromV2(v2)) 146 }) 147 } 148 149 func TestID_ToV2(t *testing.T) { 150 t.Run("zero to v2", func(t *testing.T) { 151 var ( 152 x ID 153 v2 refs.ObjectID 154 ) 155 156 x.WriteToV2(&v2) 157 158 require.Equal(t, sha256.Size, len(v2.GetValue())) 159 require.Equal(t, emptyID, base58.Encode(v2.GetValue())) 160 }) 161 } 162 163 func TestID_Encode(t *testing.T) { 164 var id ID 165 166 t.Run("panic", func(t *testing.T) { 167 dst := make([]byte, sha256.Size-1) 168 169 require.Panics(t, func() { 170 id.Encode(dst) 171 }) 172 }) 173 174 t.Run("correct", func(t *testing.T) { 175 dst := make([]byte, sha256.Size) 176 177 require.NotPanics(t, func() { 178 id.Encode(dst) 179 }) 180 require.Equal(t, emptyID, id.EncodeToString()) 181 }) 182 }