nim-datastore/tests/datastore/test_tiered_datastore.nim

154 lines
3.5 KiB
Nim
Raw Normal View History

2022-05-11 10:50:05 -05:00
import std/options
import std/os
import pkg/asynctest/unittest2
import pkg/chronos
2022-05-11 10:50:05 -05:00
import pkg/stew/results
import ../../datastore/filesystem_datastore
import ../../datastore/sqlite_datastore
import ../../datastore/tiered_datastore
import ./templates
2022-05-11 10:50:05 -05:00
suite "TieredDatastore":
# assumes tests/test_all is run from project root, e.g. with `nimble test`
let
bytes = @[1.byte, 2.byte, 3.byte]
key = Key.init("a:b/c/d:e").get
root = "tests" / "test_data"
rootAbs = getCurrentDir() / root
2022-05-11 10:50:05 -05:00
var
ds1: SQLiteDatastore
ds2: FileSystemDatastore
2022-05-11 10:50:05 -05:00
setup:
ds1 = SQLiteDatastore.new(inMemory = true).get
ds2 = FileSystemDatastore.new(rootAbs).get
2022-05-11 10:50:05 -05:00
removeDir(rootAbs)
require(not dirExists(rootAbs))
teardown:
if not ds1.isNil: ds1.close
ds1 = nil
2022-05-11 10:50:05 -05:00
removeDir(rootAbs)
require(not dirExists(rootAbs))
asyncTest "new":
2022-05-11 10:50:05 -05:00
check:
TieredDatastore.new().isErr
TieredDatastore.new([]).isErr
TieredDatastore.new(@[]).isErr
TieredDatastore.new(ds1, ds2).isOk
TieredDatastore.new([ds1, ds2]).isOk
TieredDatastore.new(@[ds1, ds2]).isOk
asyncTest "accessors":
2022-05-11 10:50:05 -05:00
let
stores = @[ds1, ds2]
check:
TieredDatastore.new(ds1, ds2).get.stores == stores
TieredDatastore.new([ds1, ds2]).get.stores == stores
TieredDatastore.new(@[ds1, ds2]).get.stores == stores
asyncTest "put":
2022-05-11 10:50:05 -05:00
let
ds = TieredDatastore.new(ds1, ds2).get
assert (await ds1.get(key)).get.isNone
assert (await ds2.get(key)).get.isNone
2022-05-11 10:50:05 -05:00
let
putRes = await ds.put(key, bytes)
2022-05-11 10:50:05 -05:00
check:
putRes.isOk
(await ds1.get(key)).get.get == bytes
(await ds2.get(key)).get.get == bytes
2022-05-11 10:50:05 -05:00
asyncTest "delete":
2022-05-11 10:50:05 -05:00
let
ds = TieredDatastore.new(ds1, ds2).get
putRes = await ds.put(key, bytes)
2022-05-11 10:50:05 -05:00
assert putRes.isOk
assert (await ds1.get(key)).get.get == bytes
assert (await ds2.get(key)).get.get == bytes
2022-05-11 10:50:05 -05:00
let
delRes = await ds.delete(key)
2022-05-11 10:50:05 -05:00
check:
delRes.isOk
(await ds1.get(key)).get.isNone
(await ds2.get(key)).get.isNone
2022-05-11 10:50:05 -05:00
asyncTest "contains":
2022-05-11 10:50:05 -05:00
let
ds = TieredDatastore.new(ds1, ds2).get
assert not (await ds1.contains(key)).get
assert not (await ds2.contains(key)).get
2022-05-11 10:50:05 -05:00
let
putRes = await ds.put(key, bytes)
2022-05-11 10:50:05 -05:00
assert putRes.isOk
let
containsRes = await ds.contains(key)
2022-05-11 10:50:05 -05:00
check:
containsRes.isOk
containsRes.get
(await ds1.contains(key)).get
(await ds2.contains(key)).get
2022-05-11 10:50:05 -05:00
asyncTest "get":
2022-05-11 10:50:05 -05:00
var
ds = TieredDatastore.new(ds1, ds2).get
assert (await ds1.get(key)).get.isNone
assert (await ds2.get(key)).get.isNone
2022-05-11 10:50:05 -05:00
check: (await ds.get(key)).get.isNone
2022-05-11 10:50:05 -05:00
let
putRes = await ds.put(key, bytes)
2022-05-11 10:50:05 -05:00
assert putRes.isOk
var
getRes = await ds.get(key)
2022-05-11 10:50:05 -05:00
check:
getRes.isOk
getRes.get.isSome
getRes.get.get == bytes
(await ds1.get(key)).get.isSome
(await ds2.get(key)).get.isSome
(await ds1.get(key)).get.get == bytes
(await ds2.get(key)).get.get == bytes
2022-05-11 10:50:05 -05:00
ds1.close
ds1 = SQLiteDatastore.new(inMemory = true).get
ds = TieredDatastore.new(ds1, ds2).get
assert (await ds1.get(key)).get.isNone
assert (await ds2.get(key)).get.isSome
assert (await ds2.get(key)).get.get == bytes
2022-05-11 10:50:05 -05:00
getRes = await ds.get(key)
2022-05-11 10:50:05 -05:00
check:
getRes.isOk
getRes.get.isSome
getRes.get.get == bytes
(await ds1.get(key)).get.isSome
(await ds1.get(key)).get.get == bytes
2022-05-11 10:50:05 -05:00
# asyncTest "query":
2022-05-11 10:50:05 -05:00
# check:
# true