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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
package plaintextnames
import (
"fmt"
"os"
"os/exec"
"testing"
"github.com/rfjakob/gocryptfs/tests/test_helpers"
"github.com/rfjakob/gocryptfs/contrib/findholes/holes"
)
func findHolesPretty(t *testing.T, path string) string {
f, err := os.Open(path)
if err != nil {
t.Fatal(err)
}
defer f.Close()
segments, err := holes.Find(int(f.Fd()))
if err != nil {
t.Fatal(err)
}
return holes.PrettyPrint(segments)
}
// TestFileHoleCopy creates a sparse times, copies it a few times, and check if
// the copies are the same (including the location of holes and data sections).
//
// The test runs with -plaintextnames because that makes it easier to manipulate
// cipherdir directly.
func TestFileHoleCopy(t *testing.T) {
n := "TestFileHoleCopy"
pPath := []string{pDir + "/" + n}
cPath := []string{cDir + "/" + n}
f, err := os.Create(pPath[0])
if err != nil {
t.Fatal(err)
}
// | hole | x | hole | x | hole |
buf := []byte("x")
f.WriteAt(buf, 10000)
f.WriteAt(buf, 30000)
f.Truncate(50000)
f.Sync()
f.Close()
// You have to update this value manually when you change the sequence
// above
md5 := test_helpers.Md5fn(pPath[0])
if md5 != "4e8d0742bccfbcdbf1d71be688e4e81c" {
t.Fatalf("wrong md5: %s", md5)
}
pSegments := []string{findHolesPretty(t, pPath[0])}
cSegments := []string{findHolesPretty(t, cPath[0])}
for i := 1; i < 5; i++ {
pPath = append(pPath, fmt.Sprintf("%s.%d", pPath[0], i))
cPath = append(cPath, fmt.Sprintf("%s.%d", cPath[0], i))
out, err := exec.Command("cp", "--sparse=auto", pPath[i-1], pPath[i]).CombinedOutput()
if err != nil {
t.Fatal(string(out))
}
tmp := test_helpers.Md5fn(pPath[0])
if tmp != md5 {
t.Errorf("pPath[%d]: wrong md5, have %s, want %s", i, tmp, md5)
}
pSegments = append(pSegments, findHolesPretty(t, pPath[i]))
cSegments = append(cSegments, findHolesPretty(t, cPath[i]))
}
for i := range pSegments {
t.Logf("pSegments[%d]: %s", i, pSegments[i])
if i < len(pSegments)-1 {
if pSegments[i+1] != pSegments[i] {
t.Errorf("error: this is different than pSegments[%d]!", i+1)
}
}
}
t.Log("------------------------------------")
for i := range cSegments {
t.Logf("cSegments[%d]: %s", i, cSegments[i])
if i < len(pSegments)-1 {
if cSegments[i+1] != cSegments[i] {
t.Errorf("error: this is different than cSegments[%d]!", i+1)
}
}
}
}
|