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  }