@@ -425,6 +425,80 @@ public void onMessage(ReqT message) {
425425 order );
426426 }
427427
428+ /**
429+ * Tests the ServerInterceptors#useMarshalledMessages()} with two marshallers. Makes sure that
430+ * on incoming request the request marshaller's stream method is called and on response the
431+ * response marshaller's parse method is called
432+ */
433+ @ Test
434+ @ SuppressWarnings ("unchecked" )
435+ public void distinctMarshallerForRequestAndResponse () {
436+ final List <String > requestFlowOrder = new ArrayList <>();
437+
438+ final Marshaller <String > requestMarshaller = new Marshaller <String >() {
439+ @ Override
440+ public InputStream stream (String value ) {
441+ requestFlowOrder .add ("RequestStream" );
442+ return null ;
443+ }
444+
445+ @ Override
446+ public String parse (InputStream stream ) {
447+ requestFlowOrder .add ("RequestParse" );
448+ return null ;
449+ }
450+ };
451+ final Marshaller <String > responseMarshaller = new Marshaller <String >() {
452+ @ Override
453+ public InputStream stream (String value ) {
454+ requestFlowOrder .add ("ResponseStream" );
455+ return null ;
456+ }
457+
458+ @ Override
459+ public String parse (InputStream stream ) {
460+ requestFlowOrder .add ("ResponseParse" );
461+ return null ;
462+ }
463+ };
464+ final Marshaller <Holder > dummyMarshaller = new Marshaller <Holder >() {
465+ @ Override
466+ public InputStream stream (Holder value ) {
467+ return value .get ();
468+ }
469+
470+ @ Override
471+ public Holder parse (InputStream stream ) {
472+ return new Holder (stream );
473+ }
474+ };
475+ ServerCallHandler <Holder , Holder > handler = (call , headers ) -> new Listener <Holder >() {
476+ @ Override
477+ public void onMessage (Holder message ) {
478+ requestFlowOrder .add ("handler" );
479+ call .sendMessage (message );
480+ }
481+ };
482+
483+ MethodDescriptor <Holder , Holder > wrappedMethod = MethodDescriptor .<Holder , Holder >newBuilder ()
484+ .setType (MethodType .UNKNOWN )
485+ .setFullMethodName ("basic/wrapped" )
486+ .setRequestMarshaller (dummyMarshaller )
487+ .setResponseMarshaller (dummyMarshaller )
488+ .build ();
489+ ServerServiceDefinition serviceDef = ServerServiceDefinition .builder (
490+ new ServiceDescriptor ("basic" , wrappedMethod ))
491+ .addMethod (wrappedMethod , handler ).build ();
492+ ServerServiceDefinition intercepted = ServerInterceptors .useMarshalledMessages (serviceDef ,
493+ requestMarshaller , responseMarshaller );
494+ ServerMethodDefinition <String , String > serverMethod =
495+ (ServerMethodDefinition <String , String >) intercepted .getMethod ("basic/wrapped" );
496+ ServerCall <String , String > serverCall = new NoopServerCall <>();
497+ serverMethod .getServerCallHandler ().startCall (serverCall , headers ).onMessage ("TestMessage" );
498+
499+ assertEquals (Arrays .asList ("RequestStream" , "handler" , "ResponseParse" ), requestFlowOrder );
500+ }
501+
428502 @ SuppressWarnings ("unchecked" )
429503 private static ServerMethodDefinition <String , Integer > getSoleMethod (
430504 ServerServiceDefinition serviceDef ) {
0 commit comments