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) } }