@@ -5,14 +5,16 @@ import (
55 "bytes"
66 "context"
77 "encoding/json"
8- "google.golang.org/protobuf/proto"
98 "io/ioutil"
109 "strings"
1110 "testing"
1211
12+ legacyproto "github.com/golang/protobuf/proto"
1313 "github.com/stretchr/testify/assert"
1414 "github.com/stretchr/testify/require"
15+ "google.golang.org/protobuf/proto"
1516
17+ "github.com/monzo/typhon/legacyprototest"
1618 "github.com/monzo/typhon/prototest"
1719)
1820
@@ -33,6 +35,90 @@ func TestRequestDecodeCloses(t *testing.T) {
3335 }
3436}
3537
38+ func TestRequestDecodeJSONStruct (t * testing.T ) {
39+ req := NewRequest (nil , "GET" , "/" , nil )
40+ b := []byte ("{\" message\" :\" Hello world!\" }\n " )
41+ r := newDoneReader (ioutil .NopCloser (bytes .NewReader (b )), - 1 )
42+ req .Body = r
43+
44+ g := & struct {
45+ Message string `json:"message"`
46+ }{}
47+ err := req .Decode (g )
48+ assert .NoError (t , err )
49+ assert .Equal (t , "Hello world!" , g .Message )
50+ }
51+
52+ func TestRequestDecodeProto (t * testing.T ) {
53+ generateRequest := func () Request {
54+ req := NewRequest (nil , "GET" , "/" , nil )
55+ b , _ := proto .Marshal (& prototest.Greeting {Message : "Hello world!" })
56+ r := newDoneReader (ioutil .NopCloser (bytes .NewReader (b )), - 1 )
57+ req .Header .Set ("Content-Type" , "application/protobuf" )
58+ req .Body = r
59+ return req
60+ }
61+
62+ req1 := generateRequest ()
63+ g1 := & prototest.Greeting {}
64+ err := req1 .Decode (g1 )
65+ assert .NoError (t , err )
66+ assert .Equal (t , "Hello world!" , g1 .Message )
67+
68+ req2 := generateRequest ()
69+ g2 := & legacyprototest.LegacyGreeting {}
70+ err = req2 .Decode (g2 )
71+ assert .NoError (t , err )
72+ assert .Equal (t , "Hello world!" , g2 .Message )
73+ }
74+
75+ func TestRequestDecodeProtoMaskingAsJSON (t * testing.T ) {
76+ req := NewRequest (nil , "GET" , "/" , nil )
77+ b := []byte ("{\" message\" :\" Hello world!\" }\n " )
78+ r := newDoneReader (ioutil .NopCloser (bytes .NewReader (b )), - 1 )
79+ req .Body = r
80+
81+ g := & prototest.Greeting {}
82+ err := req .Decode (g )
83+ assert .NoError (t , err )
84+ assert .Equal (t , "Hello world!" , g .Message )
85+ }
86+
87+ func TestRequestDecodeLegacyProto (t * testing.T ) {
88+ generateRequest := func () Request {
89+ req := NewRequest (nil , "GET" , "/" , nil )
90+ b , _ := legacyproto .Marshal (& legacyprototest.LegacyGreeting {Message : "Hello world!" })
91+ r := newDoneReader (ioutil .NopCloser (bytes .NewReader (b )), - 1 )
92+ req .Header .Set ("Content-Type" , "application/protobuf" )
93+ req .Body = r
94+ return req
95+ }
96+
97+ req1 := generateRequest ()
98+ g1 := & prototest.Greeting {}
99+ err := req1 .Decode (g1 )
100+ assert .NoError (t , err )
101+ assert .Equal (t , "Hello world!" , g1 .Message )
102+
103+ req2 := generateRequest ()
104+ g2 := & legacyprototest.LegacyGreeting {}
105+ err = req2 .Decode (g2 )
106+ assert .NoError (t , err )
107+ assert .Equal (t , "Hello world!" , g2 .Message )
108+ }
109+
110+ func TestRequestDecodeLegacyProtoMaskingAsJSON (t * testing.T ) {
111+ req := NewRequest (nil , "GET" , "/" , nil )
112+ b := []byte ("{\" message\" :\" Hello world!\" }\n " )
113+ r := newDoneReader (ioutil .NopCloser (bytes .NewReader (b )), - 1 )
114+ req .Body = r
115+
116+ g := & legacyprototest.LegacyGreeting {}
117+ err := req .Decode (g )
118+ assert .NoError (t , err )
119+ assert .Equal (t , "Hello world!" , g .Message )
120+ }
121+
36122// TestRequestEncodeReader verifies that passing an io.Reader to request.Encode() uses it properly as the body, and
37123// does not attempt to encode it as JSON
38124func TestRequestEncodeReader (t * testing.T ) {
@@ -88,7 +174,7 @@ func TestRequestEncodeProtobuf(t *testing.T) {
88174}
89175
90176func TestRequestEncodeJSON (t * testing.T ) {
91- message := map [string ]interface {} {
177+ message := map [string ]interface {}{
92178 "foo" : "bar" ,
93179 "bar" : 3 ,
94180 }
@@ -118,7 +204,6 @@ func TestRequestSetMetadata(t *testing.T) {
118204 assert .Equal (t , []string {"data" }, req .Request .Header ["meta" ])
119205}
120206
121-
122207func jsonStreamMarshal (v interface {}) ([]byte , error ) {
123208 var buffer bytes.Buffer
124209 writer := bufio .NewWriter (& buffer )
0 commit comments