Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

120 строки
2.7 KiB

  1. // Copyright 2018 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // +build darwin freebsd linux
  5. package unix_test
  6. import (
  7. "os"
  8. "runtime"
  9. "strings"
  10. "testing"
  11. "golang.org/x/sys/unix"
  12. )
  13. func TestXattr(t *testing.T) {
  14. defer chtmpdir(t)()
  15. f := "xattr1"
  16. touch(t, f)
  17. xattrName := "user.test"
  18. xattrDataSet := "gopher"
  19. err := unix.Setxattr(f, xattrName, []byte(xattrDataSet), 0)
  20. if err == unix.ENOTSUP || err == unix.EOPNOTSUPP {
  21. t.Skip("filesystem does not support extended attributes, skipping test")
  22. } else if err != nil {
  23. t.Fatalf("Setxattr: %v", err)
  24. }
  25. // find size
  26. size, err := unix.Listxattr(f, nil)
  27. if err != nil {
  28. t.Fatalf("Listxattr: %v", err)
  29. }
  30. if size <= 0 {
  31. t.Fatalf("Listxattr returned an empty list of attributes")
  32. }
  33. buf := make([]byte, size)
  34. read, err := unix.Listxattr(f, buf)
  35. if err != nil {
  36. t.Fatalf("Listxattr: %v", err)
  37. }
  38. xattrs := stringsFromByteSlice(buf[:read])
  39. xattrWant := xattrName
  40. if runtime.GOOS == "freebsd" {
  41. // On FreeBSD, the namespace is stored separately from the xattr
  42. // name and Listxattr doesn't return the namespace prefix.
  43. xattrWant = strings.TrimPrefix(xattrWant, "user.")
  44. }
  45. found := false
  46. for _, name := range xattrs {
  47. if name == xattrWant {
  48. found = true
  49. }
  50. }
  51. if !found {
  52. t.Errorf("Listxattr did not return previously set attribute '%s'", xattrName)
  53. }
  54. // find size
  55. size, err = unix.Getxattr(f, xattrName, nil)
  56. if err != nil {
  57. t.Fatalf("Getxattr: %v", err)
  58. }
  59. if size <= 0 {
  60. t.Fatalf("Getxattr returned an empty attribute")
  61. }
  62. xattrDataGet := make([]byte, size)
  63. _, err = unix.Getxattr(f, xattrName, xattrDataGet)
  64. if err != nil {
  65. t.Fatalf("Getxattr: %v", err)
  66. }
  67. got := string(xattrDataGet)
  68. if got != xattrDataSet {
  69. t.Errorf("Getxattr: expected attribute value %s, got %s", xattrDataSet, got)
  70. }
  71. err = unix.Removexattr(f, xattrName)
  72. if err != nil {
  73. t.Fatalf("Removexattr: %v", err)
  74. }
  75. n := "nonexistent"
  76. err = unix.Lsetxattr(n, xattrName, []byte(xattrDataSet), 0)
  77. if err != unix.ENOENT {
  78. t.Errorf("Lsetxattr: expected %v on non-existent file, got %v", unix.ENOENT, err)
  79. }
  80. _, err = unix.Lgetxattr(n, xattrName, nil)
  81. if err != unix.ENOENT {
  82. t.Errorf("Lgetxattr: %v", err)
  83. }
  84. s := "symlink1"
  85. err = os.Symlink(n, s)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. err = unix.Lsetxattr(s, xattrName, []byte(xattrDataSet), 0)
  90. if err != nil {
  91. // Linux and Android doen't support xattrs on symlinks according
  92. // to xattr(7), so just test that we get the proper error.
  93. if (runtime.GOOS != "linux" && runtime.GOOS != "android") || err != unix.EPERM {
  94. t.Fatalf("Lsetxattr: %v", err)
  95. }
  96. }
  97. }