mirror of
https://github.com/codex-storage/nim-codex.git
synced 2025-02-18 15:58:08 +00:00
adding minimal RS 2D tests
Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
parent
195b5a81a6
commit
b6b49260ca
94
tests/codex/testerasure2d.nim
Normal file
94
tests/codex/testerasure2d.nim
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
import std/sequtils
|
||||||
|
from std/math import sqrt
|
||||||
|
|
||||||
|
import pkg/asynctest
|
||||||
|
import pkg/chronos
|
||||||
|
import pkg/libp2p
|
||||||
|
import pkg/questionable/results
|
||||||
|
|
||||||
|
import pkg/codex/erasure
|
||||||
|
import pkg/codex/manifest
|
||||||
|
import pkg/codex/stores
|
||||||
|
import pkg/codex/blocktype as bt
|
||||||
|
import pkg/codex/rng
|
||||||
|
|
||||||
|
import ./helpers
|
||||||
|
|
||||||
|
suite "2D Erasure encode/decode":
|
||||||
|
|
||||||
|
const BlockSize = 1024
|
||||||
|
const dataSetSize = BlockSize * 123
|
||||||
|
|
||||||
|
var rng: Rng
|
||||||
|
var chunker: Chunker
|
||||||
|
var manifest: Manifest
|
||||||
|
var store: BlockStore
|
||||||
|
var erasure: Erasure
|
||||||
|
|
||||||
|
setup:
|
||||||
|
rng = Rng.instance()
|
||||||
|
chunker = RandomChunker.new(rng, size = dataSetSize, chunkSize = BlockSize)
|
||||||
|
manifest = !Manifest.new(blockSize = BlockSize)
|
||||||
|
store = CacheStore.new(cacheSize = (dataSetSize * 2), chunkSize = BlockSize)
|
||||||
|
erasure = Erasure.new(store, leoEncoderProvider2D, leoDecoderProvider2D)
|
||||||
|
|
||||||
|
while (
|
||||||
|
let chunk = await chunker.getBytes();
|
||||||
|
chunk.len > 0):
|
||||||
|
|
||||||
|
let blk = bt.Block.new(chunk).tryGet()
|
||||||
|
manifest.add(blk.cid)
|
||||||
|
(await store.putBlock(blk)).tryGet()
|
||||||
|
|
||||||
|
proc encode(buffers, parity: int): Future[Manifest] {.async.} =
|
||||||
|
let
|
||||||
|
encoded = (await erasure.encode(
|
||||||
|
manifest,
|
||||||
|
buffers,
|
||||||
|
parity)).tryGet()
|
||||||
|
|
||||||
|
check:
|
||||||
|
encoded.len mod (buffers + parity) == 0
|
||||||
|
encoded.rounded == manifest.len - 1 + buffers - (manifest.len - 1) mod buffers
|
||||||
|
encoded.steps == encoded.rounded div buffers
|
||||||
|
|
||||||
|
echo(manifest.blocks)
|
||||||
|
echo(encoded.blocks)
|
||||||
|
|
||||||
|
return encoded
|
||||||
|
|
||||||
|
test "Should tolerate losing M1 data blocks in a single random column":
|
||||||
|
const
|
||||||
|
k1 = 3
|
||||||
|
k2 = k1
|
||||||
|
m1 = 1
|
||||||
|
m2 = m1
|
||||||
|
buffers = k1 * k2
|
||||||
|
parity = (k1+m1) * (k2+m2) - buffers
|
||||||
|
|
||||||
|
echo "encode"
|
||||||
|
|
||||||
|
let encoded = await encode(buffers, parity)
|
||||||
|
|
||||||
|
var
|
||||||
|
column = rng.rand(encoded.steps - 1) # random column
|
||||||
|
dropped: seq[Cid]
|
||||||
|
|
||||||
|
echo ("steps", encoded.steps)
|
||||||
|
for _ in 0 ..< m1:
|
||||||
|
echo ("column", column)
|
||||||
|
dropped.add(encoded[column])
|
||||||
|
(await store.delBlock(encoded[column])).tryGet()
|
||||||
|
column.inc(encoded.steps)
|
||||||
|
|
||||||
|
var
|
||||||
|
decoded = (await erasure.decode(encoded, parity + buffers - dropped.len)).tryGet()
|
||||||
|
|
||||||
|
check:
|
||||||
|
decoded.cid.tryGet() == manifest.cid.tryGet()
|
||||||
|
decoded.cid.tryGet() == encoded.originalCid
|
||||||
|
decoded.len == encoded.originalLen
|
||||||
|
|
||||||
|
for d in dropped:
|
||||||
|
let present = await store.hasBlock(d)
|
||||||
|
check present.tryGet()
|
Loading…
x
Reference in New Issue
Block a user