Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Mock probePorts in scale limit tests so ScanLocalSubnet does not hang on live TCP dials; add erasure_codec error-path coverage from 0445b7e/d18c591 gaps.
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package deploy
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/klauspost/reedsolomon"
|
|
)
|
|
|
|
func TestErasureParamsNormalizeDefaults(t *testing.T) {
|
|
p := erasureParams{}
|
|
got, err := p.normalize()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got.DataShards != erasureDefaultDataShards || got.ParityShards != erasureDefaultParityShards {
|
|
t.Fatalf("defaults=%+v", got)
|
|
}
|
|
if got.minShards() != erasureDefaultDataShards {
|
|
t.Fatalf("minShards=%d", got.minShards())
|
|
}
|
|
if got.totalShards() != erasureDefaultDataShards+erasureDefaultParityShards {
|
|
t.Fatalf("totalShards=%d", got.totalShards())
|
|
}
|
|
}
|
|
|
|
func TestDecodeErasureShardsInsufficientPresent(t *testing.T) {
|
|
payload := []byte("codec-insufficient")
|
|
p := erasureParams{DataShards: 2, ParityShards: 2}
|
|
enc, err := reedsolomon.New(p.DataShards, p.ParityShards)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
shards, err := enc.Split(payload)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := enc.Encode(shards); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
shards[0] = nil
|
|
shards[1] = nil
|
|
shards[2] = nil
|
|
_, err = decodeErasureShards(shards, len(payload), p)
|
|
if err == nil || !strings.Contains(err.Error(), "need 2 shards") {
|
|
t.Fatalf("err=%v", err)
|
|
}
|
|
}
|
|
|
|
func TestDecodeErasureShardsSliceTooShort(t *testing.T) {
|
|
_, err := decodeErasureShards([][]byte{{1}, {2}}, 4, erasureParams{DataShards: 2, ParityShards: 2})
|
|
if err == nil || !strings.Contains(err.Error(), "shard slice too short") {
|
|
t.Fatalf("err=%v", err)
|
|
}
|
|
}
|
|
|
|
func TestDecodeErasureShardsVerificationFailed(t *testing.T) {
|
|
payload := []byte("codec-bad-shard")
|
|
p := erasureParams{DataShards: 2, ParityShards: 1}
|
|
enc, err := reedsolomon.New(p.DataShards, p.ParityShards)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
shards, err := enc.Split(payload)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := enc.Encode(shards); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
shards[2][0] ^= 0xff
|
|
_, err = decodeErasureShards(shards, len(payload), p)
|
|
if err == nil || !strings.Contains(err.Error(), "verification failed") {
|
|
t.Fatalf("err=%v", err)
|
|
}
|
|
}
|