2019-01-24 20:15:10 +00:00
|
|
|
// Copyright (C) 2019 Storj Labs, Inc.
|
2018-10-09 22:10:37 +01:00
|
|
|
// See LICENSE for copying information.
|
|
|
|
|
2019-05-24 17:57:07 +01:00
|
|
|
package audit
|
2018-10-09 22:10:37 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
|
2019-05-24 17:57:07 +01:00
|
|
|
"github.com/stretchr/testify/require"
|
2018-10-09 22:10:37 +01:00
|
|
|
"github.com/vivint/infectious"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestFailingAudit(t *testing.T) {
|
|
|
|
const (
|
|
|
|
required = 8
|
|
|
|
total = 14
|
|
|
|
)
|
|
|
|
|
|
|
|
f, err := infectious.NewFEC(required, total)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
shares := make([]infectious.Share, total)
|
|
|
|
output := func(s infectious.Share) {
|
|
|
|
shares[s.Number] = s.DeepCopy()
|
|
|
|
}
|
|
|
|
|
|
|
|
// the data to encode must be padded to a multiple of required, hence the
|
|
|
|
// underscores.
|
|
|
|
err = f.Encode([]byte("hello, world! __"), output)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
modifiedShares := make([]infectious.Share, len(shares))
|
|
|
|
for i := range shares {
|
|
|
|
modifiedShares[i] = shares[i].DeepCopy()
|
|
|
|
}
|
|
|
|
|
|
|
|
modifiedShares[0].Data[1] = '!'
|
|
|
|
modifiedShares[2].Data[0] = '#'
|
|
|
|
modifiedShares[3].Data[1] = '!'
|
|
|
|
modifiedShares[4].Data[0] = 'b'
|
|
|
|
|
|
|
|
badPieceNums := []int{0, 2, 3, 4}
|
|
|
|
|
|
|
|
ctx := context.Background()
|
2019-05-24 17:57:07 +01:00
|
|
|
auditPkgShares := make(map[int]Share, len(modifiedShares))
|
2018-10-09 22:10:37 +01:00
|
|
|
for i := range modifiedShares {
|
2019-05-24 17:57:07 +01:00
|
|
|
auditPkgShares[modifiedShares[i].Number] = Share{
|
|
|
|
PieceNum: modifiedShares[i].Number,
|
|
|
|
Data: append([]byte(nil), modifiedShares[i].Data...),
|
2018-11-28 07:33:17 +00:00
|
|
|
}
|
2018-10-09 22:10:37 +01:00
|
|
|
}
|
2019-05-24 17:57:07 +01:00
|
|
|
|
|
|
|
pieceNums, correctedShares, err := auditShares(ctx, 8, 14, auditPkgShares)
|
2018-10-09 22:10:37 +01:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2019-05-24 17:57:07 +01:00
|
|
|
|
2018-10-09 22:10:37 +01:00
|
|
|
for i, num := range pieceNums {
|
|
|
|
if num != badPieceNums[i] {
|
|
|
|
t.Fatal("expected nums in pieceNums to be same as in badPieceNums")
|
|
|
|
}
|
|
|
|
}
|
2019-05-24 17:57:07 +01:00
|
|
|
|
|
|
|
require.Equal(t, shares, correctedShares)
|
2018-10-09 22:10:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestNotEnoughShares(t *testing.T) {
|
|
|
|
const (
|
|
|
|
required = 8
|
|
|
|
total = 14
|
|
|
|
)
|
|
|
|
|
|
|
|
f, err := infectious.NewFEC(required, total)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
shares := make([]infectious.Share, total)
|
|
|
|
output := func(s infectious.Share) {
|
|
|
|
shares[s.Number] = s.DeepCopy()
|
|
|
|
}
|
|
|
|
|
|
|
|
// the data to encode must be padded to a multiple of required, hence the
|
|
|
|
// underscores.
|
|
|
|
err = f.Encode([]byte("hello, world! __"), output)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx := context.Background()
|
2019-05-24 17:57:07 +01:00
|
|
|
auditPkgShares := make(map[int]Share, len(shares))
|
2018-10-09 22:10:37 +01:00
|
|
|
for i := range shares {
|
2019-05-24 17:57:07 +01:00
|
|
|
auditPkgShares[shares[i].Number] = Share{
|
|
|
|
PieceNum: shares[i].Number,
|
|
|
|
Data: append([]byte(nil), shares[i].Data...),
|
2018-11-28 07:33:17 +00:00
|
|
|
}
|
2018-10-09 22:10:37 +01:00
|
|
|
}
|
2019-05-24 17:57:07 +01:00
|
|
|
_, _, err = auditShares(ctx, 20, 40, auditPkgShares)
|
|
|
|
require.Contains(t, err.Error(), "infectious: must specify at least the number of required shares")
|
2018-10-09 22:10:37 +01:00
|
|
|
}
|