2017-12-29 22:13:47 +00:00
|
|
|
package proto_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2019-01-21 14:27:20 +00:00
|
|
|
"reflect"
|
2017-12-29 22:13:47 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
|
|
ppb "github.com/golang/protobuf/proto/proto3_proto"
|
|
|
|
)
|
|
|
|
|
2019-01-21 14:27:20 +00:00
|
|
|
func TestMap(t *testing.T) {
|
|
|
|
var b []byte
|
|
|
|
fmt.Sscanf("a2010c0a044b657931120456616c31a201130a044b657932120556616c3261120456616c32a201240a044b6579330d05000000120556616c33621a0556616c3361120456616c331505000000a20100a201260a044b657934130a07536f6d6555524c1209536f6d655469746c651a08536e69707065743114", "%x", &b)
|
|
|
|
|
|
|
|
var m ppb.Message
|
|
|
|
if err := proto.Unmarshal(b, &m); err != nil {
|
|
|
|
t.Fatalf("proto.Unmarshal error: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
got := m.StringMap
|
|
|
|
want := map[string]string{
|
|
|
|
"": "",
|
|
|
|
"Key1": "Val1",
|
|
|
|
"Key2": "Val2",
|
|
|
|
"Key3": "Val3",
|
|
|
|
"Key4": "",
|
|
|
|
}
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(got, want) {
|
|
|
|
t.Errorf("maps differ:\ngot %#v\nwant %#v", got, want)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-29 22:13:47 +00:00
|
|
|
func marshalled() []byte {
|
|
|
|
m := &ppb.IntMaps{}
|
|
|
|
for i := 0; i < 1000; i++ {
|
|
|
|
m.Maps = append(m.Maps, &ppb.IntMap{
|
|
|
|
Rtt: map[int32]int32{1: 2},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
b, err := proto.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("Can't marshal %+v: %v", m, err))
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkConcurrentMapUnmarshal(b *testing.B) {
|
|
|
|
in := marshalled()
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
|
|
for pb.Next() {
|
|
|
|
var out ppb.IntMaps
|
|
|
|
if err := proto.Unmarshal(in, &out); err != nil {
|
|
|
|
b.Errorf("Can't unmarshal ppb.IntMaps: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkSequentialMapUnmarshal(b *testing.B) {
|
|
|
|
in := marshalled()
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
var out ppb.IntMaps
|
|
|
|
if err := proto.Unmarshal(in, &out); err != nil {
|
|
|
|
b.Errorf("Can't unmarshal ppb.IntMaps: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|