diff options
Diffstat (limited to 'tests/xattr/xattr_fd_test.go')
-rw-r--r-- | tests/xattr/xattr_fd_test.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/xattr/xattr_fd_test.go b/tests/xattr/xattr_fd_test.go new file mode 100644 index 0000000..7d37a57 --- /dev/null +++ b/tests/xattr/xattr_fd_test.go @@ -0,0 +1,61 @@ +//+build linux + +// Darwin does not support Fgetxattr and friends! + +package xattr_tests + +import ( + "io/ioutil" + "syscall" + "testing" + + "golang.org/x/sys/unix" + + "github.com/rfjakob/gocryptfs/tests/test_helpers" +) + +func TestFdXattr(t *testing.T) { + attr := "user.foo" + fn := test_helpers.DefaultPlainDir + "/TestFdXattr" + err := ioutil.WriteFile(fn, nil, 0700) + if err != nil { + t.Fatalf("creating empty file failed: %v", err) + } + fd, err := syscall.Open(fn, syscall.O_RDONLY, 0) + if err != nil { + t.Fatal(err) + } + defer syscall.Close(fd) + buf := make([]byte, 1000) + sz, err := unix.Flistxattr(fd, buf) + if sz != 0 { + t.Errorf("expected zero size, got %d", sz) + } + val1 := []byte("123456789") + unix.Fsetxattr(fd, attr, val1, 0) + sz, err = unix.Flistxattr(fd, buf) + // Length of "user.attr" + terminating null byte + expectedSz := len(attr) + 1 + if sz != expectedSz { + t.Errorf("expected size %d, got %d", expectedSz, sz) + } + str := string(buf[:sz-1]) + if str != attr { + t.Errorf("expected name %q, got %q", attr, str) + } + // Check content + sz, err = unix.Fgetxattr(fd, attr, buf) + str = string(buf[:sz]) + if str != string(val1) { + t.Errorf("expected val %q, got %q", val1, str) + } + // Delete value + err = unix.Fremovexattr(fd, attr) + if err != nil { + t.Error(err) + } + sz, err = unix.Flistxattr(fd, buf) + if sz != 0 { + t.Errorf("expected zero size, got %d", sz) + } +} |