1
2
3
4 package winio
5
6 import (
7 "os"
8 "reflect"
9 "syscall"
10 "testing"
11 "unsafe"
12 )
13
14 var (
15 testEas = []ExtendedAttribute{
16 {Name: "foo", Value: []byte("bar")},
17 {Name: "fizz", Value: []byte("buzz")},
18 }
19
20 testEasEncoded = []byte{16, 0, 0, 0, 0, 3, 3, 0, 102, 111, 111, 0, 98, 97, 114, 0, 0,
21 0, 0, 0, 0, 4, 4, 0, 102, 105, 122, 122, 0, 98, 117, 122, 122, 0, 0, 0}
22 testEasNotPadded = testEasEncoded[0 : len(testEasEncoded)-3]
23 testEasTruncated = testEasEncoded[0:20]
24 )
25
26 func Test_RoundTripEas(t *testing.T) {
27 b, err := EncodeExtendedAttributes(testEas)
28 if err != nil {
29 t.Fatal(err)
30 }
31 if !reflect.DeepEqual(testEasEncoded, b) {
32 t.Fatalf("encoded mismatch %v %v", testEasEncoded, b)
33 }
34 eas, err := DecodeExtendedAttributes(b)
35 if err != nil {
36 t.Fatal(err)
37 }
38 if !reflect.DeepEqual(testEas, eas) {
39 t.Fatalf("mismatch %+v %+v", testEas, eas)
40 }
41 }
42
43 func Test_EasDontNeedPaddingAtEnd(t *testing.T) {
44 eas, err := DecodeExtendedAttributes(testEasNotPadded)
45 if err != nil {
46 t.Fatal(err)
47 }
48 if !reflect.DeepEqual(testEas, eas) {
49 t.Fatalf("mismatch %+v %+v", testEas, eas)
50 }
51 }
52
53 func Test_TruncatedEasFailCorrectly(t *testing.T) {
54 _, err := DecodeExtendedAttributes(testEasTruncated)
55 if err == nil {
56 t.Fatal("expected error")
57 }
58 }
59
60 func Test_NilEasEncodeAndDecodeAsNil(t *testing.T) {
61 b, err := EncodeExtendedAttributes(nil)
62 if err != nil {
63 t.Fatal(err)
64 }
65 if len(b) != 0 {
66 t.Fatal("expected empty")
67 }
68 eas, err := DecodeExtendedAttributes(nil)
69 if err != nil {
70 t.Fatal(err)
71 }
72 if len(eas) != 0 {
73 t.Fatal("expected empty")
74 }
75 }
76
77
78 func Test_SetFileEa(t *testing.T) {
79 f, err := os.CreateTemp("", "winio")
80 if err != nil {
81 t.Fatal(err)
82 }
83 defer os.Remove(f.Name())
84 defer f.Close()
85 ntdll := syscall.MustLoadDLL("ntdll.dll")
86 ntSetEaFile := ntdll.MustFindProc("NtSetEaFile")
87 var iosb [2]uintptr
88 r, _, _ := ntSetEaFile.Call(f.Fd(),
89 uintptr(unsafe.Pointer(&iosb[0])),
90 uintptr(unsafe.Pointer(&testEasEncoded[0])),
91 uintptr(len(testEasEncoded)))
92 if r != 0 {
93 t.Fatalf("NtSetEaFile failed with %08x", r)
94 }
95 }
96
View as plain text