This repository has been archived by the owner on May 30, 2019. It is now read-only.
/
format_block_test.go
79 lines (70 loc) · 2.43 KB
/
format_block_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package repo
import (
"context"
"crypto/sha256"
"reflect"
"testing"
"github.com/kopia/repo/internal/storagetesting"
"github.com/kopia/repo/storage"
)
func TestFormatBlockRecovery(t *testing.T) {
data := map[string][]byte{}
st := storagetesting.NewMapStorage(data, nil, nil)
ctx := context.Background()
someDataBlock := []byte("aadsdasdas")
checksummed, err := addFormatBlockChecksumAndLength(someDataBlock)
if err != nil {
t.Errorf("error appending checksum: %v", err)
}
if got, want := len(checksummed), 2+2+sha256.Size+len(someDataBlock); got != want {
t.Errorf("unexpected checksummed length: %v, want %v", got, want)
}
assertNoError(t, st.PutBlock(ctx, "some-block-by-itself", checksummed))
assertNoError(t, st.PutBlock(ctx, "some-block-suffix", append(append([]byte(nil), 1, 2, 3), checksummed...)))
assertNoError(t, st.PutBlock(ctx, "some-block-prefix", append(append([]byte(nil), checksummed...), 1, 2, 3)))
// mess up checksum
checksummed[len(checksummed)-3] ^= 1
assertNoError(t, st.PutBlock(ctx, "bad-checksum", checksummed))
assertNoError(t, st.PutBlock(ctx, "zero-len", []byte{}))
assertNoError(t, st.PutBlock(ctx, "one-len", []byte{1}))
assertNoError(t, st.PutBlock(ctx, "two-len", []byte{1, 2}))
assertNoError(t, st.PutBlock(ctx, "three-len", []byte{1, 2, 3}))
assertNoError(t, st.PutBlock(ctx, "four-len", []byte{1, 2, 3, 4}))
assertNoError(t, st.PutBlock(ctx, "five-len", []byte{1, 2, 3, 4, 5}))
cases := []struct {
block string
err error
}{
{"some-block-by-itself", nil},
{"some-block-suffix", nil},
{"some-block-prefix", nil},
{"bad-checksum", errFormatBlockNotFound},
{"no-such-block", storage.ErrBlockNotFound},
{"zero-len", errFormatBlockNotFound},
{"one-len", errFormatBlockNotFound},
{"two-len", errFormatBlockNotFound},
{"three-len", errFormatBlockNotFound},
{"four-len", errFormatBlockNotFound},
{"five-len", errFormatBlockNotFound},
}
for _, tc := range cases {
t.Run(tc.block, func(t *testing.T) {
v, err := RecoverFormatBlock(ctx, st, tc.block, -1)
if tc.err == nil {
if !reflect.DeepEqual(v, someDataBlock) || err != nil {
t.Errorf("unexpected result or error: v=%v err=%v, expected success", v, err)
}
} else {
if v != nil || err != tc.err {
t.Errorf("unexpected result or error: v=%v err=%v, expected %v", v, err, tc.err)
}
}
})
}
}
func assertNoError(t *testing.T, err error) {
t.Helper()
if err != nil {
t.Errorf("err: %v", err)
}
}