blob: 09725123d9f8282ab250a662c860dcd33e2ad961 [file] [log] [blame]
Jan Tattermusch20831382015-02-24 14:16:04 -08001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015-2016 gRPC authors.
Jan Tattermusch20831382015-02-24 14:16:04 -08004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
Jan Tattermusch20831382015-02-24 14:16:04 -08008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermusch20831382015-02-24 14:16:04 -080010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
Jan Tattermusch20831382015-02-24 14:16:04 -080016
17#endregion
18
19using System;
20using System.Collections.Generic;
Jan Tattermusch0ed73152015-12-09 18:21:11 -080021using System.Linq;
Jan Tattermusch20831382015-02-24 14:16:04 -080022using System.Threading;
23using System.Threading.Tasks;
Jan Tattermusch8644aea2015-08-03 10:21:18 -070024using Google.Protobuf;
Jan Tattermuscha5272b62015-04-30 11:56:46 -070025using Grpc.Core;
Jan Tattermusch20831382015-02-24 14:16:04 -080026using Grpc.Core.Utils;
27
Jan Tattermusch8644aea2015-08-03 10:21:18 -070028namespace Grpc.Testing
Jan Tattermusch20831382015-02-24 14:16:04 -080029{
30 /// <summary>
31 /// Implementation of TestService server
32 /// </summary>
Jan Tattermuschd39426d2016-03-14 16:07:52 -070033 public class TestServiceImpl : TestService.TestServiceBase
Jan Tattermusch20831382015-02-24 14:16:04 -080034 {
Jan Tattermuschd39426d2016-03-14 16:07:52 -070035 public override Task<Empty> EmptyCall(Empty request, ServerCallContext context)
Jan Tattermusch20831382015-02-24 14:16:04 -080036 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -070037 return Task.FromResult(new Empty());
Jan Tattermusch20831382015-02-24 14:16:04 -080038 }
39
Jan Tattermuschd39426d2016-03-14 16:07:52 -070040 public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
Jan Tattermusch20831382015-02-24 14:16:04 -080041 {
Jan Tattermusch0ed73152015-12-09 18:21:11 -080042 await EnsureEchoMetadataAsync(context);
43 EnsureEchoStatus(request.ResponseStatus, context);
44
Jan Tattermusch8644aea2015-08-03 10:21:18 -070045 var response = new SimpleResponse { Payload = CreateZerosPayload(request.ResponseSize) };
Jan Tattermusch0ed73152015-12-09 18:21:11 -080046 return response;
Jan Tattermusch20831382015-02-24 14:16:04 -080047 }
48
Jan Tattermuschd39426d2016-03-14 16:07:52 -070049 public override async Task StreamingOutputCall(StreamingOutputCallRequest request, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
Jan Tattermusch20831382015-02-24 14:16:04 -080050 {
Jan Tattermusch0ed73152015-12-09 18:21:11 -080051 await EnsureEchoMetadataAsync(context);
52 EnsureEchoStatus(request.ResponseStatus, context);
53
Jan Tattermusch8644aea2015-08-03 10:21:18 -070054 foreach (var responseParam in request.ResponseParameters)
Jan Tattermusch20831382015-02-24 14:16:04 -080055 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -070056 var response = new StreamingOutputCallResponse { Payload = CreateZerosPayload(responseParam.Size) };
Jan Tattermusch43dc50b2015-05-18 15:27:19 -070057 await responseStream.WriteAsync(response);
Jan Tattermusch20831382015-02-24 14:16:04 -080058 }
Jan Tattermusch20831382015-02-24 14:16:04 -080059 }
60
Jan Tattermuschd39426d2016-03-14 16:07:52 -070061 public override async Task<StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<StreamingInputCallRequest> requestStream, ServerCallContext context)
Jan Tattermusch20831382015-02-24 14:16:04 -080062 {
Jan Tattermusch0ed73152015-12-09 18:21:11 -080063 await EnsureEchoMetadataAsync(context);
64
Jan Tattermuscha5272b62015-04-30 11:56:46 -070065 int sum = 0;
Jan Tattermuschc152d662017-08-09 09:24:20 +020066 await requestStream.ForEachAsync(request =>
Jan Tattermusch075dde42015-03-11 18:21:00 -070067 {
Jan Tattermuscha5272b62015-04-30 11:56:46 -070068 sum += request.Payload.Body.Length;
Jan Tattermuschc152d662017-08-09 09:24:20 +020069 return TaskUtils.CompletedTask;
Jan Tattermusch20831382015-02-24 14:16:04 -080070 });
Jan Tattermusch8644aea2015-08-03 10:21:18 -070071 return new StreamingInputCallResponse { AggregatedPayloadSize = sum };
Jan Tattermusch20831382015-02-24 14:16:04 -080072 }
73
Jan Tattermuschd39426d2016-03-14 16:07:52 -070074 public override async Task FullDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
Jan Tattermusch20831382015-02-24 14:16:04 -080075 {
Jan Tattermusch0ed73152015-12-09 18:21:11 -080076 await EnsureEchoMetadataAsync(context);
77
Jan Tattermuschf22abfb2015-08-09 16:15:34 -070078 await requestStream.ForEachAsync(async request =>
Jan Tattermusch20831382015-02-24 14:16:04 -080079 {
Jan Tattermusch0ed73152015-12-09 18:21:11 -080080 EnsureEchoStatus(request.ResponseStatus, context);
Jan Tattermusch8644aea2015-08-03 10:21:18 -070081 foreach (var responseParam in request.ResponseParameters)
Jan Tattermusch075dde42015-03-11 18:21:00 -070082 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -070083 var response = new StreamingOutputCallResponse { Payload = CreateZerosPayload(responseParam.Size) };
Jan Tattermusch43dc50b2015-05-18 15:27:19 -070084 await responseStream.WriteAsync(response);
Jan Tattermusch075dde42015-03-11 18:21:00 -070085 }
Jan Tattermuscha5272b62015-04-30 11:56:46 -070086 });
87 }
88
Jan Tattermuschc152d662017-08-09 09:24:20 +020089 public override Task HalfDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
Jan Tattermuscha5272b62015-04-30 11:56:46 -070090 {
91 throw new NotImplementedException();
Jan Tattermusch20831382015-02-24 14:16:04 -080092 }
93
Jan Tattermusch075dde42015-03-11 18:21:00 -070094 private static Payload CreateZerosPayload(int size)
95 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -070096 return new Payload { Body = ByteString.CopyFrom(new byte[size]) };
Jan Tattermusch20831382015-02-24 14:16:04 -080097 }
Jan Tattermusch0ed73152015-12-09 18:21:11 -080098
99 private static async Task EnsureEchoMetadataAsync(ServerCallContext context)
100 {
101 var echoInitialList = context.RequestHeaders.Where((entry) => entry.Key == "x-grpc-test-echo-initial").ToList();
102 if (echoInitialList.Any()) {
103 var entry = echoInitialList.Single();
104 await context.WriteResponseHeadersAsync(new Metadata { entry });
105 }
106
107 var echoTrailingList = context.RequestHeaders.Where((entry) => entry.Key == "x-grpc-test-echo-trailing-bin").ToList();
108 if (echoTrailingList.Any()) {
109 context.ResponseTrailers.Add(echoTrailingList.Single());
110 }
111 }
112
113 private static void EnsureEchoStatus(EchoStatus responseStatus, ServerCallContext context)
114 {
115 if (responseStatus != null)
116 {
117 var statusCode = (StatusCode)responseStatus.Code;
118 context.Status = new Status(statusCode, responseStatus.Message);
119 }
120 }
Jan Tattermusch20831382015-02-24 14:16:04 -0800121 }
122}