package rpc import ( "bytes" "testing" ) type encd struct { l []byte f []byte } type varsTest struct { vs Vars msg []byte //headerless expected byte string e map[string]encd } var protoVars = Vars{ "cmpfile": "", "client": "76", "api": "99999", "enableStreams": "", "host": "brett-mint", "port": "localhost:8192", "sndbuf": "98303", "rcvbuf": "796356", "func": "protocol", } var protoVarsTest = &varsTest{ vs: protoVars, msg: []byte{99, 109, 112, 102, 105, 108, 101, 0, 0, 0, 0, 0, 0, 99, 108, 105, 101, 110, 116, 0, 2, 0, 0, 0, 55, 54, 0, 97, 112, 105, 0, 5, 0, 0, 0, 57, 57, 57, 57, 57, 0, 101, 110, 97, 98, 108, 101, 83, 116, 114, 101, 97, 109, 115, 0, 0, 0, 0, 0, 0, 104, 111, 115, 116, 0, 10, 0, 0, 0, 98, 114, 101, 116, 116, 45, 109, 105, 110, 116, 0, 112, 111, 114, 116, 0, 14, 0, 0, 0, 108, 111, 99, 97, 108, 104, 111, 115, 116, 58, 56, 49, 57, 50, 0, 115, 110, 100, 98, 117, 102, 0, 5, 0, 0, 0, 57, 56, 51, 48, 51, 0, 114, 99, 118, 98, 117, 102, 0, 6, 0, 0, 0, 55, 57, 54, 51, 53, 54, 0, 102, 117, 110, 99, 0, 8, 0, 0, 0, 112, 114, 111, 116, 111, 99, 111, 108, 0}, e: map[string]encd{ "cmpfile": encd{ l: []byte{0, 0, 0, 0}, f: []byte{99, 109, 112, 102, 105, 108, 101, 0, 0, 0, 0, 0, 0}, }, "client": encd{ l: []byte{2, 0, 0, 0, 0}, f: []byte{99, 108, 105, 101, 110, 116, 0, 2, 0, 0, 0, 55, 54, 0}, }, "api": encd{ l: []byte{5, 0, 0, 0}, f: []byte{97, 112, 105, 0, 5, 0, 0, 0, 57, 57, 57, 57, 57, 0}, }, "enableStreams": encd{ l: []byte{0, 0, 0, 0}, f: []byte{101, 110, 97, 98, 108, 101, 83, 116, 114, 101, 97, 109, 115, 0, 0, 0, 0, 0, 0}, }, "host": encd{ l: []byte{10, 0, 0, 0}, f: []byte{104, 111, 115, 116, 0, 10, 0, 0, 0, 98, 114, 101, 116, 116, 45, 109, 105, 110, 116, 0}, }, "port": encd{ l: []byte{14, 0, 0, 0}, f: []byte{112, 111, 114, 116, 0, 14, 0, 0, 0, 108, 111, 99, 97, 108, 104, 111, 115, 116, 58, 56, 49, 57, 50, 0}, }, "sndbuf": encd{ l: []byte{5, 0, 0, 0}, f: []byte{115, 110, 100, 98, 117, 102, 0, 5, 0, 0, 0, 57, 56, 51, 48, 51, 0}, }, "rcvbuf": encd{ l: []byte{6, 0, 0, 0}, f: []byte{114, 99, 118, 98, 117, 102, 0, 6, 0, 0, 0, 55, 57, 54, 51, 53, 54, 0}, }, "func": encd{ l: []byte{8, 0, 0, 0}, f: []byte{102, 117, 110, 99, 0, 8, 0, 0, 0, 112, 114, 111, 116, 111, 99, 111, 108, 0}, }, }, } var infoVars = Vars{ "prog": "p4", "version": "2014.1/LINUX26X86_64/821990", "client": "brett-mint", "cwd": "/home/brett/go/src/p4", "host": "brett-mint", "os": "UNIX", "user": "brett", "charset": "1", "func": "user-info", } var infoVarsTest = &varsTest{ vs: infoVars, msg: []byte{112, 114, 111, 103, 0, 2, 0, 0, 0, 112, 52, 0, 118, 101, 114, 115, 105, 111, 110, 0, 27, 0, 0, 0, 50, 48, 49, 52, 46, 49, 47, 76, 73, 78, 85, 88, 50, 54, 88, 56, 54, 95, 54, 52, 47, 56, 50, 49, 57, 57, 48, 0, 99, 108, 105, 101, 110, 116, 0, 10, 0, 0, 0, 98, 114, 101, 116, 116, 45, 109, 105, 110, 116, 0, 99, 119, 100, 0, 21, 0, 0, 0, 47, 104, 111, 109, 101, 47, 98, 114, 101, 116, 116, 47, 103, 111, 47, 115, 114, 99, 47, 112, 52, 0, 104, 111, 115, 116, 0, 10, 0, 0, 0, 98, 114, 101, 116, 116, 45, 109, 105, 110, 116, 0, 111, 115, 0, 4, 0, 0, 0, 85, 78, 73, 88, 0, 117, 115, 101, 114, 0, 5, 0, 0, 0, 98, 114, 101, 116, 116, 0, 99, 104, 97, 114, 115, 101, 116, 0, 1, 0, 0, 0, 49, 0, 102, 117, 110, 99, 0, 9, 0, 0, 0, 117, 115, 101, 114, 45, 105, 110, 102, 111, 0}, e: map[string]encd{ "prog": encd{ l: []byte{2, 0, 0, 0}, f: []byte{112, 114, 111, 103, 0, 2, 0, 0, 0, 112, 52, 0}, }, "version": encd{ l: []byte{27, 0, 0, 0}, f: []byte{118, 101, 114, 115, 105, 111, 110, 0, 27, 0, 0, 0, 50, 48, 49, 52, 46, 49, 47, 76, 73, 78, 85, 88, 50, 54, 88, 56, 54, 95, 54, 52, 47, 56, 50, 49, 57, 57, 48, 0}, }, "client": encd{ l: []byte{10, 0, 0, 0}, f: []byte{99, 108, 105, 101, 110, 116, 0, 10, 0, 0, 0, 98, 114, 101, 116, 116, 45, 109, 105, 110, 116, 0}, }, "cwd": encd{ l: []byte{21, 0, 0, 0}, f: []byte{99, 119, 100, 0, 21, 0, 0, 0, 47, 104, 111, 109, 101, 47, 98, 114, 101, 116, 116, 47, 103, 111, 47, 115, 114, 99, 47, 112, 52, 0}, }, "host": encd{ l: []byte{10, 0, 0, 0}, f: []byte{104, 111, 115, 116, 0, 10, 0, 0, 0, 98, 114, 101, 116, 116, 45, 109, 105, 110, 116, 0}, }, "os": encd{ l: []byte{4, 0, 0, 0}, f: []byte{111, 115, 0, 4, 0, 0, 0, 85, 78, 73, 88, 0}, }, "user": encd{ l: []byte{5, 0, 0, 0}, f: []byte{117, 115, 101, 114, 0, 5, 0, 0, 0, 98, 114, 101, 116, 116, 0}, }, "charset": encd{ l: []byte{1, 0, 0, 0}, f: []byte{99, 104, 97, 114, 115, 101, 116, 0, 1, 0, 0, 0, 49, 0}, }, "func": encd{ l: []byte{9, 0, 0, 0}, f: []byte{102, 117, 110, 99, 0, 9, 0, 0, 0, 117, 115, 101, 114, 45, 105, 110, 102, 111, 0}, }, }, } var varsTests = []*varsTest{ protoVarsTest, infoVarsTest, } func TestLen(t *testing.T) { for _, vt := range varsTests { for k, v := range vt.vs { bout := encodeLength(len(v)) for i, b := range bout { if b != vt.e[k].l[i] { t.Errorf("Expected Len of %+v to be %+v got %+v", vt.vs[k], vt.e[k].l, bout) } } } } } func TestMarshalBinary(t *testing.T) { /* For testing MarshalBinary since we are you using a map we don't know the order of the byte arrays, just have to check they are somewhere in the output */ for _, vt := range varsTests { bout, err := vt.vs.MarshalBinary() if err != nil { t.Errorf("Got err %s Marshaling binary from %+v", err, vt.vs) } for k, v := range vt.vs { if !bytes.Contains(bout, vt.e[k].f) { t.Errorf("Expected the byte slice for %s: %s \n(%+v) to be in \n%+v\n, slice not found", k, v, vt.e[k].f, bout) } } } } func TestUnmarshalBinary(t *testing.T) { for _, vt := range varsTests { vs := NewVars() err := vs.UnmarshalBinary(vt.msg) if err != nil { t.Errorf("Got err %s Unmarshaling binary from %+v", err, vt.msg) } for k, v := range vt.vs { vo, ok := vs[k] if !ok { t.Errorf("Could not find key %s in %+v", k, vs) } else if vo != v { t.Errorf(`Expected unmarshalbinary of %+v to create a Vars map with key: "%s" with value: "%s", got key: "%s" value: "%s"`, vt.msg, k, v, k, vo) } } } }