github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/ethdb/database_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2014 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package ethdb_test
    26  
    27  import (
    28  	"bytes"
    29  	"fmt"
    30  	"io/ioutil"
    31  	"os"
    32  	"strconv"
    33  	"sync"
    34  	"testing"
    35  
    36  	"github.com/ethereum/go-ethereum/ethdb"
    37  )
    38  
    39  func newTestLDB() (*ethdb.LDBDatabase, func()) {
    40  	dirname, err := ioutil.TempDir(os.TempDir(), "ethdb_test_")
    41  	if err != nil {
    42  		panic("failed to create test file: " + err.Error())
    43  	}
    44  	db, err := ethdb.NewLDBDatabase(dirname, 0, 0)
    45  	if err != nil {
    46  		panic("failed to create test database: " + err.Error())
    47  	}
    48  
    49  	return db, func() {
    50  		db.Close()
    51  		os.RemoveAll(dirname)
    52  	}
    53  }
    54  
    55  var test_values = []string{"", "a", "1251", "\x00123\x00"}
    56  
    57  func TestLDB_PutGet(t *testing.T) {
    58  	db, remove := newTestLDB()
    59  	defer remove()
    60  	testPutGet(db, t)
    61  }
    62  
    63  func TestMemoryDB_PutGet(t *testing.T) {
    64  	testPutGet(ethdb.NewMemDatabase(), t)
    65  }
    66  
    67  func testPutGet(db ethdb.Database, t *testing.T) {
    68  	t.Parallel()
    69  
    70  	for _, k := range test_values {
    71  		err := db.Put([]byte(k), nil)
    72  		if err != nil {
    73  			t.Fatalf("put failed: %v", err)
    74  		}
    75  	}
    76  
    77  	for _, k := range test_values {
    78  		data, err := db.Get([]byte(k))
    79  		if err != nil {
    80  			t.Fatalf("get failed: %v", err)
    81  		}
    82  		if len(data) != 0 {
    83  			t.Fatalf("get returned wrong result, got %q expected nil", string(data))
    84  		}
    85  	}
    86  
    87  	_, err := db.Get([]byte("non-exist-key"))
    88  	if err == nil {
    89  		t.Fatalf("expect to return a not found error")
    90  	}
    91  
    92  	for _, v := range test_values {
    93  		err := db.Put([]byte(v), []byte(v))
    94  		if err != nil {
    95  			t.Fatalf("put failed: %v", err)
    96  		}
    97  	}
    98  
    99  	for _, v := range test_values {
   100  		data, err := db.Get([]byte(v))
   101  		if err != nil {
   102  			t.Fatalf("get failed: %v", err)
   103  		}
   104  		if !bytes.Equal(data, []byte(v)) {
   105  			t.Fatalf("get returned wrong result, got %q expected %q", string(data), v)
   106  		}
   107  	}
   108  
   109  	for _, v := range test_values {
   110  		err := db.Put([]byte(v), []byte("?"))
   111  		if err != nil {
   112  			t.Fatalf("put override failed: %v", err)
   113  		}
   114  	}
   115  
   116  	for _, v := range test_values {
   117  		data, err := db.Get([]byte(v))
   118  		if err != nil {
   119  			t.Fatalf("get failed: %v", err)
   120  		}
   121  		if !bytes.Equal(data, []byte("?")) {
   122  			t.Fatalf("get returned wrong result, got %q expected ?", string(data))
   123  		}
   124  	}
   125  
   126  	for _, v := range test_values {
   127  		orig, err := db.Get([]byte(v))
   128  		if err != nil {
   129  			t.Fatalf("get failed: %v", err)
   130  		}
   131  		orig[0] = byte(0xff)
   132  		data, err := db.Get([]byte(v))
   133  		if err != nil {
   134  			t.Fatalf("get failed: %v", err)
   135  		}
   136  		if !bytes.Equal(data, []byte("?")) {
   137  			t.Fatalf("get returned wrong result, got %q expected ?", string(data))
   138  		}
   139  	}
   140  
   141  	for _, v := range test_values {
   142  		err := db.Delete([]byte(v))
   143  		if err != nil {
   144  			t.Fatalf("delete %q failed: %v", v, err)
   145  		}
   146  	}
   147  
   148  	for _, v := range test_values {
   149  		_, err := db.Get([]byte(v))
   150  		if err == nil {
   151  			t.Fatalf("got deleted value %q", v)
   152  		}
   153  	}
   154  }
   155  
   156  func TestLDB_ParallelPutGet(t *testing.T) {
   157  	db, remove := newTestLDB()
   158  	defer remove()
   159  	testParallelPutGet(db, t)
   160  }
   161  
   162  func TestMemoryDB_ParallelPutGet(t *testing.T) {
   163  	testParallelPutGet(ethdb.NewMemDatabase(), t)
   164  }
   165  
   166  func testParallelPutGet(db ethdb.Database, t *testing.T) {
   167  	const n = 8
   168  	var pending sync.WaitGroup
   169  
   170  	pending.Add(n)
   171  	for i := 0; i < n; i++ {
   172  		go func(key string) {
   173  			defer pending.Done()
   174  			err := db.Put([]byte(key), []byte("v"+key))
   175  			if err != nil {
   176  				panic("put failed: " + err.Error())
   177  			}
   178  		}(strconv.Itoa(i))
   179  	}
   180  	pending.Wait()
   181  
   182  	pending.Add(n)
   183  	for i := 0; i < n; i++ {
   184  		go func(key string) {
   185  			defer pending.Done()
   186  			data, err := db.Get([]byte(key))
   187  			if err != nil {
   188  				panic("get failed: " + err.Error())
   189  			}
   190  			if !bytes.Equal(data, []byte("v"+key)) {
   191  				panic(fmt.Sprintf("get failed, got %q expected %q", []byte(data), []byte("v"+key)))
   192  			}
   193  		}(strconv.Itoa(i))
   194  	}
   195  	pending.Wait()
   196  
   197  	pending.Add(n)
   198  	for i := 0; i < n; i++ {
   199  		go func(key string) {
   200  			defer pending.Done()
   201  			err := db.Delete([]byte(key))
   202  			if err != nil {
   203  				panic("delete failed: " + err.Error())
   204  			}
   205  		}(strconv.Itoa(i))
   206  	}
   207  	pending.Wait()
   208  
   209  	pending.Add(n)
   210  	for i := 0; i < n; i++ {
   211  		go func(key string) {
   212  			defer pending.Done()
   213  			_, err := db.Get([]byte(key))
   214  			if err == nil {
   215  				panic("get succeeded")
   216  			}
   217  		}(strconv.Itoa(i))
   218  	}
   219  	pending.Wait()
   220  }