diff options
| -rw-r--r-- | tests/matrix/matrix_test.go | 83 | ||||
| -rw-r--r-- | tests/test_helpers/helpers.go | 6 | 
2 files changed, 61 insertions, 28 deletions
| diff --git a/tests/matrix/matrix_test.go b/tests/matrix/matrix_test.go index 663482e..1b851c3 100644 --- a/tests/matrix/matrix_test.go +++ b/tests/matrix/matrix_test.go @@ -170,6 +170,27 @@ func TestTruncate(t *testing.T) {  	}  } +const ( +	// From man statfs +	TMPFS_MAGIC      = 0x01021994 +	EXT4_SUPER_MAGIC = 0xef53 +) + +// isWellKnownFS decides if the backing filesystem is well-known. +// The expected allocated sizes are only valid on tmpfs and ext4. btrfs +// gives different results, but that's not an error. +func isWellKnownFS(fn string) bool { +	var fs syscall.Statfs_t +	err := syscall.Statfs(fn, &fs) +	if err != nil { +		panic(err) +	} +	if fs.Type == EXT4_SUPER_MAGIC || fs.Type == TMPFS_MAGIC { +		return true +	} +	return false +} +  const FALLOC_DEFAULT = 0x00  const FALLOC_FL_KEEP_SIZE = 0x01 @@ -177,17 +198,16 @@ func TestFallocate(t *testing.T) {  	if runtime.GOOS == "darwin" {  		t.Skipf("OSX does not support fallocate")  	} -  	fn := test_helpers.DefaultPlainDir + "/fallocate"  	file, err := os.Create(fn)  	if err != nil {  		t.FailNow()  	} -	var nBlocks int64 +	wellKnown := isWellKnownFS(test_helpers.DefaultCipherDir)  	fd := int(file.Fd()) -	_, nBlocks = test_helpers.Du(t, fd) -	if nBlocks != 0 { -		t.Fatalf("Empty file has %d blocks", nBlocks) +	nBytes := test_helpers.Du(t, fd) +	if nBytes != 0 { +		t.Fatalf("Empty file has %d bytes", nBytes)  	}  	// Allocate 30 bytes, keep size  	// gocryptfs ||        (0 blocks) @@ -196,9 +216,11 @@ func TestFallocate(t *testing.T) {  	if err != nil {  		t.Error(err)  	} -	_, nBlocks = test_helpers.Du(t, fd) -	if want := 1; nBlocks/8 != int64(want) { -		t.Errorf("Expected %d 4k block(s), got %d", want, nBlocks/8) +	var want int64 +	nBytes = test_helpers.Du(t, fd) +	want = 4096 +	if nBytes != want { +		t.Errorf("Expected %d allocated bytes, have %d", want, nBytes)  	}  	test_helpers.VerifySize(t, fn, 0)  	// Three ciphertext blocks. The middle one should be a file hole. @@ -210,9 +232,10 @@ func TestFallocate(t *testing.T) {  	if err != nil {  		t.Fatal(err)  	} -	_, nBlocks = test_helpers.Du(t, fd) -	if want := 2; nBlocks/8 != int64(want) { -		t.Errorf("Expected %d 4k block(s), got %d", want, nBlocks/8) +	nBytes = test_helpers.Du(t, fd) +	want = 2 * 4096 +	if wellKnown && nBytes != want { +		t.Errorf("Expected %d allocated bytes, have %d", want, nBytes)  	}  	if md5 := test_helpers.Md5fn(fn); md5 != "5420afa22f6423a9f59e669540656bb4" {  		t.Errorf("Wrong md5 %s", md5) @@ -224,9 +247,10 @@ func TestFallocate(t *testing.T) {  	if err != nil {  		t.Fatal(err)  	} -	_, nBlocks = test_helpers.Du(t, fd) -	if want := 3; nBlocks/8 != int64(want) { -		t.Errorf("Expected %d 4k block(s), got %d", want, nBlocks/8) +	nBytes = test_helpers.Du(t, fd) +	want = 3 * 4096 +	if nBytes != want { +		t.Errorf("Expected %d allocated bytes, have %d", want, nBytes)  	}  	// Neither apparent size nor content should have changed  	test_helpers.VerifySize(t, fn, 9000) @@ -239,17 +263,19 @@ func TestFallocate(t *testing.T) {  	//      ext4 |  d  |  h  |  d  |  (2 blocks)  	file.Truncate(0)  	file.Truncate(9000) -	_, nBlocks = test_helpers.Du(t, fd) -	if want := 2; nBlocks/8 != int64(want) { -		t.Errorf("Expected %d 4k block(s), got %d", want, nBlocks/8) +	nBytes = test_helpers.Du(t, fd) +	want = 2 * 4096 +	if wellKnown && nBytes != want { +		t.Errorf("Expected %d allocated bytes, have %d", want, nBytes)  	}  	// Allocate 10 bytes in the second block  	// gocryptfs |  h   |   h  | d|   (1 block) -	//      ext4 |  d  |  d  |  d  |  (2 blocks) +	//      ext4 |  d  |  d  |  d  |  (3 blocks)  	syscallcompat.Fallocate(fd, FALLOC_DEFAULT, 5000, 10) -	_, nBlocks = test_helpers.Du(t, fd) -	if want := 3; nBlocks/8 != int64(want) { -		t.Errorf("Expected %d 4k block(s), got %d", want, nBlocks/8) +	nBytes = test_helpers.Du(t, fd) +	want = 3 * 4096 +	if wellKnown && nBytes != want { +		t.Errorf("Expected %d allocated bytes, have %d", want, nBytes)  	}  	// Neither apparent size nor content should have changed  	test_helpers.VerifySize(t, fn, 9000) @@ -258,11 +284,12 @@ func TestFallocate(t *testing.T) {  	}  	// Grow the file to 4 blocks  	// gocryptfs |  h   |  h   |  d   |d|  (2 blocks) -	//      ext4 |  d  |  d  |  d  |  d  | (3 blocks) +	//      ext4 |  d  |  d  |  d  |  d  | (4 blocks)  	syscallcompat.Fallocate(fd, FALLOC_DEFAULT, 15000, 10) -	_, nBlocks = test_helpers.Du(t, fd) -	if want := 4; nBlocks/8 != int64(want) { -		t.Errorf("Expected %d 4k block(s), got %d", want, nBlocks/8) +	nBytes = test_helpers.Du(t, fd) +	want = 4 * 4096 +	if wellKnown && nBytes != want { +		t.Errorf("Expected %d allocated bytes, have %d", want, nBytes)  	}  	test_helpers.VerifySize(t, fn, 15010)  	if md5 := test_helpers.Md5fn(fn); md5 != "c4c44c7a41ab7798a79d093eb44f99fc" { @@ -279,7 +306,13 @@ func TestFallocate(t *testing.T) {  		}  	}  	// Cleanup +	file.Close()  	syscall.Unlink(fn) +	if !wellKnown { +		// Even though most tests have been executed still, inform the user +		// that some were disabled +		t.Skipf("backing fs is not ext4 or tmpfs, skipped some disk-usage checks\n") +	}  }  func TestAppend(t *testing.T) { diff --git a/tests/test_helpers/helpers.go b/tests/test_helpers/helpers.go index 5c71d30..be532df 100644 --- a/tests/test_helpers/helpers.go +++ b/tests/test_helpers/helpers.go @@ -312,12 +312,12 @@ func VerifyExistence(path string) bool {  // Du returns the disk usage of the file "fd" points to, in bytes.  // Same as "du --block-size=1". -func Du(t *testing.T, fd int) (nBytes int64, nBlocks int64) { +func Du(t *testing.T, fd int) (nBytes int64) {  	var st syscall.Stat_t  	err := syscall.Fstat(fd, &st)  	if err != nil {  		t.Fatal(err)  	} -	// On OSX, Blksize is int32, need to cast to int64. -	return st.Blocks * int64(st.Blksize), st.Blocks +	// st.Blocks = number of 512-byte blocks +	return st.Blocks * 512  } | 
