func TestRoundTripProto3(t *testing.T) { m := &pb.Message{ Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" ResultCount: 47, // (0 | 7<<3): 0x38 0x2f TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 Score: 8.1, // (5 | 9<<3): 0x4d <8.1> Key: []uint64{1, 0xdeadbeef}, Nested: &pb.Nested{ Bunny: "Monty", }, } t.Logf(" m: %v", m) b, err := proto.Marshal(m) if err != nil { t.Fatalf("proto.Marshal: %v", err) } t.Logf(" b: %q", b) m2 := new(pb.Message) if err := proto.Unmarshal(b, m2); err != nil { t.Fatalf("proto.Unmarshal: %v", err) } t.Logf("m2: %v", m2) if !proto.Equal(m, m2) { t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) } }
func TestGetExtensionStability(t *testing.T) { check := func(m *pb.MyMessage) bool { ext1, err := proto.GetExtension(m, pb.E_Ext_More) if err != nil { t.Fatalf("GetExtension() failed: %s", err) } ext2, err := proto.GetExtension(m, pb.E_Ext_More) if err != nil { t.Fatalf("GetExtension() failed: %s", err) } return ext1 == ext2 } msg := &pb.MyMessage{Count: proto.Int32(4)} ext0 := &pb.Ext{} if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { t.Fatalf("Could not set ext1: %s", ext0) } if !check(msg) { t.Errorf("GetExtension() not stable before marshaling") } bb, err := proto.Marshal(msg) if err != nil { t.Fatalf("Marshal() failed: %s", err) } msg1 := &pb.MyMessage{} err = proto.Unmarshal(bb, msg1) if err != nil { t.Fatalf("Unmarshal() failed: %s", err) } if !check(msg1) { t.Errorf("GetExtension() not stable after unmarshaling") } }
//VerifyProtoRepresenting returns a handler that verifies that the body of the request is a valid protobuf //representation of the passed message. // //VerifyProtoRepresenting also verifies that the request's content type is application/x-protobuf func VerifyProtoRepresenting(expected proto.Message) http.HandlerFunc { return CombineHandlers( VerifyContentType("application/x-protobuf"), func(w http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) Ω(err).ShouldNot(HaveOccurred()) req.Body.Close() expectedType := reflect.TypeOf(expected) actualValuePtr := reflect.New(expectedType.Elem()) actual, ok := actualValuePtr.Interface().(proto.Message) Ω(ok).Should(BeTrue(), "Message value is not a proto.Message") err = proto.Unmarshal(body, actual) Ω(err).ShouldNot(HaveOccurred(), "Failed to unmarshal protobuf") Ω(actual).Should(Equal(expected), "ProtoBuf Mismatch") }, ) }
BeforeEach(func() { s.AppendHandlers(CombineHandlers( VerifyRequest("POST", "/proto"), RespondWithProto(http.StatusCreated, message), )) }) It("should return the response", func() { resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) Ω(err).ShouldNot(HaveOccurred()) Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) var received protobuf.SimpleMessage body, err := ioutil.ReadAll(resp.Body) err = proto.Unmarshal(body, &received) Ω(err).ShouldNot(HaveOccurred()) }) It("should set the Content-Type header to application/x-protobuf", func() { resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) Ω(err).ShouldNot(HaveOccurred()) Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/x-protobuf"})) }) }) Context("when optional headers are set", func() { var headers http.Header BeforeEach(func() { headers = http.Header{"Stuff": []string{"things"}}