...

Source file src/github.com/Microsoft/go-winio/ea_test.go

Documentation: github.com/Microsoft/go-winio

     1  //go:build windows
     2  // +build windows
     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  // Test_SetFileEa makes sure that the test buffer is actually parsable by NtSetEaFile.
    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