func (f *setxattr) test(path string, t *testing.T) { err := syscallx.Setxattr(path, "greeting", []byte("hello, world"), 0) if err != nil { t.Errorf("unexpected error: %v", err) return } close(f.seen) want := setxattrSeen{flags: 0, name: "greeting", value: "hello, world"} if g, e := <-f.seen, want; g != e { t.Errorf("setxattr saw %v, want %v", g, e) } }
func testSetxattr(t *testing.T, size int) { const linux_XATTR_NAME_MAX = 64 * 1024 if size > linux_XATTR_NAME_MAX && runtime.GOOS == "linux" { t.Skip("large xattrs are not supported by linux") } t.Parallel() f := &setxattr{} mnt, err := fstestutil.MountedT(t, childMapFS{"child": f}) if err != nil { t.Fatal(err) } defer mnt.Close() const g = "hello, world" greeting := strings.Repeat(g, size/len(g)+1)[:size] err = syscallx.Setxattr(mnt.Dir+"/child", "greeting", []byte(greeting), 0) if err != nil { t.Errorf("unexpected error: %v", err) return } // fuse.SetxattrRequest contains a byte slice and thus cannot be // directly compared got := f.RecordedSetxattr() if g, e := got.Name, "greeting"; g != e { t.Errorf("Setxattr incorrect name: %q != %q", g, e) } if g, e := got.Flags, uint32(0); g != e { t.Errorf("Setxattr incorrect flags: %d != %d", g, e) } if g, e := string(got.Xattr), greeting; g != e { t.Errorf("Setxattr incorrect data: %q != %q", g, e) } }
func TestXattr(t *testing.T) { condSkip(t) inEmptyMutDir(t, func(env *mountEnv, rootDir string) { name1 := filepath.Join(rootDir, "1") attr1 := "attr1" attr2 := "attr2" contents := []byte("Some file contents") if err := ioutil.WriteFile(name1, contents, 0644); err != nil { t.Fatal(err) } buf := make([]byte, 8192) // list empty n, err := syscallx.Listxattr(name1, buf) if err != nil { t.Errorf("Error in initial listxattr: %v", err) } if n != 0 { t.Errorf("Expected zero-length xattr list, got %q", buf[:n]) } // get missing n, err = syscallx.Getxattr(name1, attr1, buf) if err == nil { t.Errorf("Expected error getting non-existent xattr, got %q", buf[:n]) } // Set (two different attributes) err = syscallx.Setxattr(name1, attr1, []byte("hello1"), 0) if err != nil { t.Fatalf("Error setting xattr: %v", err) } err = syscallx.Setxattr(name1, attr2, []byte("hello2"), 0) if err != nil { t.Fatalf("Error setting xattr: %v", err) } // Alternate value for first attribute err = syscallx.Setxattr(name1, attr1, []byte("hello1a"), 0) if err != nil { t.Fatalf("Error setting xattr: %v", err) } // list attrs n, err = syscallx.Listxattr(name1, buf) if err != nil { t.Errorf("Error in initial listxattr: %v", err) } m := parseXattrList(buf[:n]) if !(len(m) == 2 && m[attr1] && m[attr2]) { t.Errorf("Missing an attribute: %q", buf[:n]) } // Remove attr err = syscallx.Removexattr(name1, attr2) if err != nil { t.Errorf("Failed to remove attr: %v", err) } // List attrs n, err = syscallx.Listxattr(name1, buf) if err != nil { t.Errorf("Error in initial listxattr: %v", err) } m = parseXattrList(buf[:n]) if !(len(m) == 1 && m[attr1]) { t.Errorf("Missing an attribute: %q", buf[:n]) } // Get remaining attr n, err = syscallx.Getxattr(name1, attr1, buf) if err != nil { t.Errorf("Error getting attr1: %v", err) } if string(buf[:n]) != "hello1a" { t.Logf("Expected hello1a, got %q", buf[:n]) } }) }