github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/store/db/leveldb_store_test.go (about)

     1  /*
     2   * Copyright (C) 2018 The ontology Authors
     3   * This file is part of The ontology library.
     4   *
     5   * The ontology is free software: you can redistribute it and/or modify
     6   * it under the terms of the GNU Lesser General Public License as published by
     7   * the Free Software Foundation, either version 3 of the License, or
     8   * (at your option) any later version.
     9   *
    10   * The ontology is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU Lesser General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU Lesser General Public License
    16   * along with The ontology.  If not, see <http://www.gnu.org/licenses/>.
    17   */
    18  package db
    19  
    20  import (
    21  	"fmt"
    22  	"os"
    23  	"testing"
    24  
    25  	"bytes"
    26  
    27  	"github.com/syndtr/goleveldb/leveldb/util"
    28  )
    29  
    30  var testLevelDB *LevelDBStore
    31  
    32  func TestMain(m *testing.M) {
    33  	dbFile := "./test"
    34  	var err error
    35  	testLevelDB, err = NewLevelDBStore(dbFile)
    36  	if err != nil {
    37  		fmt.Printf("NewLevelDBStore error:%s\n", err)
    38  		return
    39  	}
    40  	m.Run()
    41  	testLevelDB.Close()
    42  	os.RemoveAll(dbFile)
    43  	os.RemoveAll("ActorLog")
    44  }
    45  
    46  func TestLevelDB(t *testing.T) {
    47  	key := "foo"
    48  	value := "bar"
    49  	err := testLevelDB.Put([]byte(key), []byte(value))
    50  	if err != nil {
    51  		t.Errorf("Put error:%s", err)
    52  		return
    53  	}
    54  	v, err := testLevelDB.Get([]byte(key))
    55  	if err != nil {
    56  		t.Errorf("Get error:%s", err)
    57  		return
    58  	}
    59  	if string(v) != value {
    60  		t.Errorf("Get error %s != %s", v, value)
    61  		return
    62  	}
    63  	err = testLevelDB.Delete([]byte(key))
    64  	if err != nil {
    65  		t.Errorf("Delete error:%s", err)
    66  		return
    67  	}
    68  	ok, err := testLevelDB.Has([]byte(key))
    69  	if err != nil {
    70  		t.Errorf("Has error:%s", err)
    71  		return
    72  	}
    73  	if ok {
    74  		t.Errorf("Key:%s shoule delete", key)
    75  		return
    76  	}
    77  }
    78  
    79  func TestBatch(t *testing.T) {
    80  	testLevelDB.NewBatch()
    81  
    82  	key1 := "foo1"
    83  	value1 := "bar1"
    84  	testLevelDB.BatchPut([]byte(key1), []byte(value1))
    85  
    86  	key2 := "foo2"
    87  	value2 := "bar2"
    88  	testLevelDB.BatchPut([]byte(key2), []byte(value2))
    89  
    90  	err := testLevelDB.BatchCommit()
    91  	if err != nil {
    92  		t.Errorf("BatchCommit error:%s", err)
    93  		return
    94  	}
    95  
    96  	v1, err := testLevelDB.Get([]byte(key1))
    97  	if err != nil {
    98  		t.Errorf("Get error:%s", err)
    99  		return
   100  	}
   101  	if string(v1) != value1 {
   102  		t.Errorf("Get %s != %s", v1, value1)
   103  		return
   104  	}
   105  }
   106  
   107  func TestIterator(t *testing.T) {
   108  	kvMap := make(map[string]string)
   109  	kvMap["foo0001"] = "bar0001"
   110  	kvMap["foo0002"] = "bar0002"
   111  	kvMap["foo0005"] = "bar0005"
   112  	kvMap["foo0101"] = "bar0101"
   113  	kvMap["foo1001"] = "bar1001"
   114  	kvMap["foo0021"] = "bar0021"
   115  	testLevelDB.NewBatch()
   116  	for k, v := range kvMap {
   117  		testLevelDB.BatchPut([]byte(k), []byte(v))
   118  	}
   119  	err := testLevelDB.BatchCommit()
   120  	if err != nil {
   121  		t.Errorf("BatchCommit error:%s", err)
   122  		return
   123  	}
   124  	kvs := make(map[string]string)
   125  
   126  	fmt.Println("--------------------iter1----------------------------")
   127  	iter := testLevelDB.NewIterator([]byte("fo"))
   128  	for iter.Next() {
   129  		key := iter.Key()
   130  		value := iter.Value()
   131  		kvs[string(key)] = string(value)
   132  		fmt.Printf("Key:%s Value:%s\n", key, value)
   133  	}
   134  	iter.Release()
   135  
   136  	fmt.Println("--------------------iter2----------------------------")
   137  	iter2 := testLevelDB.NewSeniorIterator(&util.Range{Start: []byte("foo0002"), Limit: []byte("foo0010")})
   138  	for iter2.Next() {
   139  		key := iter2.Key()
   140  		value := iter2.Value()
   141  		fmt.Printf("Key:%s Value:%s\n", key, value)
   142  	}
   143  	/*	iter2.Prev()
   144  		iter2.Prev()
   145  		fmt.Printf("Key:%s Value:%s\n", iter2.Key(), iter2.Value())*/
   146  	iter2.Release()
   147  
   148  	fmt.Println("--------------------iter3----------------------------")
   149  	iter3 := testLevelDB.NewSeniorIterator(util.BytesPrefix([]byte("foo0001")))
   150  	for iter3.Next() {
   151  		fmt.Printf("Key:%s Value:%s\n", iter3.Key(), iter3.Value())
   152  	}
   153  
   154  	iter3.Release()
   155  	fmt.Println("--------------------iter4----------------------------")
   156  	iter4 := testLevelDB.NewSeniorIterator(nil)
   157  	/*	for ok := iter4.Seek([]byte("foo1001")); ok; ok = iter4.Prev() {
   158  		fmt.Printf("查找数据:%s, value:%s\n", iter4.Key(), iter4.Value())
   159  	}*/
   160  	flag := true
   161  	if iter4.Seek([]byte("foo0011")) {
   162  		cmp := bytes.Compare(iter4.Key(), []byte("foo0003"))
   163  		if cmp == 0 {
   164  			fmt.Printf("查找数据1:%s, value:%s\n", iter4.Key(), iter4.Value())
   165  			flag = false
   166  		}
   167  	}
   168  	if flag && iter4.Prev() {
   169  		fmt.Printf("查找数据2:%s, value:%s\n", iter4.Key(), iter4.Value())
   170  	}
   171  	iter4.Release()
   172  }
   173  
   174  func BenchmarkIterator(b *testing.B) {
   175  	kvMap := make(map[string]string)
   176  	kvMap["foo0001"] = "bar0001"
   177  	kvMap["foo0002"] = "bar0002"
   178  	kvMap["foo0005"] = "bar0005"
   179  	kvMap["foo0101"] = "bar0101"
   180  	kvMap["foo1001"] = "bar1001"
   181  	kvMap["foo0021"] = "bar0021"
   182  	testLevelDB.NewBatch()
   183  	for k, v := range kvMap {
   184  		testLevelDB.BatchPut([]byte(k), []byte(v))
   185  	}
   186  	err := testLevelDB.BatchCommit()
   187  	if err != nil {
   188  		b.Errorf("BatchCommit error:%s", err)
   189  		return
   190  	}
   191  	b.ReportAllocs()
   192  	for i := 0; i < b.N; i++ { //use b.N for looping
   193  		iter4 := testLevelDB.NewSeniorIterator(nil)
   194  		/*	for ok := iter4.Seek([]byte("foo1001")); ok; ok = iter4.Prev() {
   195  			fmt.Printf("Find data:%s, value:%s\n", iter4.Key(), iter4.Value())
   196  		}*/
   197  		flag := true
   198  		if iter4.Seek([]byte("foo0011")) {
   199  			cmp := bytes.Compare(iter4.Key(), []byte("foo0003"))
   200  			if cmp == 0 {
   201  				//fmt.Printf("Find data1:%s, value:%s\n", iter4.Key(), iter4.Value())
   202  				flag = false
   203  			}
   204  		}
   205  		if flag && iter4.Prev() {
   206  			//fmt.Printf("Find data2:%s, value:%s\n", iter4.Key(), iter4.Value())
   207  		}
   208  		iter4.Release()
   209  
   210  	}
   211  }