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  }