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