github.com/matm/etcd@v0.3.1-0.20140328024009-5b4a473f1453/third_party/code.google.com/p/gogoprotobuf/proto/clone_test.go (about) 1 // Go support for Protocol Buffers - Google's data interchange format 2 // 3 // Copyright 2011 The Go Authors. All rights reserved. 4 // http://code.google.com/p/goprotobuf/ 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are 8 // met: 9 // 10 // * Redistributions of source code must retain the above copyright 11 // notice, this list of conditions and the following disclaimer. 12 // * Redistributions in binary form must reproduce the above 13 // copyright notice, this list of conditions and the following disclaimer 14 // in the documentation and/or other materials provided with the 15 // distribution. 16 // * Neither the name of Google Inc. nor the names of its 17 // contributors may be used to endorse or promote products derived from 18 // this software without specific prior written permission. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 32 package proto_test 33 34 import ( 35 "testing" 36 37 "github.com/coreos/etcd/third_party/code.google.com/p/gogoprotobuf/proto" 38 39 pb "./testdata" 40 ) 41 42 var cloneTestMessage = &pb.MyMessage{ 43 Count: proto.Int32(42), 44 Name: proto.String("Dave"), 45 Pet: []string{"bunny", "kitty", "horsey"}, 46 Inner: &pb.InnerMessage{ 47 Host: proto.String("niles"), 48 Port: proto.Int32(9099), 49 Connected: proto.Bool(true), 50 }, 51 Others: []*pb.OtherMessage{ 52 { 53 Value: []byte("some bytes"), 54 }, 55 }, 56 Somegroup: &pb.MyMessage_SomeGroup{ 57 GroupField: proto.Int32(6), 58 }, 59 RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, 60 } 61 62 func init() { 63 ext := &pb.Ext{ 64 Data: proto.String("extension"), 65 } 66 if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { 67 panic("SetExtension: " + err.Error()) 68 } 69 } 70 71 func TestClone(t *testing.T) { 72 m := proto.Clone(cloneTestMessage).(*pb.MyMessage) 73 if !proto.Equal(m, cloneTestMessage) { 74 t.Errorf("Clone(%v) = %v", cloneTestMessage, m) 75 } 76 77 // Verify it was a deep copy. 78 *m.Inner.Port++ 79 if proto.Equal(m, cloneTestMessage) { 80 t.Error("Mutating clone changed the original") 81 } 82 } 83 84 func TestCloneNil(t *testing.T) { 85 var m *pb.MyMessage 86 if c := proto.Clone(m); !proto.Equal(m, c) { 87 t.Errorf("Clone(%v) = %v", m, c) 88 } 89 } 90 91 var mergeTests = []struct { 92 src, dst, want proto.Message 93 }{ 94 { 95 src: &pb.MyMessage{ 96 Count: proto.Int32(42), 97 }, 98 dst: &pb.MyMessage{ 99 Name: proto.String("Dave"), 100 }, 101 want: &pb.MyMessage{ 102 Count: proto.Int32(42), 103 Name: proto.String("Dave"), 104 }, 105 }, 106 { 107 src: &pb.MyMessage{ 108 Inner: &pb.InnerMessage{ 109 Host: proto.String("hey"), 110 Connected: proto.Bool(true), 111 }, 112 Pet: []string{"horsey"}, 113 Others: []*pb.OtherMessage{ 114 { 115 Value: []byte("some bytes"), 116 }, 117 }, 118 }, 119 dst: &pb.MyMessage{ 120 Inner: &pb.InnerMessage{ 121 Host: proto.String("niles"), 122 Port: proto.Int32(9099), 123 }, 124 Pet: []string{"bunny", "kitty"}, 125 Others: []*pb.OtherMessage{ 126 { 127 Key: proto.Int64(31415926535), 128 }, 129 { 130 // Explicitly test a src=nil field 131 Inner: nil, 132 }, 133 }, 134 }, 135 want: &pb.MyMessage{ 136 Inner: &pb.InnerMessage{ 137 Host: proto.String("hey"), 138 Connected: proto.Bool(true), 139 Port: proto.Int32(9099), 140 }, 141 Pet: []string{"bunny", "kitty", "horsey"}, 142 Others: []*pb.OtherMessage{ 143 { 144 Key: proto.Int64(31415926535), 145 }, 146 {}, 147 { 148 Value: []byte("some bytes"), 149 }, 150 }, 151 }, 152 }, 153 { 154 src: &pb.MyMessage{ 155 RepBytes: [][]byte{[]byte("wow")}, 156 }, 157 dst: &pb.MyMessage{ 158 Somegroup: &pb.MyMessage_SomeGroup{ 159 GroupField: proto.Int32(6), 160 }, 161 RepBytes: [][]byte{[]byte("sham")}, 162 }, 163 want: &pb.MyMessage{ 164 Somegroup: &pb.MyMessage_SomeGroup{ 165 GroupField: proto.Int32(6), 166 }, 167 RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, 168 }, 169 }, 170 } 171 172 func TestMerge(t *testing.T) { 173 for _, m := range mergeTests { 174 got := proto.Clone(m.dst) 175 proto.Merge(got, m.src) 176 if !proto.Equal(got, m.want) { 177 t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) 178 } 179 } 180 }