blob: e6edc530ecddb49436e922dfb481ae40dacab265 [file] [log] [blame]
// Protocol Buffers for Go with Gadgets
//
// Copyright (c) 2018, The GoGo Authors. All rights reserved.
// http://github.com/gogo/protobuf
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package deterministic
import (
"bytes"
"github.com/gogo/protobuf/proto"
"testing"
)
func getTestMap() map[string]string {
return map[string]string{
"a": "1",
"b": "2",
"c": "3",
"d": "4",
"e": "5",
"f": "6",
"g": "7",
"h": "8",
"i": "9",
"j": "10",
"k": "11",
"l": "12",
"m": "13",
"n": "14",
}
}
func TestOrderedMap(t *testing.T) {
var b proto.Buffer
m := getTestMap()
in := &OrderedMap{
StringMap: m,
}
if err := b.Marshal(in); err != nil {
t.Fatalf("Marshal failed: %v", err)
}
data1 := b.Bytes()
out := &OrderedMap{}
if err := proto.Unmarshal(data1, out); err != nil {
t.Fatal(err)
}
if err := in.VerboseEqual(out); err != nil {
t.Fatal(err)
}
data2, err := proto.Marshal(in)
if err != nil {
t.Fatal(err)
}
if bytes.Compare(data1, data2) != 0 {
t.Fatal("byte arrays are not the same\n", data1, "\n", data2)
}
}
func TestUnorderedMap(t *testing.T) {
m := getTestMap()
in := &UnorderedMap{
StringMap: m,
}
var b proto.Buffer
b.SetDeterministic(true)
if err := b.Marshal(in); err == nil {
t.Fatalf("Expected Marshal to return error rejecting deterministic flag")
}
}
func TestMapNoMarshaler(t *testing.T) {
m := getTestMap()
in := &MapNoMarshaler{
StringMap: m,
}
var b1 proto.Buffer
b1.SetDeterministic(true)
if err := b1.Marshal(in); err != nil {
t.Fatalf("Marshal failed: %v", err)
}
data1 := b1.Bytes()
out := &MapNoMarshaler{}
err := proto.Unmarshal(data1, out)
if err != nil {
t.Fatal(err)
}
if err := in.VerboseEqual(out); err != nil {
t.Fatal(err)
}
var b2 proto.Buffer
b2.SetDeterministic(true)
if err := b2.Marshal(in); err != nil {
t.Fatalf("Marshal failed: %v", err)
}
data2 := b2.Bytes()
if bytes.Compare(data1, data2) != 0 {
t.Fatal("byte arrays are not the same:\n", data1, "\n", data2)
}
}
func TestOrderedNestedMap(t *testing.T) {
var b proto.Buffer
in := &NestedOrderedMap{
StringMap: getTestMap(),
NestedMap: &NestedMap1{
NestedStringMap: getTestMap(),
},
}
if err := b.Marshal(in); err != nil {
t.Fatalf("Marshal failed: %v", err)
}
data1 := b.Bytes()
out := &NestedOrderedMap{}
if err := proto.Unmarshal(data1, out); err != nil {
t.Fatal(err)
}
if err := in.VerboseEqual(out); err != nil {
t.Fatal(err)
}
data2, err := proto.Marshal(in)
if err != nil {
t.Fatal(err)
}
if bytes.Compare(data1, data2) != 0 {
t.Fatal("byte arrays are not the same\n", data1, "\n", data2)
}
}
func TestUnorderedNestedMap(t *testing.T) {
in := &NestedUnorderedMap{
StringMap: getTestMap(),
NestedMap: &NestedMap2{
NestedStringMap: getTestMap(),
},
}
var b proto.Buffer
b.SetDeterministic(true)
if err := b.Marshal(in); err == nil {
t.Fatalf("Expected Marshal to return error rejecting deterministic flag")
}
}
func TestOrderedNestedStructMap(t *testing.T) {
var b proto.Buffer
m := getTestMap()
in := &NestedMap1{
NestedStringMap: m,
}
if err := b.Marshal(in); err != nil {
t.Fatalf("Marshal failed: %v", err)
}
data1 := b.Bytes()
out := &NestedMap1{}
if err := proto.Unmarshal(data1, out); err != nil {
t.Fatal(err)
}
if err := in.VerboseEqual(out); err != nil {
t.Fatal(err)
}
data2, err := proto.Marshal(in)
if err != nil {
t.Fatal(err)
}
if bytes.Compare(data1, data2) != 0 {
t.Fatal("byte arrays are not the same\n", data1, "\n", data2)
}
}
func TestUnorderedNestedStructMap(t *testing.T) {
m := getTestMap()
in := &NestedMap2{
NestedStringMap: m,
}
var b proto.Buffer
b.SetDeterministic(true)
if err := b.Marshal(in); err == nil {
t.Fatalf("Expected Marshal to return error rejecting deterministic flag")
}
}