2020-04-18 08:17:59 +00:00
|
|
|
{.used.}
|
|
|
|
|
2019-02-18 04:02:26 +00:00
|
|
|
import
|
2020-04-18 08:17:59 +00:00
|
|
|
unittest,
|
2019-02-18 04:02:26 +00:00
|
|
|
eth/trie/[db, trie_defs], ./testutils,
|
|
|
|
eth/rlp/types as rlpTypes
|
|
|
|
|
|
|
|
suite "transaction db":
|
|
|
|
setup:
|
|
|
|
const
|
|
|
|
listLength = 30
|
|
|
|
|
|
|
|
var
|
|
|
|
keysA = randList(Bytes, randGen(3, 33), randGen(listLength))
|
|
|
|
valuesA = randList(Bytes, randGen(5, 77), randGen(listLength))
|
|
|
|
keysB = randList(Bytes, randGen(3, 33), randGen(listLength))
|
|
|
|
valuesB = randList(Bytes, randGen(5, 77), randGen(listLength))
|
|
|
|
|
|
|
|
proc populateA(db: TrieDatabaseRef) =
|
|
|
|
for i in 0 ..< listLength:
|
|
|
|
db.put(keysA[i], valuesA[i])
|
|
|
|
|
|
|
|
proc checkContentsA(db: TrieDatabaseRef): bool =
|
|
|
|
for i in 0 ..< listLength:
|
|
|
|
let v = db.get(keysA[i])
|
|
|
|
if v != valuesA[i]: return false
|
|
|
|
result = true
|
|
|
|
|
|
|
|
proc checkEmptyContentsA(db: TrieDatabaseRef): bool {.used.} =
|
|
|
|
for i in 0 ..< listLength:
|
|
|
|
let v = db.get(keysA[i])
|
|
|
|
if v.len != 0: return false
|
|
|
|
result = true
|
|
|
|
|
|
|
|
proc populateB(db: TrieDatabaseRef) {.used.} =
|
|
|
|
for i in 0 ..< listLength:
|
|
|
|
db.put(keysB[i], valuesB[i])
|
|
|
|
|
|
|
|
proc checkContentsB(db: TrieDatabaseRef): bool {.used.} =
|
|
|
|
for i in 0 ..< listLength:
|
|
|
|
let v = db.get(keysB[i])
|
|
|
|
if v != valuesB[i]: return false
|
|
|
|
result = true
|
|
|
|
|
|
|
|
proc checkEmptyContentsB(db: TrieDatabaseRef): bool {.used.} =
|
|
|
|
for i in 0 ..< listLength:
|
|
|
|
let v = db.get(keysB[i])
|
|
|
|
if v.len != 0: return false
|
|
|
|
result = true
|
|
|
|
|
|
|
|
test "commit":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var tx = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
check checkContentsA(db)
|
|
|
|
tx.commit()
|
|
|
|
check checkContentsA(db)
|
|
|
|
|
|
|
|
test "rollback":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var tx = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
check checkContentsA(db)
|
|
|
|
tx.rollback()
|
|
|
|
check checkEmptyContentsA(db)
|
|
|
|
|
|
|
|
test "dispose":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var tx = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
check checkContentsA(db)
|
|
|
|
tx.dispose()
|
|
|
|
check checkEmptyContentsA(db)
|
|
|
|
|
|
|
|
test "commit dispose":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var tx = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
check checkContentsA(db)
|
|
|
|
tx.commit()
|
|
|
|
tx.dispose()
|
|
|
|
check checkContentsA(db)
|
|
|
|
|
|
|
|
test "rollback dispose":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var tx = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
check checkContentsA(db)
|
|
|
|
tx.rollback()
|
|
|
|
tx.dispose()
|
|
|
|
check checkEmptyContentsA(db)
|
|
|
|
|
|
|
|
test "dispose dispose":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var tx = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
check checkContentsA(db)
|
|
|
|
tx.dispose()
|
|
|
|
tx.dispose()
|
|
|
|
check checkEmptyContentsA(db)
|
|
|
|
|
|
|
|
test "commit commit":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var txA = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
var txB = db.beginTransaction()
|
|
|
|
db.populateB()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkContentsB(db)
|
|
|
|
|
|
|
|
txB.commit()
|
|
|
|
txA.commit()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkContentsB(db)
|
|
|
|
|
|
|
|
test "commit rollback":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var txA = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
var txB = db.beginTransaction()
|
|
|
|
db.populateB()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkContentsB(db)
|
|
|
|
|
|
|
|
txB.rollback()
|
|
|
|
txA.commit()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkEmptyContentsB(db)
|
|
|
|
|
|
|
|
test "rollback commit":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var txA = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
var txB = db.beginTransaction()
|
|
|
|
db.populateB()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkContentsB(db)
|
|
|
|
|
|
|
|
txB.commit()
|
|
|
|
txA.rollback()
|
|
|
|
|
|
|
|
check checkEmptyContentsB(db)
|
|
|
|
check checkEmptyContentsA(db)
|
|
|
|
|
|
|
|
test "rollback rollback":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var txA = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
var txB = db.beginTransaction()
|
|
|
|
db.populateB()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkContentsB(db)
|
|
|
|
|
|
|
|
txB.rollback()
|
|
|
|
txA.rollback()
|
|
|
|
|
|
|
|
check checkEmptyContentsB(db)
|
|
|
|
check checkEmptyContentsA(db)
|
|
|
|
|
|
|
|
test "commit rollback dispose":
|
|
|
|
var db = newMemoryDB()
|
|
|
|
var txA = db.beginTransaction()
|
|
|
|
db.populateA()
|
|
|
|
var txB = db.beginTransaction()
|
|
|
|
db.populateB()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkContentsB(db)
|
|
|
|
|
|
|
|
txB.rollback()
|
|
|
|
txA.commit()
|
|
|
|
txA.dispose()
|
|
|
|
|
|
|
|
check checkContentsA(db)
|
|
|
|
check checkEmptyContentsB(db)
|