git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/eacl/table_test.go (about)

     1  package eacl_test
     2  
     3  import (
     4  	"crypto/sha256"
     5  	"testing"
     6  
     7  	"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
     8  	cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
     9  	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
    10  	eacltest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl/test"
    11  	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestTable(t *testing.T) {
    16  	var v version.Version
    17  
    18  	sha := sha256.Sum256([]byte("container id"))
    19  	id := cidtest.IDWithChecksum(sha)
    20  
    21  	v.SetMajor(3)
    22  	v.SetMinor(2)
    23  
    24  	table := eacl.NewTable()
    25  	table.SetVersion(v)
    26  	table.SetCID(id)
    27  	table.AddRecord(eacl.CreateRecord(eacl.ActionAllow, eacl.OperationPut))
    28  
    29  	v2 := table.ToV2()
    30  	require.NotNil(t, v2)
    31  	require.Equal(t, uint32(3), v2.GetVersion().GetMajor())
    32  	require.Equal(t, uint32(2), v2.GetVersion().GetMinor())
    33  	require.Equal(t, sha[:], v2.GetContainerID().GetValue())
    34  	require.Len(t, v2.GetRecords(), 1)
    35  
    36  	newTable := eacl.NewTableFromV2(v2)
    37  	require.Equal(t, table, newTable)
    38  
    39  	t.Run("new from nil v2 table", func(t *testing.T) {
    40  		require.Equal(t, new(eacl.Table), eacl.NewTableFromV2(nil))
    41  	})
    42  
    43  	t.Run("create table", func(t *testing.T) {
    44  		id := cidtest.ID()
    45  
    46  		table := eacl.CreateTable(id)
    47  		cID, set := table.CID()
    48  		require.True(t, set)
    49  		require.Equal(t, id, cID)
    50  		require.Equal(t, version.Current(), table.Version())
    51  	})
    52  }
    53  
    54  func TestTable_AddRecord(t *testing.T) {
    55  	records := []eacl.Record{
    56  		*eacl.CreateRecord(eacl.ActionDeny, eacl.OperationDelete),
    57  		*eacl.CreateRecord(eacl.ActionAllow, eacl.OperationPut),
    58  	}
    59  
    60  	table := eacl.NewTable()
    61  	for _, record := range records {
    62  		table.AddRecord(&record)
    63  	}
    64  
    65  	require.Equal(t, records, table.Records())
    66  }
    67  
    68  func TestTableEncoding(t *testing.T) {
    69  	tab := eacltest.Table()
    70  
    71  	t.Run("binary", func(t *testing.T) {
    72  		data, err := tab.Marshal()
    73  		require.NoError(t, err)
    74  
    75  		tab2 := eacl.NewTable()
    76  		require.NoError(t, tab2.Unmarshal(data))
    77  
    78  		// FIXME: we compare v2 messages because
    79  		//  Filter contains fmt.Stringer interface
    80  		require.Equal(t, tab.ToV2(), tab2.ToV2())
    81  	})
    82  
    83  	t.Run("json", func(t *testing.T) {
    84  		data, err := tab.MarshalJSON()
    85  		require.NoError(t, err)
    86  
    87  		tab2 := eacl.NewTable()
    88  		require.NoError(t, tab2.UnmarshalJSON(data))
    89  
    90  		require.Equal(t, tab.ToV2(), tab2.ToV2())
    91  	})
    92  }
    93  
    94  func TestTable_ToV2(t *testing.T) {
    95  	t.Run("nil", func(t *testing.T) {
    96  		var x *eacl.Table
    97  
    98  		require.Nil(t, x.ToV2())
    99  	})
   100  
   101  	t.Run("default values", func(t *testing.T) {
   102  		table := eacl.NewTable()
   103  
   104  		// check initial values
   105  		require.Equal(t, version.Current(), table.Version())
   106  		require.Nil(t, table.Records())
   107  		_, set := table.CID()
   108  		require.False(t, set)
   109  
   110  		// convert to v2 message
   111  		tableV2 := table.ToV2()
   112  
   113  		var verV2 refs.Version
   114  		version.Current().WriteToV2(&verV2)
   115  		require.Equal(t, verV2, *tableV2.GetVersion())
   116  		require.Nil(t, tableV2.GetRecords())
   117  		require.Nil(t, tableV2.GetContainerID())
   118  	})
   119  }