@@ -17,111 +17,123 @@ limitations under the License.
17
17
package leveldbhelper
18
18
19
19
import (
20
- "fmt"
21
20
"os"
21
+ "path/filepath"
22
22
"testing"
23
23
24
24
"github.com/hyperledger/fabric/common/ledger/testutil"
25
+ "github.com/syndtr/goleveldb/leveldb"
25
26
)
26
27
27
- const testDBPath = "/tmp/fabric/ledgertests/util/leveldbhelper"
28
-
29
- func TestDBBasicWriteAndReads (t * testing.T ) {
30
- testDBBasicWriteAndReads (t , "db1" , "db2" , "" )
28
+ func TestLevelDBHelperWriteWithoutOpen (t * testing.T ) {
29
+ env := newTestDBEnv (t , testDBPath )
30
+ defer env .cleanup ()
31
+ db := env .db
32
+ defer func () {
33
+ if recover () == nil {
34
+ t .Fatalf ("A panic is expected when writing to db before opening" )
35
+ }
36
+ }()
37
+ db .Put ([]byte ("key" ), []byte ("value" ), false )
31
38
}
32
39
33
- func testDBBasicWriteAndReads (t * testing.T , dbNames ... string ) {
34
- p := createTestDBProvider (t )
35
- defer p .Close ()
36
- for _ , dbName := range dbNames {
37
- db := p .GetDBHandle (dbName )
38
- db .Put ([]byte ("key1" ), []byte ("value1_" + dbName ), false )
39
- db .Put ([]byte ("key2" ), []byte ("value2_" + dbName ), false )
40
- db .Put ([]byte ("key3" ), []byte ("value3_" + dbName ), false )
41
- }
42
-
43
- for _ , dbName := range dbNames {
44
- db := p .GetDBHandle (dbName )
45
- val , err := db .Get ([]byte ("key1" ))
46
- testutil .AssertNoError (t , err , "" )
47
- testutil .AssertEquals (t , val , []byte ("value1_" + dbName ))
48
-
49
- val , err = db .Get ([]byte ("key2" ))
50
- testutil .AssertNoError (t , err , "" )
51
- testutil .AssertEquals (t , val , []byte ("value2_" + dbName ))
52
-
53
- val , err = db .Get ([]byte ("key3" ))
54
- testutil .AssertNoError (t , err , "" )
55
- testutil .AssertEquals (t , val , []byte ("value3_" + dbName ))
56
- }
40
+ func TestLevelDBHelperReadWithoutOpen (t * testing.T ) {
41
+ env := newTestDBEnv (t , testDBPath )
42
+ defer env .cleanup ()
43
+ db := env .db
44
+ defer func () {
45
+ if recover () == nil {
46
+ t .Fatalf ("A panic is expected when writing to db before opening" )
47
+ }
48
+ }()
49
+ db .Get ([]byte ("key" ))
57
50
}
58
51
59
- func TestIterator (t * testing.T ) {
60
- p := createTestDBProvider (t )
61
- defer p .Close ()
62
- db1 := p .GetDBHandle ("db1" )
63
- db2 := p .GetDBHandle ("db2" )
64
- db3 := p .GetDBHandle ("db3" )
65
- for i := 0 ; i < 20 ; i ++ {
66
- db1 .Put ([]byte (createTestKey (i )), []byte (createTestValue ("db1" , i )), false )
67
- db2 .Put ([]byte (createTestKey (i )), []byte (createTestValue ("db2" , i )), false )
68
- db3 .Put ([]byte (createTestKey (i )), []byte (createTestValue ("db3" , i )), false )
52
+ func TestLevelDBHelper (t * testing.T ) {
53
+ env := newTestDBEnv (t , testDBPath )
54
+ //defer env.cleanup()
55
+ db := env .db
56
+
57
+ db .Open ()
58
+ // second time open should not have any side effect
59
+ db .Open ()
60
+ db .Put ([]byte ("key1" ), []byte ("value1" ), false )
61
+ db .Put ([]byte ("key2" ), []byte ("value2" ), true )
62
+ db .Put ([]byte ("key3" ), []byte ("value3" ), true )
63
+
64
+ val , _ := db .Get ([]byte ("key2" ))
65
+ testutil .AssertEquals (t , string (val ), "value2" )
66
+
67
+ db .Delete ([]byte ("key1" ), false )
68
+ db .Delete ([]byte ("key2" ), true )
69
+
70
+ val1 , err1 := db .Get ([]byte ("key1" ))
71
+ testutil .AssertNoError (t , err1 , "" )
72
+ testutil .AssertEquals (t , string (val1 ), "" )
73
+
74
+ val2 , err2 := db .Get ([]byte ("key2" ))
75
+ testutil .AssertNoError (t , err2 , "" )
76
+ testutil .AssertEquals (t , string (val2 ), "" )
77
+
78
+ db .Close ()
79
+ // second time open should not have any side effect
80
+ db .Close ()
81
+
82
+ val3 , err3 := db .Get ([]byte ("key3" ))
83
+ testutil .AssertError (t , err3 , "" )
84
+
85
+ db .Open ()
86
+ batch := & leveldb.Batch {}
87
+ batch .Put ([]byte ("key1" ), []byte ("value1" ))
88
+ batch .Put ([]byte ("key2" ), []byte ("value2" ))
89
+ batch .Delete ([]byte ("key3" ))
90
+ db .WriteBatch (batch , true )
91
+
92
+ val1 , err1 = db .Get ([]byte ("key1" ))
93
+ testutil .AssertNoError (t , err1 , "" )
94
+ testutil .AssertEquals (t , string (val1 ), "value1" )
95
+
96
+ val2 , err2 = db .Get ([]byte ("key2" ))
97
+ testutil .AssertNoError (t , err2 , "" )
98
+ testutil .AssertEquals (t , string (val2 ), "value2" )
99
+
100
+ val3 , err3 = db .Get ([]byte ("key3" ))
101
+ testutil .AssertNoError (t , err3 , "" )
102
+ testutil .AssertEquals (t , string (val3 ), "" )
103
+
104
+ keys := []string {}
105
+ itr := db .GetIterator (nil , nil )
106
+ for itr .Next () {
107
+ keys = append (keys , string (itr .Key ()))
69
108
}
70
-
71
- itr1 := db2 .GetIterator ([]byte (createTestKey (2 )), []byte (createTestKey (4 )))
72
- defer itr1 .Release ()
73
- checkItrResults (t , itr1 , createTestKeys (2 , 3 ), createTestValues ("db2" , 2 , 3 ))
74
-
75
- itr2 := db2 .GetIterator ([]byte (createTestKey (2 )), nil )
76
- defer itr2 .Release ()
77
- checkItrResults (t , itr2 , createTestKeys (2 , 19 ), createTestValues ("db2" , 2 , 19 ))
78
-
79
- itr3 := db2 .GetIterator (nil , nil )
80
- defer itr3 .Release ()
81
- checkItrResults (t , itr3 , createTestKeys (0 , 19 ), createTestValues ("db2" , 0 , 19 ))
109
+ testutil .AssertEquals (t , keys , []string {"key1" , "key2" })
82
110
}
83
111
84
- func checkItrResults (t * testing.T , itr * Iterator , expectedKeys [] string , expectedValues [] string ) {
85
- defer itr . Release ( )
86
- var actualKeys [] string
87
- var actualValues [] string
88
- for itr . Next (); itr . Valid (); itr . Next () {
89
- actualKeys = append ( actualKeys , string ( itr . Key ()))
90
- actualValues = append ( actualValues , string ( itr . Value ()))
91
- }
92
- testutil . AssertEquals ( t , actualKeys , expectedKeys )
93
- testutil . AssertEquals ( t , actualValues , expectedValues )
94
- testutil . AssertEquals ( t , itr . Next (), false )
112
+ func TestCreateDBInEmptyDir (t * testing.T ) {
113
+ testutil . AssertNoError ( t , os . RemoveAll ( testDBPath ), "" )
114
+ testutil . AssertNoError ( t , os . MkdirAll ( testDBPath , 0775 ), "" )
115
+ db := CreateDB ( & Conf { testDBPath })
116
+ defer db . Close ()
117
+ defer func () {
118
+ if r := recover (); r != nil {
119
+ t . Fatalf ( "Panic is not expected when opening db in an existing empty dir. %s" , r )
120
+ }
121
+ }( )
122
+ db . Open ( )
95
123
}
96
124
97
- func createTestKey (i int ) string {
98
- return fmt .Sprintf ("key_%06d" , i )
99
- }
100
-
101
- func createTestValue (dbname string , i int ) string {
102
- return fmt .Sprintf ("value_%s_%06d" , dbname , i )
103
- }
104
-
105
- func createTestKeys (start int , end int ) []string {
106
- var keys []string
107
- for i := start ; i <= end ; i ++ {
108
- keys = append (keys , createTestKey (i ))
109
- }
110
- return keys
111
- }
112
-
113
- func createTestValues (dbname string , start int , end int ) []string {
114
- var values []string
115
- for i := start ; i <= end ; i ++ {
116
- values = append (values , createTestValue (dbname , i ))
117
- }
118
- return values
119
- }
120
-
121
- func createTestDBProvider (t * testing.T ) * Provider {
122
- if err := os .RemoveAll (testDBPath ); err != nil {
123
- t .Fatalf ("Error:%s" , err )
124
- }
125
- dbConf := & Conf {testDBPath }
126
- return NewProvider (dbConf )
125
+ func TestCreateDBInNonEmptyDir (t * testing.T ) {
126
+ testutil .AssertNoError (t , os .RemoveAll (testDBPath ), "" )
127
+ testutil .AssertNoError (t , os .MkdirAll (testDBPath , 0775 ), "" )
128
+ file , err := os .Create (filepath .Join (testDBPath , "dummyfile.txt" ))
129
+ testutil .AssertNoError (t , err , "" )
130
+ file .Close ()
131
+ db := CreateDB (& Conf {testDBPath })
132
+ defer db .Close ()
133
+ defer func () {
134
+ if r := recover (); r == nil {
135
+ t .Fatalf ("A panic is expected when opening db in an existing non-empty dir. %s" , r )
136
+ }
137
+ }()
138
+ db .Open ()
127
139
}
0 commit comments