github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/golang/protobuf/protoc-gen-go/testdata/extension_test.go (about)

     1  // Go support for Protocol Buffers - Google's data interchange format
     2  //
     3  // Copyright 2010 The Go Authors.  All rights reserved.
     4  // https://yougam/libraries/golang/protobuf
     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  // Test that we can use protocol buffers that use extensions.
    33  
    34  package testdata
    35  
    36  /*
    37  
    38  import (
    39  	"bytes"
    40  	"regexp"
    41  	"testing"
    42  
    43  	"github.com/insionng/yougam/libraries/golang/protobuf/proto"
    44  	base "extension_base.pb"
    45  	user "extension_user.pb"
    46  )
    47  
    48  func TestSingleFieldExtension(t *testing.T) {
    49  	bm := &base.BaseMessage{
    50  		Height: proto.Int32(178),
    51  	}
    52  
    53  	// Use extension within scope of another type.
    54  	vol := proto.Uint32(11)
    55  	err := proto.SetExtension(bm, user.E_LoudMessage_Volume, vol)
    56  	if err != nil {
    57  		t.Fatal("Failed setting extension:", err)
    58  	}
    59  	buf, err := proto.Marshal(bm)
    60  	if err != nil {
    61  		t.Fatal("Failed encoding message with extension:", err)
    62  	}
    63  	bm_new := new(base.BaseMessage)
    64  	if err := proto.Unmarshal(buf, bm_new); err != nil {
    65  		t.Fatal("Failed decoding message with extension:", err)
    66  	}
    67  	if !proto.HasExtension(bm_new, user.E_LoudMessage_Volume) {
    68  		t.Fatal("Decoded message didn't contain extension.")
    69  	}
    70  	vol_out, err := proto.GetExtension(bm_new, user.E_LoudMessage_Volume)
    71  	if err != nil {
    72  		t.Fatal("Failed getting extension:", err)
    73  	}
    74  	if v := vol_out.(*uint32); *v != *vol {
    75  		t.Errorf("vol_out = %v, expected %v", *v, *vol)
    76  	}
    77  	proto.ClearExtension(bm_new, user.E_LoudMessage_Volume)
    78  	if proto.HasExtension(bm_new, user.E_LoudMessage_Volume) {
    79  		t.Fatal("Failed clearing extension.")
    80  	}
    81  }
    82  
    83  func TestMessageExtension(t *testing.T) {
    84  	bm := &base.BaseMessage{
    85  		Height: proto.Int32(179),
    86  	}
    87  
    88  	// Use extension that is itself a message.
    89  	um := &user.UserMessage{
    90  		Name: proto.String("Dave"),
    91  		Rank: proto.String("Major"),
    92  	}
    93  	err := proto.SetExtension(bm, user.E_LoginMessage_UserMessage, um)
    94  	if err != nil {
    95  		t.Fatal("Failed setting extension:", err)
    96  	}
    97  	buf, err := proto.Marshal(bm)
    98  	if err != nil {
    99  		t.Fatal("Failed encoding message with extension:", err)
   100  	}
   101  	bm_new := new(base.BaseMessage)
   102  	if err := proto.Unmarshal(buf, bm_new); err != nil {
   103  		t.Fatal("Failed decoding message with extension:", err)
   104  	}
   105  	if !proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) {
   106  		t.Fatal("Decoded message didn't contain extension.")
   107  	}
   108  	um_out, err := proto.GetExtension(bm_new, user.E_LoginMessage_UserMessage)
   109  	if err != nil {
   110  		t.Fatal("Failed getting extension:", err)
   111  	}
   112  	if n := um_out.(*user.UserMessage).Name; *n != *um.Name {
   113  		t.Errorf("um_out.Name = %q, expected %q", *n, *um.Name)
   114  	}
   115  	if r := um_out.(*user.UserMessage).Rank; *r != *um.Rank {
   116  		t.Errorf("um_out.Rank = %q, expected %q", *r, *um.Rank)
   117  	}
   118  	proto.ClearExtension(bm_new, user.E_LoginMessage_UserMessage)
   119  	if proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) {
   120  		t.Fatal("Failed clearing extension.")
   121  	}
   122  }
   123  
   124  func TestTopLevelExtension(t *testing.T) {
   125  	bm := &base.BaseMessage{
   126  		Height: proto.Int32(179),
   127  	}
   128  
   129  	width := proto.Int32(17)
   130  	err := proto.SetExtension(bm, user.E_Width, width)
   131  	if err != nil {
   132  		t.Fatal("Failed setting extension:", err)
   133  	}
   134  	buf, err := proto.Marshal(bm)
   135  	if err != nil {
   136  		t.Fatal("Failed encoding message with extension:", err)
   137  	}
   138  	bm_new := new(base.BaseMessage)
   139  	if err := proto.Unmarshal(buf, bm_new); err != nil {
   140  		t.Fatal("Failed decoding message with extension:", err)
   141  	}
   142  	if !proto.HasExtension(bm_new, user.E_Width) {
   143  		t.Fatal("Decoded message didn't contain extension.")
   144  	}
   145  	width_out, err := proto.GetExtension(bm_new, user.E_Width)
   146  	if err != nil {
   147  		t.Fatal("Failed getting extension:", err)
   148  	}
   149  	if w := width_out.(*int32); *w != *width {
   150  		t.Errorf("width_out = %v, expected %v", *w, *width)
   151  	}
   152  	proto.ClearExtension(bm_new, user.E_Width)
   153  	if proto.HasExtension(bm_new, user.E_Width) {
   154  		t.Fatal("Failed clearing extension.")
   155  	}
   156  }
   157  
   158  func TestMessageSetWireFormat(t *testing.T) {
   159  	osm := new(base.OldStyleMessage)
   160  	osp := &user.OldStyleParcel{
   161  		Name:   proto.String("Dave"),
   162  		Height: proto.Int32(178),
   163  	}
   164  
   165  	err := proto.SetExtension(osm, user.E_OldStyleParcel_MessageSetExtension, osp)
   166  	if err != nil {
   167  		t.Fatal("Failed setting extension:", err)
   168  	}
   169  
   170  	buf, err := proto.Marshal(osm)
   171  	if err != nil {
   172  		t.Fatal("Failed encoding message:", err)
   173  	}
   174  
   175  	// Data generated from Python implementation.
   176  	expected := []byte{
   177  		11, 16, 209, 15, 26, 9, 10, 4, 68, 97, 118, 101, 16, 178, 1, 12,
   178  	}
   179  
   180  	if !bytes.Equal(expected, buf) {
   181  		t.Errorf("Encoding mismatch.\nwant %+v\n got %+v", expected, buf)
   182  	}
   183  
   184  	// Check that it is restored correctly.
   185  	osm = new(base.OldStyleMessage)
   186  	if err := proto.Unmarshal(buf, osm); err != nil {
   187  		t.Fatal("Failed decoding message:", err)
   188  	}
   189  	osp_out, err := proto.GetExtension(osm, user.E_OldStyleParcel_MessageSetExtension)
   190  	if err != nil {
   191  		t.Fatal("Failed getting extension:", err)
   192  	}
   193  	osp = osp_out.(*user.OldStyleParcel)
   194  	if *osp.Name != "Dave" || *osp.Height != 178 {
   195  		t.Errorf("Retrieved extension from decoded message is not correct: %+v", osp)
   196  	}
   197  }
   198  
   199  func main() {
   200  	// simpler than rigging up gotest
   201  	testing.Main(regexp.MatchString, []testing.InternalTest{
   202  		{"TestSingleFieldExtension", TestSingleFieldExtension},
   203  		{"TestMessageExtension", TestMessageExtension},
   204  		{"TestTopLevelExtension", TestTopLevelExtension},
   205  	},
   206  		[]testing.InternalBenchmark{},
   207  		[]testing.InternalExample{})
   208  }
   209  
   210  */