github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/common/ledger/util/leveldbhelper/leveldb_provider_test.go (about) 1 /* 2 Copyright IBM Corp. 2017 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package leveldbhelper 18 19 import ( 20 "fmt" 21 "testing" 22 23 "github.com/hyperledger/fabric/common/ledger/testutil" 24 ) 25 26 func TestDBBasicWriteAndReads(t *testing.T) { 27 testDBBasicWriteAndReads(t, "db1", "db2", "") 28 } 29 30 func TestIterator(t *testing.T) { 31 env := newTestProviderEnv(t, testDBPath) 32 defer env.cleanup() 33 p := env.provider 34 35 db1 := p.GetDBHandle("db1") 36 db2 := p.GetDBHandle("db2") 37 db3 := p.GetDBHandle("db3") 38 for i := 0; i < 20; i++ { 39 db1.Put([]byte(createTestKey(i)), []byte(createTestValue("db1", i)), false) 40 db2.Put([]byte(createTestKey(i)), []byte(createTestValue("db2", i)), false) 41 db3.Put([]byte(createTestKey(i)), []byte(createTestValue("db3", i)), false) 42 } 43 44 itr1 := db2.GetIterator([]byte(createTestKey(2)), []byte(createTestKey(4))) 45 defer itr1.Release() 46 checkItrResults(t, itr1, createTestKeys(2, 3), createTestValues("db2", 2, 3)) 47 48 itr2 := db2.GetIterator([]byte(createTestKey(2)), nil) 49 defer itr2.Release() 50 checkItrResults(t, itr2, createTestKeys(2, 19), createTestValues("db2", 2, 19)) 51 52 itr3 := db2.GetIterator(nil, nil) 53 defer itr3.Release() 54 checkItrResults(t, itr3, createTestKeys(0, 19), createTestValues("db2", 0, 19)) 55 } 56 57 func TestBatchedUpdates(t *testing.T) { 58 env := newTestProviderEnv(t, testDBPath) 59 defer env.cleanup() 60 p := env.provider 61 62 db1 := p.GetDBHandle("db1") 63 db2 := p.GetDBHandle("db2") 64 65 dbs := []*DBHandle{db1, db2} 66 for _, db := range dbs { 67 batch := NewUpdateBatch() 68 batch.Put([]byte("key1"), []byte("value1")) 69 batch.Put([]byte("key2"), []byte("value2")) 70 batch.Put([]byte("key3"), []byte("value3")) 71 db.WriteBatch(batch, true) 72 } 73 74 for _, db := range dbs { 75 batch := NewUpdateBatch() 76 batch.Delete([]byte("key2")) 77 db.WriteBatch(batch, true) 78 } 79 80 for _, db := range dbs { 81 val1, _ := db.Get([]byte("key1")) 82 testutil.AssertEquals(t, string(val1), "value1") 83 84 val2, err2 := db.Get([]byte("key2")) 85 testutil.AssertNoError(t, err2, "") 86 testutil.AssertNil(t, val2) 87 88 val3, _ := db.Get([]byte("key3")) 89 testutil.AssertEquals(t, string(val3), "value3") 90 } 91 } 92 93 func testDBBasicWriteAndReads(t *testing.T, dbNames ...string) { 94 env := newTestProviderEnv(t, testDBPath) 95 defer env.cleanup() 96 p := env.provider 97 98 for _, dbName := range dbNames { 99 db := p.GetDBHandle(dbName) 100 db.Put([]byte("key1"), []byte("value1_"+dbName), false) 101 db.Put([]byte("key2"), []byte("value2_"+dbName), false) 102 db.Put([]byte("key3"), []byte("value3_"+dbName), false) 103 } 104 105 for _, dbName := range dbNames { 106 db := p.GetDBHandle(dbName) 107 val, err := db.Get([]byte("key1")) 108 testutil.AssertNoError(t, err, "") 109 testutil.AssertEquals(t, val, []byte("value1_"+dbName)) 110 111 val, err = db.Get([]byte("key2")) 112 testutil.AssertNoError(t, err, "") 113 testutil.AssertEquals(t, val, []byte("value2_"+dbName)) 114 115 val, err = db.Get([]byte("key3")) 116 testutil.AssertNoError(t, err, "") 117 testutil.AssertEquals(t, val, []byte("value3_"+dbName)) 118 } 119 120 for _, dbName := range dbNames { 121 db := p.GetDBHandle(dbName) 122 testutil.AssertNoError(t, db.Delete([]byte("key1"), false), "") 123 val, err := db.Get([]byte("key1")) 124 testutil.AssertNoError(t, err, "") 125 testutil.AssertNil(t, val) 126 127 testutil.AssertNoError(t, db.Delete([]byte("key2"), false), "") 128 val, err = db.Get([]byte("key2")) 129 testutil.AssertNoError(t, err, "") 130 testutil.AssertNil(t, val) 131 132 testutil.AssertNoError(t, db.Delete([]byte("key3"), false), "") 133 val, err = db.Get([]byte("key3")) 134 testutil.AssertNoError(t, err, "") 135 testutil.AssertNil(t, val) 136 } 137 } 138 139 func checkItrResults(t *testing.T, itr *Iterator, expectedKeys []string, expectedValues []string) { 140 defer itr.Release() 141 var actualKeys []string 142 var actualValues []string 143 for itr.Next(); itr.Valid(); itr.Next() { 144 actualKeys = append(actualKeys, string(itr.Key())) 145 actualValues = append(actualValues, string(itr.Value())) 146 } 147 testutil.AssertEquals(t, actualKeys, expectedKeys) 148 testutil.AssertEquals(t, actualValues, expectedValues) 149 testutil.AssertEquals(t, itr.Next(), false) 150 } 151 152 func createTestKey(i int) string { 153 return fmt.Sprintf("key_%06d", i) 154 } 155 156 func createTestValue(dbname string, i int) string { 157 return fmt.Sprintf("value_%s_%06d", dbname, i) 158 } 159 160 func createTestKeys(start int, end int) []string { 161 var keys []string 162 for i := start; i <= end; i++ { 163 keys = append(keys, createTestKey(i)) 164 } 165 return keys 166 } 167 168 func createTestValues(dbname string, start int, end int) []string { 169 var values []string 170 for i := start; i <= end; i++ { 171 values = append(values, createTestValue(dbname, i)) 172 } 173 return values 174 }