Eric Bower
·
2026-05-31
1package rsyncchecksum_test
2
3import (
4 "bytes"
5 "os"
6 "path/filepath"
7 "testing"
8
9 "github.com/picosh/pico/pkg/rsync-receiver/rsyncchecksum"
10)
11
12func constructLargeDataFile(headPattern, bodyPattern, endPattern []byte) []byte {
13 // create large data file in source directory to be copied
14 head := bytes.Repeat(headPattern, 1*1024*1024)
15 body := bytes.Repeat(bodyPattern, 1*1024*1024)
16 end := bytes.Repeat(endPattern, 1*1024*1024)
17 return append(append(head, body...), end...)
18}
19
20func writeLargeDataFile(t *testing.T, source string, headPattern, bodyPattern, endPattern []byte) {
21 // create large data file in source directory to be copied
22 content := constructLargeDataFile(headPattern, bodyPattern, endPattern)
23 large := filepath.Join(source, "large-data-file")
24 if err := os.MkdirAll(filepath.Dir(large), 0755); err != nil {
25 t.Fatal(err)
26 }
27 if err := os.WriteFile(large, content, 0644); err != nil {
28 t.Fatal(err)
29 }
30}
31
32func TestSyncExtended(t *testing.T) {
33 tmp := t.TempDir()
34 source := filepath.Join(tmp, "source")
35
36 writeLargeDataFile(t, source, []byte{0x11}, []byte{0xbb}, []byte{0xee})
37
38 // These values are taken from the rsync debug output:
39 const k = 1768
40 want := make([]uint32, 1780)
41 for i := 0; i <= 592; i++ {
42 want[i] = 0xa5d47568
43 }
44 want[593] = 0x23645688
45 for i := 594; i <= 1185; i++ {
46 want[i] = 0x8c1c2378
47 }
48 want[1186] = 0x12504720
49 for i := 1187; i <= 1778; i++ {
50 want[i] = 0x7d9883b0
51 }
52 want[1779] = 0x61b8dff0
53
54 sourceLarge := filepath.Join(source, "large-data-file")
55 f, err := os.Open(sourceLarge)
56 if err != nil {
57 t.Fatal(err)
58 }
59 defer func() { _ = f.Close() }()
60 buf := make([]byte, k)
61 for idx, wantChecksum := range want {
62 n, err := f.Read(buf)
63 if err != nil {
64 t.Fatal(err)
65 }
66
67 chunk := buf[:n]
68 sum := rsyncchecksum.Checksum1(chunk)
69 if sum != wantChecksum {
70 t.Fatalf("checksum calculation error: got %08x, want %08x (idx %d), chunk: %#v", sum, wantChecksum, idx, chunk)
71 }
72 }
73}