Skip to content

Commit f3cae11

Browse files
committed
proof: more tests
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
1 parent ad3e499 commit f3cae11

File tree

2 files changed

+49
-15
lines changed

2 files changed

+49
-15
lines changed

proof.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ func ValidateProof(ctx context.Context, root cid.Cid, offset uint64, proof []byt
5656
// is missing.
5757
regenProof, err := CreateProof(ctx, root, offset, dserv)
5858
if err != nil {
59-
return false, fmt.Errorf("regenerating proof to validate: %s", err)
59+
return false, nil
6060
}
6161

62-
return !bytes.Equal(proof, regenProof), nil
62+
return bytes.Equal(proof, regenProof), nil
6363
}
6464

6565
// CreateProof creates a proof for a Cid at a specified file offset.
@@ -80,6 +80,7 @@ func CreateProof(ctx context.Context, root cid.Cid, offset uint64, dserv ipld.DA
8080
}
8181
proofNodes = append(proofNodes, cn)
8282

83+
// REMOVE THIS?
8384
if next == nil {
8485
fsNode, err := unixfs.ExtractFSNode(n)
8586
if err != nil {

proof_test.go

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package unixfsproof
33
import (
44
"bytes"
55
"context"
6+
"fmt"
67
"io"
78
"math/rand"
89
"testing"
@@ -14,14 +15,14 @@ import (
1415
"github.com/stretchr/testify/require"
1516
)
1617

17-
func TestMakeProof(t *testing.T) {
18-
dserv := testu.GetDAGServ()
18+
func TestProofVerify(t *testing.T) {
19+
t.Parallel()
1920

21+
dserv := testu.GetDAGServ()
2022
r := rand.New(rand.NewSource(22))
2123
data := make([]byte, 100000)
2224
_, err := io.ReadFull(r, data)
2325
require.NoError(t, err)
24-
2526
in := bytes.NewReader(data)
2627
opts := testu.UseCidV1
2728
dbp := h.DagBuilderParams{
@@ -30,19 +31,51 @@ func TestMakeProof(t *testing.T) {
3031
CidBuilder: opts.Prefix,
3132
RawLeaves: opts.RawLeavesUsed,
3233
}
33-
34-
db, err := dbp.New(chunker.NewSizeSplitter(in, 256))
34+
chunkSize := int64(256)
35+
db, err := dbp.New(chunker.NewSizeSplitter(in, chunkSize))
3536
require.NoError(t, err)
3637
node, err := balanced.Layout(db)
3738
require.NoError(t, err)
3839

39-
offset := uint64(50000)
40-
ctx, cls := context.WithCancel(context.Background())
41-
defer cls()
42-
proof, err := CreateProof(ctx, node.Cid(), offset, dserv)
43-
require.NoError(t, err)
40+
tests := []struct {
41+
proofOffset uint64
42+
verifOffset uint64
43+
ok bool
44+
}{
45+
// Correct proofs.
46+
{proofOffset: 40, verifOffset: 40, ok: true},
47+
{proofOffset: 500, verifOffset: 500, ok: true},
48+
{proofOffset: 6000, verifOffset: 6000, ok: true},
49+
{proofOffset: 70000, verifOffset: 70000, ok: true},
4450

45-
ok, err := ValidateProof(ctx, node.Cid(), offset, proof)
46-
require.NoError(t, err)
47-
require.True(t, ok)
51+
// Correct proof due to being in same block
52+
{proofOffset: 40, verifOffset: 41, ok: true},
53+
{proofOffset: 41, verifOffset: 40, ok: true},
54+
55+
// Indirectly correct proofs; this should work unless we change
56+
// the verification to not allow unvisited blocks; not clear if that's
57+
// entirely useful.
58+
{proofOffset: 868, verifOffset: 1124, ok: true},
59+
60+
// Definitely wrong proofs.
61+
{proofOffset: 40, verifOffset: 50000, ok: false},
62+
{proofOffset: 70000, verifOffset: 10, ok: false},
63+
}
64+
65+
for _, test := range tests {
66+
test := test
67+
tname := fmt.Sprintf("%d %d", test.proofOffset, test.verifOffset)
68+
69+
t.Run(tname, func(t *testing.T) {
70+
ctx, cls := context.WithCancel(context.Background())
71+
defer cls()
72+
proof, err := CreateProof(ctx, node.Cid(), test.proofOffset, dserv)
73+
require.NoError(t, err)
74+
75+
ok, err := ValidateProof(ctx, node.Cid(), test.verifOffset, proof)
76+
require.NoError(t, err)
77+
78+
require.Equal(t, test.ok, ok)
79+
})
80+
}
4881
}

0 commit comments

Comments
 (0)