1package ndr 2 3import ( 4 "bytes" 5 "encoding/hex" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9) 10 11const ( 12 testUnionSelected1Enc = "0100000001" 13 testUnionSelected2Enc = "020000000200" 14 testUnionSelected1NonEnc = "010000000100000001" 15 testUnionSelected2NonEnc = "02000000020000000200" 16) 17 18type testUnionEncapsulated struct { 19 Tag uint32 `ndr:"unionTag,encapsulated"` 20 Value1 uint8 `ndr:"unionField"` 21 Value2 uint16 `ndr:"unionField"` 22} 23 24type testUnionNonEncapsulated struct { 25 Tag uint32 `ndr:"unionTag"` 26 Value1 uint8 `ndr:"unionField"` 27 Value2 uint16 `ndr:"unionField"` 28} 29 30func (u testUnionEncapsulated) SwitchFunc(tag interface{}) string { 31 t := tag.(uint32) 32 switch t { 33 case 1: 34 return "Value1" 35 case 2: 36 return "Value2" 37 } 38 return "" 39} 40 41func (u testUnionNonEncapsulated) SwitchFunc(tag interface{}) string { 42 t := tag.(uint32) 43 switch t { 44 case 1: 45 return "Value1" 46 case 2: 47 return "Value2" 48 } 49 return "" 50} 51 52func Test_readUnionEncapsulated(t *testing.T) { 53 var tests = []struct { 54 Hex string 55 Tag uint32 56 V1 uint8 57 V2 uint16 58 }{ 59 {testUnionSelected1Enc, uint32(1), uint8(1), uint16(0)}, 60 {testUnionSelected2Enc, uint32(2), uint8(0), uint16(2)}, 61 } 62 63 for i, test := range tests { 64 a := new(testUnionEncapsulated) 65 hexStr := TestHeader + test.Hex 66 b, _ := hex.DecodeString(hexStr) 67 dec := NewDecoder(bytes.NewReader(b)) 68 err := dec.Decode(a) 69 if err != nil { 70 t.Fatalf("test %d: %v", i+1, err) 71 } 72 assert.Equal(t, test.Tag, a.Tag, "Tag value not as expected for test: %d", i+1) 73 assert.Equal(t, test.V1, a.Value1, "Value1 not as expected for test: %d", i+1) 74 assert.Equal(t, test.V2, a.Value2, "Value2 value not as expected for test: %d", i+1) 75 76 } 77} 78 79func Test_readUnionNonEncapsulated(t *testing.T) { 80 var tests = []struct { 81 Hex string 82 Tag uint32 83 V1 uint8 84 V2 uint16 85 }{ 86 {testUnionSelected1NonEnc, uint32(1), uint8(1), uint16(0)}, 87 {testUnionSelected2NonEnc, uint32(2), uint8(0), uint16(2)}, 88 } 89 90 for i, test := range tests { 91 a := new(testUnionNonEncapsulated) 92 hexStr := TestHeader + test.Hex 93 b, _ := hex.DecodeString(hexStr) 94 dec := NewDecoder(bytes.NewReader(b)) 95 err := dec.Decode(a) 96 if err != nil { 97 t.Fatalf("test %d: %v", i+1, err) 98 } 99 assert.Equal(t, test.Tag, a.Tag, "Tag value not as expected for test: %d", i+1) 100 assert.Equal(t, test.V1, a.Value1, "Value1 not as expected for test: %d", i+1) 101 assert.Equal(t, test.V2, a.Value2, "Value2 value not as expected for test: %d", i+1) 102 103 } 104} 105