git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/object/splitinfo_test.go (about) 1 package object_test 2 3 import ( 4 "crypto/rand" 5 "encoding/json" 6 "testing" 7 8 objv2 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object" 9 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" 10 oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestSplitInfo(t *testing.T) { 15 s := object.NewSplitInfo() 16 splitID := object.NewSplitID() 17 lastPart := generateID() 18 link := generateID() 19 20 s.SetSplitID(splitID) 21 require.Equal(t, splitID, s.SplitID()) 22 23 s.SetLastPart(lastPart) 24 lp, set := s.LastPart() 25 require.True(t, set) 26 require.Equal(t, lastPart, lp) 27 28 s.SetLink(link) 29 l, set := s.Link() 30 require.True(t, set) 31 require.Equal(t, link, l) 32 } 33 34 func TestSplitInfoMarshal(t *testing.T) { 35 testToV2 := func(t *testing.T, s *object.SplitInfo) { 36 v2 := s.ToV2() 37 newS := object.NewSplitInfoFromV2(v2) 38 39 require.Equal(t, s, newS) 40 } 41 testMarshal := func(t *testing.T, s *object.SplitInfo) { 42 data, err := s.Marshal() 43 require.NoError(t, err) 44 45 newS := object.NewSplitInfo() 46 47 err = newS.Unmarshal(data) 48 require.NoError(t, err) 49 require.Equal(t, s, newS) 50 } 51 52 t.Run("good, both fields are set", func(t *testing.T) { 53 s := object.NewSplitInfo() 54 s.SetSplitID(object.NewSplitID()) 55 s.SetLink(generateID()) 56 s.SetLastPart(generateID()) 57 58 testToV2(t, s) 59 testMarshal(t, s) 60 }) 61 t.Run("good, only link is set", func(t *testing.T) { 62 s := object.NewSplitInfo() 63 s.SetSplitID(object.NewSplitID()) 64 s.SetLink(generateID()) 65 66 testToV2(t, s) 67 testMarshal(t, s) 68 }) 69 t.Run("good, only last part is set", func(t *testing.T) { 70 s := object.NewSplitInfo() 71 s.SetSplitID(object.NewSplitID()) 72 s.SetLastPart(generateID()) 73 74 testToV2(t, s) 75 testMarshal(t, s) 76 }) 77 t.Run("bad, no fields are set", func(t *testing.T) { 78 s := object.NewSplitInfo() 79 s.SetSplitID(object.NewSplitID()) 80 81 data, err := s.Marshal() 82 require.NoError(t, err) 83 require.Error(t, object.NewSplitInfo().Unmarshal(data)) 84 }) 85 } 86 87 func generateID() oid.ID { 88 var buf [32]byte 89 _, _ = rand.Read(buf[:]) 90 91 var id oid.ID 92 id.SetSHA256(buf) 93 94 return id 95 } 96 97 func TestNewSplitInfoFromV2(t *testing.T) { 98 t.Run("from nil", func(t *testing.T) { 99 var x *objv2.SplitInfo 100 101 require.Nil(t, object.NewSplitInfoFromV2(x)) 102 }) 103 } 104 105 func TestSplitInfo_ToV2(t *testing.T) { 106 t.Run("nil", func(t *testing.T) { 107 var x *object.SplitInfo 108 109 require.Nil(t, x.ToV2()) 110 }) 111 } 112 113 func TestNewSplitInfo(t *testing.T) { 114 t.Run("default values", func(t *testing.T) { 115 si := object.NewSplitInfo() 116 117 // check initial values 118 require.Nil(t, si.SplitID()) 119 _, set := si.LastPart() 120 require.False(t, set) 121 _, set = si.Link() 122 require.False(t, set) 123 124 // convert to v2 message 125 siV2 := si.ToV2() 126 127 require.Nil(t, siV2.GetSplitID()) 128 require.Nil(t, siV2.GetLastPart()) 129 require.Nil(t, siV2.GetLink()) 130 }) 131 } 132 133 func TestSplitInfoMarshalJSON(t *testing.T) { 134 t.Run("good", func(t *testing.T) { 135 s := object.NewSplitInfo() 136 s.SetSplitID(object.NewSplitID()) 137 s.SetLastPart(generateID()) 138 s.SetLink(generateID()) 139 140 data, err := s.MarshalJSON() 141 require.NoError(t, err) 142 143 actual := object.NewSplitInfo() 144 require.NoError(t, json.Unmarshal(data, actual)) 145 require.Equal(t, s, actual) 146 }) 147 t.Run("bad link", func(t *testing.T) { 148 data := `{"splitId":"Sn707289RrqDyJOrZMbMoQ==","lastPart":{"value":"Y7baWE0UdUOBr1ELKX3Q5v1LKRubQUbI81Q5UxCVeow="},"link":{"value":"bad"}}` 149 require.Error(t, json.Unmarshal([]byte(data), object.NewSplitInfo())) 150 }) 151 t.Run("bad last part", func(t *testing.T) { 152 data := `{"splitId":"Sn707289RrqDyJOrZMbMoQ==","lastPart":{"value":"bad"},"link":{"value":"eRyPNCNNxHfxPcjijlv05HEcdoep/b7eHNLRSmDlnts="}}` 153 require.Error(t, json.Unmarshal([]byte(data), object.NewSplitInfo())) 154 }) 155 }