3131package com .google .api .gax .httpjson ;
3232
3333import com .google .common .truth .Truth ;
34+ import com .google .protobuf .Any ;
3435import com .google .protobuf .Duration ;
3536import com .google .protobuf .Field ;
3637import com .google .protobuf .Field .Cardinality ;
3940import com .google .protobuf .Int32Value ;
4041import com .google .protobuf .Option ;
4142import com .google .protobuf .Timestamp ;
43+ import com .google .protobuf .TypeRegistry ;
4244import java .io .IOException ;
4345import java .io .StringReader ;
4446import java .util .Arrays ;
@@ -58,7 +60,14 @@ public class ProtoRestSerializerTest {
5860
5961 @ Before
6062 public void setUp () {
61- requestSerializer = ProtoRestSerializer .create ();
63+ // tests with Any type messages require corresponding descriptors in the type registry
64+ requestSerializer =
65+ ProtoRestSerializer .create (
66+ TypeRegistry .newBuilder ()
67+ .add (FieldMask .getDescriptor ())
68+ .add (Duration .getDescriptor ())
69+ .build ());
70+
6271 field =
6372 Field .newBuilder ()
6473 .setNumber (2 )
@@ -189,30 +198,72 @@ public void putQueryParamPrimitive() {
189198 @ Test
190199 public void putQueryParamComplexObject () {
191200 Map <String , List <String >> fields = new HashMap <>();
192- requestSerializer .putQueryParam (
193- fields , "optName1" , Duration .newBuilder ().setSeconds (1 ).setNanos (1 ).build ());
194- requestSerializer .putQueryParam (
195- fields , "optName2" , Timestamp .newBuilder ().setSeconds (1 ).setNanos (1 ).build ());
196- requestSerializer .putQueryParam (
197- fields , "optName3" , FieldMask .newBuilder ().addPaths ("a.b" ).addPaths ("c.d" ).build ());
198- requestSerializer .putQueryParam (fields , "optName4" , Int32Value .of (1 ));
199- requestSerializer .putQueryParam (fields , "optName5" , FloatValue .of (1.1f ));
200- requestSerializer .putQueryParam (fields , "optName6" , field );
201+ Any fieldMask = Any .pack (FieldMask .newBuilder ().addPaths ("a.b.c" ).addPaths ("d.e.f" ).build ());
202+ Any duration1 = Any .pack (Duration .newBuilder ().setSeconds (1 ).setNanos (1 ).build ());
203+ Any duration2 = Any .pack (Duration .newBuilder ().setSeconds (2 ).setNanos (2 ).build ());
204+ Field value =
205+ Field .newBuilder ()
206+ .setNumber (2 )
207+ .setName ("well_known_container" )
208+ .addOptions (Option .newBuilder ().setName ("duration" ).setValue (duration1 ).build ())
209+ .addOptions (Option .newBuilder ().setName ("duration" ).setValue (duration2 ).build ())
210+ .addOptions (Option .newBuilder ().setName ("mask" ).setValue (fieldMask ).build ())
211+ .setCardinality (Cardinality .CARDINALITY_OPTIONAL )
212+ .build ();
213+ requestSerializer .putQueryParam (fields , "object" , value );
201214
202215 Map <String , List <String >> expectedFields = new HashMap <>();
203- expectedFields .put ("optName1" , Arrays .asList ("1.000000001s" ));
204- expectedFields .put ("optName2" , Arrays .asList ("1970-01-01T00:00:01.000000001Z" ));
205- expectedFields .put ("optName3" , Arrays .asList ("a.b,c.d" ));
206- expectedFields .put ("optName4" , Arrays .asList ("1" ));
207- expectedFields .put ("optName5" , Arrays .asList ("1.1" ));
208- expectedFields .put ("optName6.name" , Arrays .asList ("field_name1" ));
209- expectedFields .put ("optName6.number" , Arrays .asList ("2" ));
210- expectedFields .put ("optName6.options.name" , Arrays .asList ("opt_name1" , "opt_name2" ));
211- expectedFields .put ("optName6.cardinality" , Arrays .asList ("1" ));
216+ expectedFields .put ("object.name" , Arrays .asList ("well_known_container" ));
217+ expectedFields .put ("object.number" , Arrays .asList ("2" ));
218+ expectedFields .put ("object.options.name" , Arrays .asList ("duration" , "duration" , "mask" ));
219+ expectedFields .put (
220+ "object.options.value.value" , Arrays .asList ("1.000000001s" , "2.000000002s" , "a.b.c,d.e.f" ));
221+ // used by JSON parser to obtain descriptors from this type url
222+ expectedFields .put (
223+ "object.options.value.@type" ,
224+ Arrays .asList (
225+ "type.googleapis.com/google.protobuf.Duration" ,
226+ "type.googleapis.com/google.protobuf.Duration" ,
227+ "type.googleapis.com/google.protobuf.FieldMask" ));
228+ expectedFields .put ("object.cardinality" , Arrays .asList ("1" ));
212229
213230 Truth .assertThat (fields ).isEqualTo (expectedFields );
214231 }
215232
233+ @ Test
234+ public void putQueryParamDuration () {
235+ queryParamHelper (Duration .newBuilder ().setSeconds (1 ).setNanos (1 ).build (), "1.000000001s" );
236+ }
237+
238+ @ Test
239+ public void putQueryParamTimestamp () {
240+ queryParamHelper (
241+ Timestamp .newBuilder ().setSeconds (1 ).setNanos (1 ).build (), "1970-01-01T00:00:01.000000001Z" );
242+ }
243+
244+ @ Test
245+ public void putQueryParamFieldMask () {
246+ queryParamHelper (FieldMask .newBuilder ().addPaths ("a.b" ).addPaths ("c.d" ).build (), "a.b,c.d" );
247+ }
248+
249+ @ Test
250+ public void putQueryParamInt32Value () {
251+ queryParamHelper (Int32Value .of (1 ), "1" );
252+ }
253+
254+ @ Test
255+ public void putQueryParamFloatValue () {
256+ queryParamHelper (FloatValue .of (1.1f ), "1.1" );
257+ }
258+
259+ private void queryParamHelper (Object value , String expected ) {
260+ Map <String , List <String >> fields = new HashMap <>();
261+ requestSerializer .putQueryParam (fields , "value" , value );
262+ Map <String , List <String >> expectedFields = new HashMap <>();
263+ expectedFields .put ("value" , Arrays .asList (expected ));
264+ Truth .assertThat (fields ).isEqualTo (expectedFields );
265+ }
266+
216267 @ Test
217268 public void toBody () {
218269 String body = requestSerializer .toBody ("bodyField1" , field , false );
0 commit comments