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 }