123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- package ndr
- import (
- "bytes"
- "encoding/hex"
- "fmt"
- "reflect"
- "testing"
- "github.com/stretchr/testify/assert"
- )
- const TestHeader = "01100800cccccccca00400000000000000000200"
- func TestParseDimensions(t *testing.T) {
- a := [2][2][2][]SimpleTest{}
- l, ta := parseDimensions(reflect.ValueOf(a))
- assert.Equal(t, 4, len(l), "dimension count not as expected")
- assert.Equal(t, []int{2, 2, 2, 0}, l, "lengths list not as expected")
- assert.Equal(t, "SimpleTest", ta.Name(), "type within array not as expected")
- }
- func TestMakeSubSlices(t *testing.T) {
- l := []int{2, 5, 3, 1}
- a := new([][][][]uint32)
- v := reflect.ValueOf(a)
- v = v.Elem()
- ty := v.Type()
- s := reflect.MakeSlice(ty, l[0], l[0])
- v.Set(s)
- makeSubSlices(v, l[1:])
- assert.Equal(t, "[[[[0] [0] [0]] [[0] [0] [0]] [[0] [0] [0]] [[0] [0] [0]] [[0] [0] [0]]] [[[0] [0] [0]] [[0] [0] [0]] [[0] [0] [0]] [[0] [0] [0]] [[0] [0] [0]]]]", fmt.Sprintf("%v", *a))
- }
- func TestDimensionCountFromTag(t *testing.T) {
- var a StructWithMultiDimensionalConformantSlice
- v := reflect.ValueOf(a)
- d, err := intFromTag(v.Type().Field(0).Tag, "test")
- if err != nil {
- t.Errorf("error getting dimensions from tag: %v", err)
- }
- assert.Equal(t, 3, d, "number of dimensions not as expected")
- }
- type StructWithArray struct {
- A [4]uint32
- }
- type StructWithMultiDimArray struct {
- A [2][3][2]uint32
- }
- type StructWithConformantSlice struct {
- A []uint32 `ndr:"conformant"`
- }
- type StructWithVaryingSlice struct {
- A []uint32 `ndr:"varying"`
- }
- type StructWithConformantVaryingSlice struct {
- A []uint32 `ndr:"conformant,varying"`
- }
- type StructWithMultiDimensionalConformantSlice struct {
- A [][][]uint32 `ndr:"conformant,test:3"`
- }
- type StructWithMultiDimensionalVaryingSlice struct {
- A [][][]uint32 `ndr:"varying"`
- }
- type StructWithMultiDimensionalConformantVaryingSlice struct {
- A [][][]uint32 `ndr:"conformant,varying"`
- }
- func TestReadUniDimensionalFixedArray(t *testing.T) {
- hexStr := TestHeader + "01000000020000000300000004000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithArray)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- for i := range a.A {
- assert.Equal(t, uint32(i+1), a.A[i], "Value of index %d not as expected", i)
- }
- }
- func TestReadMultiDimensionalFixedArray(t *testing.T) {
- hexStr := TestHeader + "0100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f0000002000000021000000220000002300000024000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithMultiDimArray)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- ar := [2][3][2]uint32{
- {
- {1, 2},
- {3, 4},
- {5, 6},
- },
- {
- {7, 8},
- {9, 10},
- {11, 12},
- },
- }
- assert.Equal(t, ar, a.A, "multi-dimensional fixed array not as expected")
- }
- func TestReadUniDimensionalConformantArray(t *testing.T) {
- hexStr := TestHeader + "0400000001000000020000000300000004000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithConformantSlice)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- for i := range a.A {
- assert.Equal(t, uint32(i+1), a.A[i], "Value of index %d not as expected", i)
- }
- }
- func TestReadMultiDimensionalConformantArray(t *testing.T) {
- hexStr := TestHeader + "0200000003000000020000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f0000002000000021000000220000002300000024000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithMultiDimensionalConformantSlice)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- ar := [][][]uint32{
- {
- {1, 2},
- {3, 4},
- {5, 6},
- },
- {
- {7, 8},
- {9, 10},
- {11, 12},
- },
- }
- assert.Equal(t, ar, a.A, "multi-dimensional conformant array not as expected")
- }
- func TestReadUniDimensionalVaryingArray(t *testing.T) {
- hexStr := TestHeader + "000000000400000001000000020000000300000004000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithVaryingSlice)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- for i := range a.A {
- assert.Equal(t, uint32(i+1), a.A[i], "Value of index %d not as expected", i)
- }
- }
- func TestReadMultiDimensionalVaryingArray(t *testing.T) {
- hexStr := TestHeader + "0000000002000000000000000300000000000000020000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f0000002000000021000000220000002300000024000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithMultiDimensionalVaryingSlice)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- ar := [][][]uint32{
- {
- {1, 2},
- {3, 4},
- {5, 6},
- },
- {
- {7, 8},
- {9, 10},
- {11, 12},
- },
- }
- assert.Equal(t, ar, a.A, "multi-dimensional conformant varying array not as expected")
- }
- func TestReadUniDimensionalConformantVaryingArray(t *testing.T) {
- hexStr := TestHeader + "04000000000000000400000001000000020000000300000004000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithConformantVaryingSlice)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- for i := range a.A {
- assert.Equal(t, uint32(i+1), a.A[i], "Value of index %d not as expected", i)
- }
- }
- func TestReadMultiDimensionalConformantVaryingArray(t *testing.T) {
- hexStr := TestHeader + "0200000003000000020000000000000002000000000000000300000000000000020000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f0000002000000021000000220000002300000024000000"
- b, _ := hex.DecodeString(hexStr)
- a := new(StructWithMultiDimensionalConformantVaryingSlice)
- dec := NewDecoder(bytes.NewReader(b))
- err := dec.Decode(a)
- if err != nil {
- t.Fatalf("%v", err)
- }
- ar := [][][]uint32{
- {
- {1, 2},
- {3, 4},
- {5, 6},
- },
- {
- {7, 8},
- {9, 10},
- {11, 12},
- },
- }
- assert.Equal(t, ar, a.A, "multi-dimensional conformant varying array not as expected")
- }
|