From 9695f0e524aa2debd173d676a8fd56ad26603c5a Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Mon, 24 May 2021 14:28:36 +0200 Subject: [PATCH] tests: add TestFileHoleCopy Currently fails. --- tests/plaintextnames/file_holes_test.go | 96 +++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 tests/plaintextnames/file_holes_test.go diff --git a/tests/plaintextnames/file_holes_test.go b/tests/plaintextnames/file_holes_test.go new file mode 100644 index 0000000..d046cea --- /dev/null +++ b/tests/plaintextnames/file_holes_test.go @@ -0,0 +1,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) + } + } + } +}