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  }