github.com/inklabsfoundation/inkchain@v0.17.1-0.20181025012015-c3cef8062f19/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/inklabsfoundation/inkchain/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  }