github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/internal/structure/structure_test.go (about)

     1  // Copyright 2022 zGraph Authors. All rights reserved.
     2  //
     3  // Copyright 2015 PingCAP, Inc.
     4  //
     5  // Licensed under the Apache License, Version 2.0 (the "License");
     6  // you may not use this file except in compliance with the License.
     7  // You may obtain a copy of the License at
     8  //
     9  //     http://www.apache.org/licenses/LICENSE-2.0
    10  //
    11  // Unless required by applicable law or agreed to in writing, software
    12  // distributed under the License is distributed on an "AS IS" BASIS,
    13  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  // See the License for the specific language governing permissions and
    15  // limitations under the License.
    16  
    17  package structure_test
    18  
    19  import (
    20  	"context"
    21  	"testing"
    22  
    23  	"github.com/stretchr/testify/require"
    24  	"github.com/vescale/zgraph/internal/structure"
    25  	"github.com/vescale/zgraph/storage"
    26  	"github.com/vescale/zgraph/storage/kv"
    27  )
    28  
    29  func TestString(t *testing.T) {
    30  	store, err := storage.Open(t.TempDir())
    31  	require.NoError(t, err)
    32  
    33  	txn, err := store.Begin()
    34  	require.NoError(t, err)
    35  
    36  	tx := structure.NewStructure(txn, txn, []byte{0x00})
    37  
    38  	key := []byte("a")
    39  	value := []byte("1")
    40  	err = tx.Set(key, value)
    41  	require.NoError(t, err)
    42  
    43  	v, err := tx.Get(key)
    44  	require.NoError(t, err)
    45  	require.Equal(t, value, v)
    46  
    47  	n, err := tx.Inc(key, 1)
    48  	require.NoError(t, err)
    49  	require.Equal(t, int64(2), n)
    50  
    51  	v, err = tx.Get(key)
    52  	require.NoError(t, err)
    53  	require.Equal(t, []byte("2"), v)
    54  
    55  	n, err = tx.GetInt64(key)
    56  	require.NoError(t, err)
    57  	require.Equal(t, int64(2), n)
    58  
    59  	err = tx.Clear(key)
    60  	require.NoError(t, err)
    61  
    62  	v, err = tx.Get(key)
    63  	require.NoError(t, err)
    64  	require.Nil(t, v)
    65  
    66  	tx1 := structure.NewStructure(txn, nil, []byte{0x01})
    67  	err = tx1.Set(key, value)
    68  	require.NotNil(t, err)
    69  
    70  	_, err = tx1.Inc(key, 1)
    71  	require.NotNil(t, err)
    72  
    73  	err = tx1.Clear(key)
    74  	require.NotNil(t, err)
    75  
    76  	err = txn.Commit(context.Background())
    77  	require.NoError(t, err)
    78  }
    79  
    80  func TestList(t *testing.T) {
    81  	store, err := storage.Open(t.TempDir())
    82  	require.NoError(t, err)
    83  
    84  	txn, err := store.Begin()
    85  	require.NoError(t, err)
    86  
    87  	tx := structure.NewStructure(txn, txn, []byte{0x00})
    88  
    89  	key := []byte("a")
    90  	err = tx.LPush(key, []byte("3"), []byte("2"), []byte("1"))
    91  	require.NoError(t, err)
    92  
    93  	// Test LGetAll.
    94  	err = tx.LPush(key, []byte("11"))
    95  	require.NoError(t, err)
    96  	values, err := tx.LGetAll(key)
    97  	require.NoError(t, err)
    98  	require.Equal(t, [][]byte{[]byte("3"), []byte("2"), []byte("1"), []byte("11")}, values)
    99  	value, err := tx.LPop(key)
   100  	require.NoError(t, err)
   101  	require.Equal(t, []byte("11"), value)
   102  
   103  	l, err := tx.LLen(key)
   104  	require.NoError(t, err)
   105  	require.Equal(t, int64(3), l)
   106  
   107  	value, err = tx.LIndex(key, 1)
   108  	require.NoError(t, err)
   109  	require.Equal(t, []byte("2"), value)
   110  
   111  	err = tx.LSet(key, 1, []byte("4"))
   112  	require.NoError(t, err)
   113  
   114  	value, err = tx.LIndex(key, 1)
   115  	require.NoError(t, err)
   116  	require.Equal(t, []byte("4"), value)
   117  
   118  	err = tx.LSet(key, 1, []byte("2"))
   119  	require.NoError(t, err)
   120  
   121  	err = tx.LSet(key, 100, []byte("2"))
   122  	require.NotNil(t, err)
   123  
   124  	value, err = tx.LIndex(key, -1)
   125  	require.NoError(t, err)
   126  	require.Equal(t, []byte("3"), value)
   127  
   128  	value, err = tx.LPop(key)
   129  	require.NoError(t, err)
   130  	require.Equal(t, []byte("1"), value)
   131  
   132  	l, err = tx.LLen(key)
   133  	require.NoError(t, err)
   134  	require.Equal(t, int64(2), l)
   135  
   136  	err = tx.RPush(key, []byte("4"))
   137  	require.NoError(t, err)
   138  
   139  	l, err = tx.LLen(key)
   140  	require.NoError(t, err)
   141  	require.Equal(t, int64(3), l)
   142  
   143  	value, err = tx.LIndex(key, -1)
   144  	require.NoError(t, err)
   145  	require.Equal(t, []byte("4"), value)
   146  
   147  	value, err = tx.RPop(key)
   148  	require.NoError(t, err)
   149  	require.Equal(t, []byte("4"), value)
   150  
   151  	value, err = tx.RPop(key)
   152  	require.NoError(t, err)
   153  	require.Equal(t, []byte("3"), value)
   154  
   155  	value, err = tx.RPop(key)
   156  	require.NoError(t, err)
   157  	require.Equal(t, []byte("2"), value)
   158  
   159  	l, err = tx.LLen(key)
   160  	require.NoError(t, err)
   161  	require.Equal(t, int64(0), l)
   162  
   163  	err = tx.LPush(key, []byte("1"))
   164  	require.NoError(t, err)
   165  
   166  	err = tx.LClear(key)
   167  	require.NoError(t, err)
   168  
   169  	l, err = tx.LLen(key)
   170  	require.NoError(t, err)
   171  	require.Equal(t, int64(0), l)
   172  
   173  	tx1 := structure.NewStructure(txn, nil, []byte{0x01})
   174  	err = tx1.LPush(key, []byte("1"))
   175  	require.NotNil(t, err)
   176  	require.NotNil(t, err)
   177  
   178  	_, err = tx1.RPop(key)
   179  	require.NotNil(t, err)
   180  
   181  	err = tx1.LSet(key, 1, []byte("2"))
   182  	require.NotNil(t, err)
   183  
   184  	err = tx1.LClear(key)
   185  	require.NotNil(t, err)
   186  
   187  	err = txn.Commit(context.Background())
   188  	require.NoError(t, err)
   189  }
   190  
   191  func TestHash(t *testing.T) {
   192  	store, err := storage.Open(t.TempDir())
   193  	require.NoError(t, err)
   194  
   195  	txn, err := store.Begin()
   196  	require.NoError(t, err)
   197  
   198  	tx := structure.NewStructure(txn, txn, []byte{0x00})
   199  
   200  	key := []byte("a")
   201  
   202  	tx.EncodeHashAutoIDKeyValue(key, key, 5)
   203  
   204  	err = tx.HSet(key, []byte("1"), []byte("1"))
   205  	require.NoError(t, err)
   206  
   207  	err = tx.HSet(key, []byte("2"), []byte("2"))
   208  	require.NoError(t, err)
   209  
   210  	value, err := tx.HGet(key, []byte("1"))
   211  	require.NoError(t, err)
   212  	require.Equal(t, []byte("1"), value)
   213  
   214  	value, err = tx.HGet(key, []byte("fake"))
   215  	require.NoError(t, err)
   216  	require.Nil(t, value)
   217  
   218  	keys, err := tx.HKeys(key)
   219  	require.NoError(t, err)
   220  	require.Equal(t, [][]byte{[]byte("1"), []byte("2")}, keys)
   221  
   222  	res, err := tx.HGetAll(key)
   223  	require.NoError(t, err)
   224  	require.Equal(t, []structure.HashPair{
   225  		{Field: []byte("1"), Value: []byte("1")},
   226  		{Field: []byte("2"), Value: []byte("2")}}, res)
   227  
   228  	res, err = tx.HGetLastN(key, 1)
   229  	require.NoError(t, err)
   230  	require.Equal(t, []structure.HashPair{
   231  		{Field: []byte("2"), Value: []byte("2")}}, res)
   232  
   233  	res, err = tx.HGetLastN(key, 2)
   234  	require.NoError(t, err)
   235  	require.Equal(t, []structure.HashPair{
   236  		{Field: []byte("2"), Value: []byte("2")},
   237  		{Field: []byte("1"), Value: []byte("1")}}, res)
   238  
   239  	err = tx.HDel(key, []byte("1"))
   240  	require.NoError(t, err)
   241  
   242  	value, err = tx.HGet(key, []byte("1"))
   243  	require.NoError(t, err)
   244  	require.Nil(t, value)
   245  
   246  	n, err := tx.HInc(key, []byte("1"), 1)
   247  	require.NoError(t, err)
   248  	require.Equal(t, int64(1), n)
   249  
   250  	// Test set new value which equals to old value.
   251  	value, err = tx.HGet(key, []byte("1"))
   252  	require.NoError(t, err)
   253  	require.Equal(t, []byte("1"), value)
   254  
   255  	err = tx.HSet(key, []byte("1"), []byte("1"))
   256  	require.NoError(t, err)
   257  
   258  	value, err = tx.HGet(key, []byte("1"))
   259  	require.NoError(t, err)
   260  	require.Equal(t, []byte("1"), value)
   261  
   262  	n, err = tx.HInc(key, []byte("1"), 1)
   263  	require.NoError(t, err)
   264  	require.Equal(t, int64(2), n)
   265  
   266  	n, err = tx.HInc(key, []byte("1"), 1)
   267  	require.NoError(t, err)
   268  	require.Equal(t, int64(3), n)
   269  
   270  	n, err = tx.HGetInt64(key, []byte("1"))
   271  	require.NoError(t, err)
   272  	require.Equal(t, int64(3), n)
   273  
   274  	err = tx.HClear(key)
   275  	require.NoError(t, err)
   276  
   277  	err = tx.HDel(key, []byte("fake_key"))
   278  	require.NoError(t, err)
   279  
   280  	// Test set nil value.
   281  	value, err = tx.HGet(key, []byte("nil_key"))
   282  	require.NoError(t, err)
   283  	require.Nil(t, value)
   284  
   285  	err = tx.HSet(key, []byte("nil_key"), nil)
   286  	require.NoError(t, err)
   287  
   288  	err = tx.HSet(key, []byte("nil_key"), []byte("1"))
   289  	require.NoError(t, err)
   290  
   291  	value, err = tx.HGet(key, []byte("nil_key"))
   292  	require.NoError(t, err)
   293  	require.Equal(t, []byte("1"), value)
   294  
   295  	err = tx.HSet(key, []byte("nil_key"), nil)
   296  	require.NotNil(t, err)
   297  
   298  	value, err = tx.HGet(key, []byte("nil_key"))
   299  	require.NoError(t, err)
   300  	require.Equal(t, []byte("1"), value)
   301  
   302  	err = tx.HSet(key, []byte("nil_key"), []byte("2"))
   303  	require.NoError(t, err)
   304  
   305  	value, err = tx.HGet(key, []byte("nil_key"))
   306  	require.NoError(t, err)
   307  	require.Equal(t, []byte("2"), value)
   308  
   309  	tx1 := structure.NewStructure(txn, nil, []byte{0x01})
   310  	_, err = tx1.HInc(key, []byte("1"), 1)
   311  	require.NotNil(t, err)
   312  
   313  	err = tx1.HDel(key, []byte("1"))
   314  	require.NotNil(t, err)
   315  
   316  	err = txn.Commit(context.Background())
   317  	require.NoError(t, err)
   318  
   319  	ctx := context.Background()
   320  	err = kv.TxnContext(ctx, store, func(ctx context.Context, txn kv.Transaction) error {
   321  		newTxn := structure.NewStructure(txn, txn, []byte{0x00})
   322  		err = newTxn.Set(key, []byte("abc"))
   323  		require.NoError(t, err)
   324  
   325  		value, err = newTxn.Get(key)
   326  		require.NoError(t, err)
   327  		require.Equal(t, []byte("abc"), value)
   328  		return nil
   329  	})
   330  	require.NoError(t, err)
   331  }