diff --git a/tests/codex/testerasure.nim b/tests/codex/testerasure.nim index ff273bf5..48f9f9d4 100644 --- a/tests/codex/testerasure.nim +++ b/tests/codex/testerasure.nim @@ -35,17 +35,18 @@ asyncchecksuite "Erasure encode/decode": erasure = Erasure.new(store, leoEncoderProvider, leoDecoderProvider) manifest = await storeDataGetManifest(store, chunker) - proc encode(buffers, parity: int): Future[Manifest] {.async.} = + proc encode(buffers, parity: int, interleave: int = 0, + manifest: Manifest = manifest): Future[Manifest] {.async.} = let encoded = (await erasure.encode( manifest, buffers, - parity)).tryGet() + parity, interleave)).tryGet() check: encoded.blocksCount mod (buffers + parity) == 0 - encoded.rounded == roundUp(manifest.blocksCount, buffers) - #encoded.steps == encoded.rounded div buffers + #encoded.rounded == (manifest.blocksCount + (buffers - (manifest.blocksCount mod buffers))) + encoded.steps == (encoded.rounded - 1) div (buffers * encoded.interleave) + 1 return encoded @@ -221,3 +222,97 @@ asyncchecksuite "Erasure encode/decode": let encoded = await encode(buffers, parity) discard (await erasure.decode(encoded)).tryGet() + + test "Encode without interleaving (horizontal): Should tolerate losing M data blocks in a single random row": + const + buffers = 20 + parity = 10 + interleave = 1 + + let encoded = await encode(buffers, parity, interleave) + + var + idx = rng.rand(encoded.steps - 1) # random row + dropped: seq[int] + + for _ in 0..