From a4b63bfc6bffdc1d94bc3a69c831cbae4ec39bd5 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 6 Feb 2015 10:07:59 -0800 Subject: [PATCH 1/6] Added simplified TestService for interop testing --- src/csharp/GrpcApi/Empty.cs | 282 ++ src/csharp/GrpcApi/GrpcApi.csproj | 12 + src/csharp/GrpcApi/Messages.cs | 2922 ++++++++++++++++++++- src/csharp/GrpcApi/TestServiceGrpc.cs | 103 + src/csharp/GrpcApi/proto/empty.proto | 13 + src/csharp/GrpcApi/{ => proto}/math.proto | 0 src/csharp/GrpcApi/proto/messages.proto | 102 + src/csharp/GrpcApi/proto/test.proto | 42 + 8 files changed, 3443 insertions(+), 33 deletions(-) create mode 100644 src/csharp/GrpcApi/Empty.cs create mode 100644 src/csharp/GrpcApi/TestServiceGrpc.cs create mode 100644 src/csharp/GrpcApi/proto/empty.proto rename src/csharp/GrpcApi/{ => proto}/math.proto (100%) mode change 100755 => 100644 create mode 100644 src/csharp/GrpcApi/proto/messages.proto create mode 100644 src/csharp/GrpcApi/proto/test.proto diff --git a/src/csharp/GrpcApi/Empty.cs b/src/csharp/GrpcApi/Empty.cs new file mode 100644 index 00000000000..dadfd151ecc --- /dev/null +++ b/src/csharp/GrpcApi/Empty.cs @@ -0,0 +1,282 @@ +// Generated by ProtoGen, Version=2.4.1.521, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48. DO NOT EDIT! +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.ProtocolBuffers; +using pbc = global::Google.ProtocolBuffers.Collections; +using pbd = global::Google.ProtocolBuffers.Descriptors; +using scg = global::System.Collections.Generic; +namespace grpc.testing { + + namespace Proto { + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public static partial class Empty { + + #region Extension registration + public static void RegisterAllExtensions(pb::ExtensionRegistry registry) { + } + #endregion + #region Static variables + internal static pbd::MessageDescriptor internal__static_grpc_testing_Empty__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_Empty__FieldAccessorTable; + #endregion + #region Descriptor + public static pbd::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbd::FileDescriptor descriptor; + + static Empty() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "CgtlbXB0eS5wcm90bxIMZ3JwYy50ZXN0aW5nIgcKBUVtcHR5")); + pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) { + descriptor = root; + internal__static_grpc_testing_Empty__Descriptor = Descriptor.MessageTypes[0]; + internal__static_grpc_testing_Empty__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_Empty__Descriptor, + new string[] { }); + return null; + }; + pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData, + new pbd::FileDescriptor[] { + }, assigner); + } + #endregion + + } + } + #region Messages + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Empty : pb::GeneratedMessage { + private Empty() { } + private static readonly Empty defaultInstance = new Empty().MakeReadOnly(); + private static readonly string[] _emptyFieldNames = new string[] { }; + private static readonly uint[] _emptyFieldTags = new uint[] { }; + public static Empty DefaultInstance { + get { return defaultInstance; } + } + + public override Empty DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override Empty ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Proto.Empty.internal__static_grpc_testing_Empty__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Proto.Empty.internal__static_grpc_testing_Empty__FieldAccessorTable; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _emptyFieldNames; + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static Empty ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static Empty ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static Empty ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static Empty ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static Empty ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static Empty ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static Empty ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static Empty ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static Empty ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static Empty ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private Empty MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(Empty prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(Empty cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private Empty result; + + private Empty PrepareBuilder() { + if (resultIsReadOnly) { + Empty original = result; + result = new Empty(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override Empty MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.Empty.Descriptor; } + } + + public override Empty DefaultInstanceForType { + get { return global::grpc.testing.Empty.DefaultInstance; } + } + + public override Empty BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is Empty) { + return MergeFrom((Empty) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(Empty other) { + if (other == global::grpc.testing.Empty.DefaultInstance) return this; + PrepareBuilder(); + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_emptyFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _emptyFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + } + static Empty() { + object.ReferenceEquals(global::grpc.testing.Proto.Empty.Descriptor, null); + } + } + + #endregion + +} + +#endregion Designer generated code diff --git a/src/csharp/GrpcApi/GrpcApi.csproj b/src/csharp/GrpcApi/GrpcApi.csproj index 07bd6f6efbe..bf457a1e6b5 100644 --- a/src/csharp/GrpcApi/GrpcApi.csproj +++ b/src/csharp/GrpcApi/GrpcApi.csproj @@ -51,6 +51,9 @@ + + + @@ -59,4 +62,13 @@ GrpcCore + + + + + + + + + \ No newline at end of file diff --git a/src/csharp/GrpcApi/Messages.cs b/src/csharp/GrpcApi/Messages.cs index b08816bdb7f..78e3404d226 100644 --- a/src/csharp/GrpcApi/Messages.cs +++ b/src/csharp/GrpcApi/Messages.cs @@ -1,35 +1,2891 @@ -//using System; +// Generated by ProtoGen, Version=2.4.1.521, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48. DO NOT EDIT! +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code -//namespace Google.GRPC.Examples.Math -//{ -// // Messages in this file are placeholders for actual protobuf message classes -// // that will be generated from math.proto file. -// -// public class DivArgs -// { -// public long Dividend{ get; set; } -// public long Divisor { get; set; } -// } -// -// public class DivReply -// { -// public long Quotient { get; set; } -// public long Remainder { get; set; } -// } -// -// public class FibArgs -// { -// public long Limit { get; set; } -// } -// -// public class Number -// { -// public long Num { get; set; } -// } -// -// public class FibReply -// { -// public long Count { get; set; } -// } -//} +using pb = global::Google.ProtocolBuffers; +using pbc = global::Google.ProtocolBuffers.Collections; +using pbd = global::Google.ProtocolBuffers.Descriptors; +using scg = global::System.Collections.Generic; +namespace grpc.testing { + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public static partial class Messages { + + #region Extension registration + public static void RegisterAllExtensions(pb::ExtensionRegistry registry) { + } + #endregion + #region Static variables + internal static pbd::MessageDescriptor internal__static_grpc_testing_Payload__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_Payload__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_SimpleRequest__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_SimpleRequest__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_SimpleResponse__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_SimpleResponse__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_StreamingInputCallRequest__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_StreamingInputCallRequest__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_StreamingInputCallResponse__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_StreamingInputCallResponse__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_ResponseParameters__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_ResponseParameters__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_StreamingOutputCallRequest__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_StreamingOutputCallRequest__FieldAccessorTable; + internal static pbd::MessageDescriptor internal__static_grpc_testing_StreamingOutputCallResponse__Descriptor; + internal static pb::FieldAccess.FieldAccessorTable internal__static_grpc_testing_StreamingOutputCallResponse__FieldAccessorTable; + #endregion + #region Descriptor + public static pbd::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbd::FileDescriptor descriptor; + + static Messages() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Cg5tZXNzYWdlcy5wcm90bxIMZ3JwYy50ZXN0aW5nIkAKB1BheWxvYWQSJwoE", + "dHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlwZRIMCgRib2R5", + "GAIgASgMIrEBCg1TaW1wbGVSZXF1ZXN0EjAKDXJlc3BvbnNlX3R5cGUYASAB", + "KA4yGS5ncnBjLnRlc3RpbmcuUGF5bG9hZFR5cGUSFQoNcmVzcG9uc2Vfc2l6", + "ZRgCIAEoBRImCgdwYXlsb2FkGAMgASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxv", + "YWQSFQoNZmlsbF91c2VybmFtZRgEIAEoCBIYChBmaWxsX29hdXRoX3Njb3Bl", + "GAUgASgIIl8KDlNpbXBsZVJlc3BvbnNlEiYKB3BheWxvYWQYASABKAsyFS5n", + "cnBjLnRlc3RpbmcuUGF5bG9hZBIQCgh1c2VybmFtZRgCIAEoCRITCgtvYXV0", + "aF9zY29wZRgDIAEoCSJDChlTdHJlYW1pbmdJbnB1dENhbGxSZXF1ZXN0EiYK", + "B3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3RpbmcuUGF5bG9hZCI9ChpTdHJl", + "YW1pbmdJbnB1dENhbGxSZXNwb25zZRIfChdhZ2dyZWdhdGVkX3BheWxvYWRf", + "c2l6ZRgBIAEoBSI3ChJSZXNwb25zZVBhcmFtZXRlcnMSDAoEc2l6ZRgBIAEo", + "BRITCgtpbnRlcnZhbF91cxgCIAEoBSK1AQoaU3RyZWFtaW5nT3V0cHV0Q2Fs", + "bFJlcXVlc3QSMAoNcmVzcG9uc2VfdHlwZRgBIAEoDjIZLmdycGMudGVzdGlu", + "Zy5QYXlsb2FkVHlwZRI9ChNyZXNwb25zZV9wYXJhbWV0ZXJzGAIgAygLMiAu", + "Z3JwYy50ZXN0aW5nLlJlc3BvbnNlUGFyYW1ldGVycxImCgdwYXlsb2FkGAMg", + "ASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxvYWQiRQobU3RyZWFtaW5nT3V0cHV0", + "Q2FsbFJlc3BvbnNlEiYKB3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3Rpbmcu", + "UGF5bG9hZCo/CgtQYXlsb2FkVHlwZRIQCgxDT01QUkVTU0FCTEUQABISCg5V", + "TkNPTVBSRVNTQUJMRRABEgoKBlJBTkRPTRAC")); + pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) { + descriptor = root; + internal__static_grpc_testing_Payload__Descriptor = Descriptor.MessageTypes[0]; + internal__static_grpc_testing_Payload__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_Payload__Descriptor, + new string[] { "Type", "Body", }); + internal__static_grpc_testing_SimpleRequest__Descriptor = Descriptor.MessageTypes[1]; + internal__static_grpc_testing_SimpleRequest__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_SimpleRequest__Descriptor, + new string[] { "ResponseType", "ResponseSize", "Payload", "FillUsername", "FillOauthScope", }); + internal__static_grpc_testing_SimpleResponse__Descriptor = Descriptor.MessageTypes[2]; + internal__static_grpc_testing_SimpleResponse__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_SimpleResponse__Descriptor, + new string[] { "Payload", "Username", "OauthScope", }); + internal__static_grpc_testing_StreamingInputCallRequest__Descriptor = Descriptor.MessageTypes[3]; + internal__static_grpc_testing_StreamingInputCallRequest__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_StreamingInputCallRequest__Descriptor, + new string[] { "Payload", }); + internal__static_grpc_testing_StreamingInputCallResponse__Descriptor = Descriptor.MessageTypes[4]; + internal__static_grpc_testing_StreamingInputCallResponse__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_StreamingInputCallResponse__Descriptor, + new string[] { "AggregatedPayloadSize", }); + internal__static_grpc_testing_ResponseParameters__Descriptor = Descriptor.MessageTypes[5]; + internal__static_grpc_testing_ResponseParameters__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_ResponseParameters__Descriptor, + new string[] { "Size", "IntervalUs", }); + internal__static_grpc_testing_StreamingOutputCallRequest__Descriptor = Descriptor.MessageTypes[6]; + internal__static_grpc_testing_StreamingOutputCallRequest__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_StreamingOutputCallRequest__Descriptor, + new string[] { "ResponseType", "ResponseParameters", "Payload", }); + internal__static_grpc_testing_StreamingOutputCallResponse__Descriptor = Descriptor.MessageTypes[7]; + internal__static_grpc_testing_StreamingOutputCallResponse__FieldAccessorTable = + new pb::FieldAccess.FieldAccessorTable(internal__static_grpc_testing_StreamingOutputCallResponse__Descriptor, + new string[] { "Payload", }); + return null; + }; + pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData, + new pbd::FileDescriptor[] { + }, assigner); + } + #endregion + + } + #region Enums + public enum PayloadType { + COMPRESSABLE = 0, + UNCOMPRESSABLE = 1, + RANDOM = 2, + } + + #endregion + + #region Messages + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Payload : pb::GeneratedMessage { + private Payload() { } + private static readonly Payload defaultInstance = new Payload().MakeReadOnly(); + private static readonly string[] _payloadFieldNames = new string[] { "body", "type" }; + private static readonly uint[] _payloadFieldTags = new uint[] { 18, 8 }; + public static Payload DefaultInstance { + get { return defaultInstance; } + } + + public override Payload DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override Payload ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_Payload__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_Payload__FieldAccessorTable; } + } + + public const int TypeFieldNumber = 1; + private bool hasType; + private global::grpc.testing.PayloadType type_ = global::grpc.testing.PayloadType.COMPRESSABLE; + public bool HasType { + get { return hasType; } + } + public global::grpc.testing.PayloadType Type { + get { return type_; } + } + + public const int BodyFieldNumber = 2; + private bool hasBody; + private pb::ByteString body_ = pb::ByteString.Empty; + public bool HasBody { + get { return hasBody; } + } + public pb::ByteString Body { + get { return body_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _payloadFieldNames; + if (hasType) { + output.WriteEnum(1, field_names[1], (int) Type, Type); + } + if (hasBody) { + output.WriteBytes(2, field_names[0], Body); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasType) { + size += pb::CodedOutputStream.ComputeEnumSize(1, (int) Type); + } + if (hasBody) { + size += pb::CodedOutputStream.ComputeBytesSize(2, Body); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static Payload ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static Payload ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static Payload ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static Payload ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static Payload ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static Payload ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static Payload ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static Payload ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static Payload ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static Payload ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private Payload MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(Payload prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(Payload cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private Payload result; + + private Payload PrepareBuilder() { + if (resultIsReadOnly) { + Payload original = result; + result = new Payload(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override Payload MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.Payload.Descriptor; } + } + + public override Payload DefaultInstanceForType { + get { return global::grpc.testing.Payload.DefaultInstance; } + } + + public override Payload BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is Payload) { + return MergeFrom((Payload) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(Payload other) { + if (other == global::grpc.testing.Payload.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasType) { + Type = other.Type; + } + if (other.HasBody) { + Body = other.Body; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_payloadFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _payloadFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + object unknown; + if(input.ReadEnum(ref result.type_, out unknown)) { + result.hasType = true; + } else if(unknown is int) { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + unknownFields.MergeVarintField(1, (ulong)(int)unknown); + } + break; + } + case 18: { + result.hasBody = input.ReadBytes(ref result.body_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasType { + get { return result.hasType; } + } + public global::grpc.testing.PayloadType Type { + get { return result.Type; } + set { SetType(value); } + } + public Builder SetType(global::grpc.testing.PayloadType value) { + PrepareBuilder(); + result.hasType = true; + result.type_ = value; + return this; + } + public Builder ClearType() { + PrepareBuilder(); + result.hasType = false; + result.type_ = global::grpc.testing.PayloadType.COMPRESSABLE; + return this; + } + + public bool HasBody { + get { return result.hasBody; } + } + public pb::ByteString Body { + get { return result.Body; } + set { SetBody(value); } + } + public Builder SetBody(pb::ByteString value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasBody = true; + result.body_ = value; + return this; + } + public Builder ClearBody() { + PrepareBuilder(); + result.hasBody = false; + result.body_ = pb::ByteString.Empty; + return this; + } + } + static Payload() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class SimpleRequest : pb::GeneratedMessage { + private SimpleRequest() { } + private static readonly SimpleRequest defaultInstance = new SimpleRequest().MakeReadOnly(); + private static readonly string[] _simpleRequestFieldNames = new string[] { "fill_oauth_scope", "fill_username", "payload", "response_size", "response_type" }; + private static readonly uint[] _simpleRequestFieldTags = new uint[] { 40, 32, 26, 16, 8 }; + public static SimpleRequest DefaultInstance { + get { return defaultInstance; } + } + + public override SimpleRequest DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override SimpleRequest ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_SimpleRequest__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_SimpleRequest__FieldAccessorTable; } + } + + public const int ResponseTypeFieldNumber = 1; + private bool hasResponseType; + private global::grpc.testing.PayloadType responseType_ = global::grpc.testing.PayloadType.COMPRESSABLE; + public bool HasResponseType { + get { return hasResponseType; } + } + public global::grpc.testing.PayloadType ResponseType { + get { return responseType_; } + } + + public const int ResponseSizeFieldNumber = 2; + private bool hasResponseSize; + private int responseSize_; + public bool HasResponseSize { + get { return hasResponseSize; } + } + public int ResponseSize { + get { return responseSize_; } + } + + public const int PayloadFieldNumber = 3; + private bool hasPayload; + private global::grpc.testing.Payload payload_; + public bool HasPayload { + get { return hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return payload_ ?? global::grpc.testing.Payload.DefaultInstance; } + } + + public const int FillUsernameFieldNumber = 4; + private bool hasFillUsername; + private bool fillUsername_; + public bool HasFillUsername { + get { return hasFillUsername; } + } + public bool FillUsername { + get { return fillUsername_; } + } + + public const int FillOauthScopeFieldNumber = 5; + private bool hasFillOauthScope; + private bool fillOauthScope_; + public bool HasFillOauthScope { + get { return hasFillOauthScope; } + } + public bool FillOauthScope { + get { return fillOauthScope_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _simpleRequestFieldNames; + if (hasResponseType) { + output.WriteEnum(1, field_names[4], (int) ResponseType, ResponseType); + } + if (hasResponseSize) { + output.WriteInt32(2, field_names[3], ResponseSize); + } + if (hasPayload) { + output.WriteMessage(3, field_names[2], Payload); + } + if (hasFillUsername) { + output.WriteBool(4, field_names[1], FillUsername); + } + if (hasFillOauthScope) { + output.WriteBool(5, field_names[0], FillOauthScope); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasResponseType) { + size += pb::CodedOutputStream.ComputeEnumSize(1, (int) ResponseType); + } + if (hasResponseSize) { + size += pb::CodedOutputStream.ComputeInt32Size(2, ResponseSize); + } + if (hasPayload) { + size += pb::CodedOutputStream.ComputeMessageSize(3, Payload); + } + if (hasFillUsername) { + size += pb::CodedOutputStream.ComputeBoolSize(4, FillUsername); + } + if (hasFillOauthScope) { + size += pb::CodedOutputStream.ComputeBoolSize(5, FillOauthScope); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static SimpleRequest ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static SimpleRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static SimpleRequest ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static SimpleRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static SimpleRequest ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static SimpleRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static SimpleRequest ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static SimpleRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static SimpleRequest ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static SimpleRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private SimpleRequest MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(SimpleRequest prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(SimpleRequest cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private SimpleRequest result; + + private SimpleRequest PrepareBuilder() { + if (resultIsReadOnly) { + SimpleRequest original = result; + result = new SimpleRequest(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override SimpleRequest MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.SimpleRequest.Descriptor; } + } + + public override SimpleRequest DefaultInstanceForType { + get { return global::grpc.testing.SimpleRequest.DefaultInstance; } + } + + public override SimpleRequest BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is SimpleRequest) { + return MergeFrom((SimpleRequest) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(SimpleRequest other) { + if (other == global::grpc.testing.SimpleRequest.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasResponseType) { + ResponseType = other.ResponseType; + } + if (other.HasResponseSize) { + ResponseSize = other.ResponseSize; + } + if (other.HasPayload) { + MergePayload(other.Payload); + } + if (other.HasFillUsername) { + FillUsername = other.FillUsername; + } + if (other.HasFillOauthScope) { + FillOauthScope = other.FillOauthScope; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_simpleRequestFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _simpleRequestFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + object unknown; + if(input.ReadEnum(ref result.responseType_, out unknown)) { + result.hasResponseType = true; + } else if(unknown is int) { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + unknownFields.MergeVarintField(1, (ulong)(int)unknown); + } + break; + } + case 16: { + result.hasResponseSize = input.ReadInt32(ref result.responseSize_); + break; + } + case 26: { + global::grpc.testing.Payload.Builder subBuilder = global::grpc.testing.Payload.CreateBuilder(); + if (result.hasPayload) { + subBuilder.MergeFrom(Payload); + } + input.ReadMessage(subBuilder, extensionRegistry); + Payload = subBuilder.BuildPartial(); + break; + } + case 32: { + result.hasFillUsername = input.ReadBool(ref result.fillUsername_); + break; + } + case 40: { + result.hasFillOauthScope = input.ReadBool(ref result.fillOauthScope_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasResponseType { + get { return result.hasResponseType; } + } + public global::grpc.testing.PayloadType ResponseType { + get { return result.ResponseType; } + set { SetResponseType(value); } + } + public Builder SetResponseType(global::grpc.testing.PayloadType value) { + PrepareBuilder(); + result.hasResponseType = true; + result.responseType_ = value; + return this; + } + public Builder ClearResponseType() { + PrepareBuilder(); + result.hasResponseType = false; + result.responseType_ = global::grpc.testing.PayloadType.COMPRESSABLE; + return this; + } + + public bool HasResponseSize { + get { return result.hasResponseSize; } + } + public int ResponseSize { + get { return result.ResponseSize; } + set { SetResponseSize(value); } + } + public Builder SetResponseSize(int value) { + PrepareBuilder(); + result.hasResponseSize = true; + result.responseSize_ = value; + return this; + } + public Builder ClearResponseSize() { + PrepareBuilder(); + result.hasResponseSize = false; + result.responseSize_ = 0; + return this; + } + + public bool HasPayload { + get { return result.hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return result.Payload; } + set { SetPayload(value); } + } + public Builder SetPayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = value; + return this; + } + public Builder SetPayload(global::grpc.testing.Payload.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = builderForValue.Build(); + return this; + } + public Builder MergePayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + if (result.hasPayload && + result.payload_ != global::grpc.testing.Payload.DefaultInstance) { + result.payload_ = global::grpc.testing.Payload.CreateBuilder(result.payload_).MergeFrom(value).BuildPartial(); + } else { + result.payload_ = value; + } + result.hasPayload = true; + return this; + } + public Builder ClearPayload() { + PrepareBuilder(); + result.hasPayload = false; + result.payload_ = null; + return this; + } + + public bool HasFillUsername { + get { return result.hasFillUsername; } + } + public bool FillUsername { + get { return result.FillUsername; } + set { SetFillUsername(value); } + } + public Builder SetFillUsername(bool value) { + PrepareBuilder(); + result.hasFillUsername = true; + result.fillUsername_ = value; + return this; + } + public Builder ClearFillUsername() { + PrepareBuilder(); + result.hasFillUsername = false; + result.fillUsername_ = false; + return this; + } + + public bool HasFillOauthScope { + get { return result.hasFillOauthScope; } + } + public bool FillOauthScope { + get { return result.FillOauthScope; } + set { SetFillOauthScope(value); } + } + public Builder SetFillOauthScope(bool value) { + PrepareBuilder(); + result.hasFillOauthScope = true; + result.fillOauthScope_ = value; + return this; + } + public Builder ClearFillOauthScope() { + PrepareBuilder(); + result.hasFillOauthScope = false; + result.fillOauthScope_ = false; + return this; + } + } + static SimpleRequest() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class SimpleResponse : pb::GeneratedMessage { + private SimpleResponse() { } + private static readonly SimpleResponse defaultInstance = new SimpleResponse().MakeReadOnly(); + private static readonly string[] _simpleResponseFieldNames = new string[] { "oauth_scope", "payload", "username" }; + private static readonly uint[] _simpleResponseFieldTags = new uint[] { 26, 10, 18 }; + public static SimpleResponse DefaultInstance { + get { return defaultInstance; } + } + + public override SimpleResponse DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override SimpleResponse ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_SimpleResponse__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_SimpleResponse__FieldAccessorTable; } + } + + public const int PayloadFieldNumber = 1; + private bool hasPayload; + private global::grpc.testing.Payload payload_; + public bool HasPayload { + get { return hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return payload_ ?? global::grpc.testing.Payload.DefaultInstance; } + } + + public const int UsernameFieldNumber = 2; + private bool hasUsername; + private string username_ = ""; + public bool HasUsername { + get { return hasUsername; } + } + public string Username { + get { return username_; } + } + + public const int OauthScopeFieldNumber = 3; + private bool hasOauthScope; + private string oauthScope_ = ""; + public bool HasOauthScope { + get { return hasOauthScope; } + } + public string OauthScope { + get { return oauthScope_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _simpleResponseFieldNames; + if (hasPayload) { + output.WriteMessage(1, field_names[1], Payload); + } + if (hasUsername) { + output.WriteString(2, field_names[2], Username); + } + if (hasOauthScope) { + output.WriteString(3, field_names[0], OauthScope); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasPayload) { + size += pb::CodedOutputStream.ComputeMessageSize(1, Payload); + } + if (hasUsername) { + size += pb::CodedOutputStream.ComputeStringSize(2, Username); + } + if (hasOauthScope) { + size += pb::CodedOutputStream.ComputeStringSize(3, OauthScope); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static SimpleResponse ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static SimpleResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static SimpleResponse ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static SimpleResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static SimpleResponse ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static SimpleResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static SimpleResponse ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static SimpleResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static SimpleResponse ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static SimpleResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private SimpleResponse MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(SimpleResponse prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(SimpleResponse cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private SimpleResponse result; + + private SimpleResponse PrepareBuilder() { + if (resultIsReadOnly) { + SimpleResponse original = result; + result = new SimpleResponse(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override SimpleResponse MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.SimpleResponse.Descriptor; } + } + + public override SimpleResponse DefaultInstanceForType { + get { return global::grpc.testing.SimpleResponse.DefaultInstance; } + } + + public override SimpleResponse BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is SimpleResponse) { + return MergeFrom((SimpleResponse) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(SimpleResponse other) { + if (other == global::grpc.testing.SimpleResponse.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasPayload) { + MergePayload(other.Payload); + } + if (other.HasUsername) { + Username = other.Username; + } + if (other.HasOauthScope) { + OauthScope = other.OauthScope; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_simpleResponseFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _simpleResponseFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 10: { + global::grpc.testing.Payload.Builder subBuilder = global::grpc.testing.Payload.CreateBuilder(); + if (result.hasPayload) { + subBuilder.MergeFrom(Payload); + } + input.ReadMessage(subBuilder, extensionRegistry); + Payload = subBuilder.BuildPartial(); + break; + } + case 18: { + result.hasUsername = input.ReadString(ref result.username_); + break; + } + case 26: { + result.hasOauthScope = input.ReadString(ref result.oauthScope_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasPayload { + get { return result.hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return result.Payload; } + set { SetPayload(value); } + } + public Builder SetPayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = value; + return this; + } + public Builder SetPayload(global::grpc.testing.Payload.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = builderForValue.Build(); + return this; + } + public Builder MergePayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + if (result.hasPayload && + result.payload_ != global::grpc.testing.Payload.DefaultInstance) { + result.payload_ = global::grpc.testing.Payload.CreateBuilder(result.payload_).MergeFrom(value).BuildPartial(); + } else { + result.payload_ = value; + } + result.hasPayload = true; + return this; + } + public Builder ClearPayload() { + PrepareBuilder(); + result.hasPayload = false; + result.payload_ = null; + return this; + } + + public bool HasUsername { + get { return result.hasUsername; } + } + public string Username { + get { return result.Username; } + set { SetUsername(value); } + } + public Builder SetUsername(string value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasUsername = true; + result.username_ = value; + return this; + } + public Builder ClearUsername() { + PrepareBuilder(); + result.hasUsername = false; + result.username_ = ""; + return this; + } + + public bool HasOauthScope { + get { return result.hasOauthScope; } + } + public string OauthScope { + get { return result.OauthScope; } + set { SetOauthScope(value); } + } + public Builder SetOauthScope(string value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasOauthScope = true; + result.oauthScope_ = value; + return this; + } + public Builder ClearOauthScope() { + PrepareBuilder(); + result.hasOauthScope = false; + result.oauthScope_ = ""; + return this; + } + } + static SimpleResponse() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class StreamingInputCallRequest : pb::GeneratedMessage { + private StreamingInputCallRequest() { } + private static readonly StreamingInputCallRequest defaultInstance = new StreamingInputCallRequest().MakeReadOnly(); + private static readonly string[] _streamingInputCallRequestFieldNames = new string[] { "payload" }; + private static readonly uint[] _streamingInputCallRequestFieldTags = new uint[] { 10 }; + public static StreamingInputCallRequest DefaultInstance { + get { return defaultInstance; } + } + + public override StreamingInputCallRequest DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override StreamingInputCallRequest ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingInputCallRequest__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingInputCallRequest__FieldAccessorTable; } + } + + public const int PayloadFieldNumber = 1; + private bool hasPayload; + private global::grpc.testing.Payload payload_; + public bool HasPayload { + get { return hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return payload_ ?? global::grpc.testing.Payload.DefaultInstance; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _streamingInputCallRequestFieldNames; + if (hasPayload) { + output.WriteMessage(1, field_names[0], Payload); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasPayload) { + size += pb::CodedOutputStream.ComputeMessageSize(1, Payload); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static StreamingInputCallRequest ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static StreamingInputCallRequest ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static StreamingInputCallRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingInputCallRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private StreamingInputCallRequest MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(StreamingInputCallRequest prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(StreamingInputCallRequest cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private StreamingInputCallRequest result; + + private StreamingInputCallRequest PrepareBuilder() { + if (resultIsReadOnly) { + StreamingInputCallRequest original = result; + result = new StreamingInputCallRequest(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override StreamingInputCallRequest MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.StreamingInputCallRequest.Descriptor; } + } + + public override StreamingInputCallRequest DefaultInstanceForType { + get { return global::grpc.testing.StreamingInputCallRequest.DefaultInstance; } + } + + public override StreamingInputCallRequest BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is StreamingInputCallRequest) { + return MergeFrom((StreamingInputCallRequest) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(StreamingInputCallRequest other) { + if (other == global::grpc.testing.StreamingInputCallRequest.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasPayload) { + MergePayload(other.Payload); + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_streamingInputCallRequestFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _streamingInputCallRequestFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 10: { + global::grpc.testing.Payload.Builder subBuilder = global::grpc.testing.Payload.CreateBuilder(); + if (result.hasPayload) { + subBuilder.MergeFrom(Payload); + } + input.ReadMessage(subBuilder, extensionRegistry); + Payload = subBuilder.BuildPartial(); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasPayload { + get { return result.hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return result.Payload; } + set { SetPayload(value); } + } + public Builder SetPayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = value; + return this; + } + public Builder SetPayload(global::grpc.testing.Payload.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = builderForValue.Build(); + return this; + } + public Builder MergePayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + if (result.hasPayload && + result.payload_ != global::grpc.testing.Payload.DefaultInstance) { + result.payload_ = global::grpc.testing.Payload.CreateBuilder(result.payload_).MergeFrom(value).BuildPartial(); + } else { + result.payload_ = value; + } + result.hasPayload = true; + return this; + } + public Builder ClearPayload() { + PrepareBuilder(); + result.hasPayload = false; + result.payload_ = null; + return this; + } + } + static StreamingInputCallRequest() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class StreamingInputCallResponse : pb::GeneratedMessage { + private StreamingInputCallResponse() { } + private static readonly StreamingInputCallResponse defaultInstance = new StreamingInputCallResponse().MakeReadOnly(); + private static readonly string[] _streamingInputCallResponseFieldNames = new string[] { "aggregated_payload_size" }; + private static readonly uint[] _streamingInputCallResponseFieldTags = new uint[] { 8 }; + public static StreamingInputCallResponse DefaultInstance { + get { return defaultInstance; } + } + + public override StreamingInputCallResponse DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override StreamingInputCallResponse ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingInputCallResponse__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingInputCallResponse__FieldAccessorTable; } + } + + public const int AggregatedPayloadSizeFieldNumber = 1; + private bool hasAggregatedPayloadSize; + private int aggregatedPayloadSize_; + public bool HasAggregatedPayloadSize { + get { return hasAggregatedPayloadSize; } + } + public int AggregatedPayloadSize { + get { return aggregatedPayloadSize_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _streamingInputCallResponseFieldNames; + if (hasAggregatedPayloadSize) { + output.WriteInt32(1, field_names[0], AggregatedPayloadSize); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasAggregatedPayloadSize) { + size += pb::CodedOutputStream.ComputeInt32Size(1, AggregatedPayloadSize); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static StreamingInputCallResponse ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static StreamingInputCallResponse ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static StreamingInputCallResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingInputCallResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private StreamingInputCallResponse MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(StreamingInputCallResponse prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(StreamingInputCallResponse cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private StreamingInputCallResponse result; + + private StreamingInputCallResponse PrepareBuilder() { + if (resultIsReadOnly) { + StreamingInputCallResponse original = result; + result = new StreamingInputCallResponse(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override StreamingInputCallResponse MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.StreamingInputCallResponse.Descriptor; } + } + + public override StreamingInputCallResponse DefaultInstanceForType { + get { return global::grpc.testing.StreamingInputCallResponse.DefaultInstance; } + } + + public override StreamingInputCallResponse BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is StreamingInputCallResponse) { + return MergeFrom((StreamingInputCallResponse) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(StreamingInputCallResponse other) { + if (other == global::grpc.testing.StreamingInputCallResponse.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasAggregatedPayloadSize) { + AggregatedPayloadSize = other.AggregatedPayloadSize; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_streamingInputCallResponseFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _streamingInputCallResponseFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + result.hasAggregatedPayloadSize = input.ReadInt32(ref result.aggregatedPayloadSize_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasAggregatedPayloadSize { + get { return result.hasAggregatedPayloadSize; } + } + public int AggregatedPayloadSize { + get { return result.AggregatedPayloadSize; } + set { SetAggregatedPayloadSize(value); } + } + public Builder SetAggregatedPayloadSize(int value) { + PrepareBuilder(); + result.hasAggregatedPayloadSize = true; + result.aggregatedPayloadSize_ = value; + return this; + } + public Builder ClearAggregatedPayloadSize() { + PrepareBuilder(); + result.hasAggregatedPayloadSize = false; + result.aggregatedPayloadSize_ = 0; + return this; + } + } + static StreamingInputCallResponse() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class ResponseParameters : pb::GeneratedMessage { + private ResponseParameters() { } + private static readonly ResponseParameters defaultInstance = new ResponseParameters().MakeReadOnly(); + private static readonly string[] _responseParametersFieldNames = new string[] { "interval_us", "size" }; + private static readonly uint[] _responseParametersFieldTags = new uint[] { 16, 8 }; + public static ResponseParameters DefaultInstance { + get { return defaultInstance; } + } + + public override ResponseParameters DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override ResponseParameters ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_ResponseParameters__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_ResponseParameters__FieldAccessorTable; } + } + + public const int SizeFieldNumber = 1; + private bool hasSize; + private int size_; + public bool HasSize { + get { return hasSize; } + } + public int Size { + get { return size_; } + } + + public const int IntervalUsFieldNumber = 2; + private bool hasIntervalUs; + private int intervalUs_; + public bool HasIntervalUs { + get { return hasIntervalUs; } + } + public int IntervalUs { + get { return intervalUs_; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _responseParametersFieldNames; + if (hasSize) { + output.WriteInt32(1, field_names[1], Size); + } + if (hasIntervalUs) { + output.WriteInt32(2, field_names[0], IntervalUs); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasSize) { + size += pb::CodedOutputStream.ComputeInt32Size(1, Size); + } + if (hasIntervalUs) { + size += pb::CodedOutputStream.ComputeInt32Size(2, IntervalUs); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static ResponseParameters ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static ResponseParameters ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static ResponseParameters ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static ResponseParameters ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static ResponseParameters ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static ResponseParameters ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static ResponseParameters ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static ResponseParameters ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static ResponseParameters ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static ResponseParameters ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private ResponseParameters MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(ResponseParameters prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(ResponseParameters cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private ResponseParameters result; + + private ResponseParameters PrepareBuilder() { + if (resultIsReadOnly) { + ResponseParameters original = result; + result = new ResponseParameters(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override ResponseParameters MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.ResponseParameters.Descriptor; } + } + + public override ResponseParameters DefaultInstanceForType { + get { return global::grpc.testing.ResponseParameters.DefaultInstance; } + } + + public override ResponseParameters BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is ResponseParameters) { + return MergeFrom((ResponseParameters) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(ResponseParameters other) { + if (other == global::grpc.testing.ResponseParameters.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasSize) { + Size = other.Size; + } + if (other.HasIntervalUs) { + IntervalUs = other.IntervalUs; + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_responseParametersFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _responseParametersFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + result.hasSize = input.ReadInt32(ref result.size_); + break; + } + case 16: { + result.hasIntervalUs = input.ReadInt32(ref result.intervalUs_); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasSize { + get { return result.hasSize; } + } + public int Size { + get { return result.Size; } + set { SetSize(value); } + } + public Builder SetSize(int value) { + PrepareBuilder(); + result.hasSize = true; + result.size_ = value; + return this; + } + public Builder ClearSize() { + PrepareBuilder(); + result.hasSize = false; + result.size_ = 0; + return this; + } + + public bool HasIntervalUs { + get { return result.hasIntervalUs; } + } + public int IntervalUs { + get { return result.IntervalUs; } + set { SetIntervalUs(value); } + } + public Builder SetIntervalUs(int value) { + PrepareBuilder(); + result.hasIntervalUs = true; + result.intervalUs_ = value; + return this; + } + public Builder ClearIntervalUs() { + PrepareBuilder(); + result.hasIntervalUs = false; + result.intervalUs_ = 0; + return this; + } + } + static ResponseParameters() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class StreamingOutputCallRequest : pb::GeneratedMessage { + private StreamingOutputCallRequest() { } + private static readonly StreamingOutputCallRequest defaultInstance = new StreamingOutputCallRequest().MakeReadOnly(); + private static readonly string[] _streamingOutputCallRequestFieldNames = new string[] { "payload", "response_parameters", "response_type" }; + private static readonly uint[] _streamingOutputCallRequestFieldTags = new uint[] { 26, 18, 8 }; + public static StreamingOutputCallRequest DefaultInstance { + get { return defaultInstance; } + } + + public override StreamingOutputCallRequest DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override StreamingOutputCallRequest ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingOutputCallRequest__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingOutputCallRequest__FieldAccessorTable; } + } + + public const int ResponseTypeFieldNumber = 1; + private bool hasResponseType; + private global::grpc.testing.PayloadType responseType_ = global::grpc.testing.PayloadType.COMPRESSABLE; + public bool HasResponseType { + get { return hasResponseType; } + } + public global::grpc.testing.PayloadType ResponseType { + get { return responseType_; } + } + + public const int ResponseParametersFieldNumber = 2; + private pbc::PopsicleList responseParameters_ = new pbc::PopsicleList(); + public scg::IList ResponseParametersList { + get { return responseParameters_; } + } + public int ResponseParametersCount { + get { return responseParameters_.Count; } + } + public global::grpc.testing.ResponseParameters GetResponseParameters(int index) { + return responseParameters_[index]; + } + + public const int PayloadFieldNumber = 3; + private bool hasPayload; + private global::grpc.testing.Payload payload_; + public bool HasPayload { + get { return hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return payload_ ?? global::grpc.testing.Payload.DefaultInstance; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _streamingOutputCallRequestFieldNames; + if (hasResponseType) { + output.WriteEnum(1, field_names[2], (int) ResponseType, ResponseType); + } + if (responseParameters_.Count > 0) { + output.WriteMessageArray(2, field_names[1], responseParameters_); + } + if (hasPayload) { + output.WriteMessage(3, field_names[0], Payload); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasResponseType) { + size += pb::CodedOutputStream.ComputeEnumSize(1, (int) ResponseType); + } + foreach (global::grpc.testing.ResponseParameters element in ResponseParametersList) { + size += pb::CodedOutputStream.ComputeMessageSize(2, element); + } + if (hasPayload) { + size += pb::CodedOutputStream.ComputeMessageSize(3, Payload); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static StreamingOutputCallRequest ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static StreamingOutputCallRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingOutputCallRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private StreamingOutputCallRequest MakeReadOnly() { + responseParameters_.MakeReadOnly(); + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(StreamingOutputCallRequest prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(StreamingOutputCallRequest cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private StreamingOutputCallRequest result; + + private StreamingOutputCallRequest PrepareBuilder() { + if (resultIsReadOnly) { + StreamingOutputCallRequest original = result; + result = new StreamingOutputCallRequest(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override StreamingOutputCallRequest MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.StreamingOutputCallRequest.Descriptor; } + } + + public override StreamingOutputCallRequest DefaultInstanceForType { + get { return global::grpc.testing.StreamingOutputCallRequest.DefaultInstance; } + } + + public override StreamingOutputCallRequest BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is StreamingOutputCallRequest) { + return MergeFrom((StreamingOutputCallRequest) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(StreamingOutputCallRequest other) { + if (other == global::grpc.testing.StreamingOutputCallRequest.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasResponseType) { + ResponseType = other.ResponseType; + } + if (other.responseParameters_.Count != 0) { + result.responseParameters_.Add(other.responseParameters_); + } + if (other.HasPayload) { + MergePayload(other.Payload); + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_streamingOutputCallRequestFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _streamingOutputCallRequestFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 8: { + object unknown; + if(input.ReadEnum(ref result.responseType_, out unknown)) { + result.hasResponseType = true; + } else if(unknown is int) { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + unknownFields.MergeVarintField(1, (ulong)(int)unknown); + } + break; + } + case 18: { + input.ReadMessageArray(tag, field_name, result.responseParameters_, global::grpc.testing.ResponseParameters.DefaultInstance, extensionRegistry); + break; + } + case 26: { + global::grpc.testing.Payload.Builder subBuilder = global::grpc.testing.Payload.CreateBuilder(); + if (result.hasPayload) { + subBuilder.MergeFrom(Payload); + } + input.ReadMessage(subBuilder, extensionRegistry); + Payload = subBuilder.BuildPartial(); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasResponseType { + get { return result.hasResponseType; } + } + public global::grpc.testing.PayloadType ResponseType { + get { return result.ResponseType; } + set { SetResponseType(value); } + } + public Builder SetResponseType(global::grpc.testing.PayloadType value) { + PrepareBuilder(); + result.hasResponseType = true; + result.responseType_ = value; + return this; + } + public Builder ClearResponseType() { + PrepareBuilder(); + result.hasResponseType = false; + result.responseType_ = global::grpc.testing.PayloadType.COMPRESSABLE; + return this; + } + + public pbc::IPopsicleList ResponseParametersList { + get { return PrepareBuilder().responseParameters_; } + } + public int ResponseParametersCount { + get { return result.ResponseParametersCount; } + } + public global::grpc.testing.ResponseParameters GetResponseParameters(int index) { + return result.GetResponseParameters(index); + } + public Builder SetResponseParameters(int index, global::grpc.testing.ResponseParameters value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.responseParameters_[index] = value; + return this; + } + public Builder SetResponseParameters(int index, global::grpc.testing.ResponseParameters.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.responseParameters_[index] = builderForValue.Build(); + return this; + } + public Builder AddResponseParameters(global::grpc.testing.ResponseParameters value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.responseParameters_.Add(value); + return this; + } + public Builder AddResponseParameters(global::grpc.testing.ResponseParameters.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.responseParameters_.Add(builderForValue.Build()); + return this; + } + public Builder AddRangeResponseParameters(scg::IEnumerable values) { + PrepareBuilder(); + result.responseParameters_.Add(values); + return this; + } + public Builder ClearResponseParameters() { + PrepareBuilder(); + result.responseParameters_.Clear(); + return this; + } + + public bool HasPayload { + get { return result.hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return result.Payload; } + set { SetPayload(value); } + } + public Builder SetPayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = value; + return this; + } + public Builder SetPayload(global::grpc.testing.Payload.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = builderForValue.Build(); + return this; + } + public Builder MergePayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + if (result.hasPayload && + result.payload_ != global::grpc.testing.Payload.DefaultInstance) { + result.payload_ = global::grpc.testing.Payload.CreateBuilder(result.payload_).MergeFrom(value).BuildPartial(); + } else { + result.payload_ = value; + } + result.hasPayload = true; + return this; + } + public Builder ClearPayload() { + PrepareBuilder(); + result.hasPayload = false; + result.payload_ = null; + return this; + } + } + static StreamingOutputCallRequest() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class StreamingOutputCallResponse : pb::GeneratedMessage { + private StreamingOutputCallResponse() { } + private static readonly StreamingOutputCallResponse defaultInstance = new StreamingOutputCallResponse().MakeReadOnly(); + private static readonly string[] _streamingOutputCallResponseFieldNames = new string[] { "payload" }; + private static readonly uint[] _streamingOutputCallResponseFieldTags = new uint[] { 10 }; + public static StreamingOutputCallResponse DefaultInstance { + get { return defaultInstance; } + } + + public override StreamingOutputCallResponse DefaultInstanceForType { + get { return DefaultInstance; } + } + + protected override StreamingOutputCallResponse ThisMessage { + get { return this; } + } + + public static pbd::MessageDescriptor Descriptor { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingOutputCallResponse__Descriptor; } + } + + protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors { + get { return global::grpc.testing.Messages.internal__static_grpc_testing_StreamingOutputCallResponse__FieldAccessorTable; } + } + + public const int PayloadFieldNumber = 1; + private bool hasPayload; + private global::grpc.testing.Payload payload_; + public bool HasPayload { + get { return hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return payload_ ?? global::grpc.testing.Payload.DefaultInstance; } + } + + public override bool IsInitialized { + get { + return true; + } + } + + public override void WriteTo(pb::ICodedOutputStream output) { + int size = SerializedSize; + string[] field_names = _streamingOutputCallResponseFieldNames; + if (hasPayload) { + output.WriteMessage(1, field_names[0], Payload); + } + UnknownFields.WriteTo(output); + } + + private int memoizedSerializedSize = -1; + public override int SerializedSize { + get { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (hasPayload) { + size += pb::CodedOutputStream.ComputeMessageSize(1, Payload); + } + size += UnknownFields.SerializedSize; + memoizedSerializedSize = size; + return size; + } + } + + public static StreamingOutputCallResponse ParseFrom(pb::ByteString data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(byte[] data) { + return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(global::System.IO.Stream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseDelimitedFrom(global::System.IO.Stream input) { + return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); + } + public static StreamingOutputCallResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { + return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(pb::ICodedInputStream input) { + return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); + } + public static StreamingOutputCallResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); + } + private StreamingOutputCallResponse MakeReadOnly() { + return this; + } + + public static Builder CreateBuilder() { return new Builder(); } + public override Builder ToBuilder() { return CreateBuilder(this); } + public override Builder CreateBuilderForType() { return new Builder(); } + public static Builder CreateBuilder(StreamingOutputCallResponse prototype) { + return new Builder(prototype); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class Builder : pb::GeneratedBuilder { + protected override Builder ThisBuilder { + get { return this; } + } + public Builder() { + result = DefaultInstance; + resultIsReadOnly = true; + } + internal Builder(StreamingOutputCallResponse cloneFrom) { + result = cloneFrom; + resultIsReadOnly = true; + } + + private bool resultIsReadOnly; + private StreamingOutputCallResponse result; + + private StreamingOutputCallResponse PrepareBuilder() { + if (resultIsReadOnly) { + StreamingOutputCallResponse original = result; + result = new StreamingOutputCallResponse(); + resultIsReadOnly = false; + MergeFrom(original); + } + return result; + } + + public override bool IsInitialized { + get { return result.IsInitialized; } + } + + protected override StreamingOutputCallResponse MessageBeingBuilt { + get { return PrepareBuilder(); } + } + + public override Builder Clear() { + result = DefaultInstance; + resultIsReadOnly = true; + return this; + } + + public override Builder Clone() { + if (resultIsReadOnly) { + return new Builder(result); + } else { + return new Builder().MergeFrom(result); + } + } + + public override pbd::MessageDescriptor DescriptorForType { + get { return global::grpc.testing.StreamingOutputCallResponse.Descriptor; } + } + + public override StreamingOutputCallResponse DefaultInstanceForType { + get { return global::grpc.testing.StreamingOutputCallResponse.DefaultInstance; } + } + + public override StreamingOutputCallResponse BuildPartial() { + if (resultIsReadOnly) { + return result; + } + resultIsReadOnly = true; + return result.MakeReadOnly(); + } + + public override Builder MergeFrom(pb::IMessage other) { + if (other is StreamingOutputCallResponse) { + return MergeFrom((StreamingOutputCallResponse) other); + } else { + base.MergeFrom(other); + return this; + } + } + + public override Builder MergeFrom(StreamingOutputCallResponse other) { + if (other == global::grpc.testing.StreamingOutputCallResponse.DefaultInstance) return this; + PrepareBuilder(); + if (other.HasPayload) { + MergePayload(other.Payload); + } + this.MergeUnknownFields(other.UnknownFields); + return this; + } + + public override Builder MergeFrom(pb::ICodedInputStream input) { + return MergeFrom(input, pb::ExtensionRegistry.Empty); + } + + public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { + PrepareBuilder(); + pb::UnknownFieldSet.Builder unknownFields = null; + uint tag; + string field_name; + while (input.ReadTag(out tag, out field_name)) { + if(tag == 0 && field_name != null) { + int field_ordinal = global::System.Array.BinarySearch(_streamingOutputCallResponseFieldNames, field_name, global::System.StringComparer.Ordinal); + if(field_ordinal >= 0) + tag = _streamingOutputCallResponseFieldTags[field_ordinal]; + else { + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + continue; + } + } + switch (tag) { + case 0: { + throw pb::InvalidProtocolBufferException.InvalidTag(); + } + default: { + if (pb::WireFormat.IsEndGroupTag(tag)) { + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + if (unknownFields == null) { + unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); + } + ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); + break; + } + case 10: { + global::grpc.testing.Payload.Builder subBuilder = global::grpc.testing.Payload.CreateBuilder(); + if (result.hasPayload) { + subBuilder.MergeFrom(Payload); + } + input.ReadMessage(subBuilder, extensionRegistry); + Payload = subBuilder.BuildPartial(); + break; + } + } + } + + if (unknownFields != null) { + this.UnknownFields = unknownFields.Build(); + } + return this; + } + + + public bool HasPayload { + get { return result.hasPayload; } + } + public global::grpc.testing.Payload Payload { + get { return result.Payload; } + set { SetPayload(value); } + } + public Builder SetPayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = value; + return this; + } + public Builder SetPayload(global::grpc.testing.Payload.Builder builderForValue) { + pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue"); + PrepareBuilder(); + result.hasPayload = true; + result.payload_ = builderForValue.Build(); + return this; + } + public Builder MergePayload(global::grpc.testing.Payload value) { + pb::ThrowHelper.ThrowIfNull(value, "value"); + PrepareBuilder(); + if (result.hasPayload && + result.payload_ != global::grpc.testing.Payload.DefaultInstance) { + result.payload_ = global::grpc.testing.Payload.CreateBuilder(result.payload_).MergeFrom(value).BuildPartial(); + } else { + result.payload_ = value; + } + result.hasPayload = true; + return this; + } + public Builder ClearPayload() { + PrepareBuilder(); + result.hasPayload = false; + result.payload_ = null; + return this; + } + } + static StreamingOutputCallResponse() { + object.ReferenceEquals(global::grpc.testing.Messages.Descriptor, null); + } + } + + #endregion + +} +#endregion Designer generated code diff --git a/src/csharp/GrpcApi/TestServiceGrpc.cs b/src/csharp/GrpcApi/TestServiceGrpc.cs new file mode 100644 index 00000000000..65ca1f07677 --- /dev/null +++ b/src/csharp/GrpcApi/TestServiceGrpc.cs @@ -0,0 +1,103 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Reactive.Linq; +using Google.GRPC.Core; + +namespace grpc.testing +{ + /// + /// TestService (this is handwritten version of code that will normally be generated). + /// + public class TestServiceGrpc + { + readonly static Marshaller emptyMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), Empty.ParseFrom); + readonly static Marshaller simpleRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleRequest.ParseFrom); + readonly static Marshaller simpleResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleResponse.ParseFrom); + + readonly static Method emptyCallMethod = new Method( + MethodType.Unary, + "/grpc.testing.TestService/EmptyCall", + emptyMarshaller, + emptyMarshaller + ); + readonly static Method unaryCallMethod = new Method( + MethodType.Unary, + "/grpc.testing.TestService/UnaryCall", + simpleRequestMarshaller, + simpleResponseMarshaller + ); + + public interface ITestServiceClient + { + Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken)); + + Task EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken)); + + SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken)); + + Task UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken)); + + // TODO: StreamingOutputCall + // TODO: StreamingInputCall + // TODO: FullDuplexCall + // TODO: HalfDuplexCall + } + + public class TestServiceClientStub : ITestServiceClient + { + readonly Channel channel; + + public TestServiceClientStub(Channel channel) + { + this.channel = channel; + } + + public Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(emptyCallMethod, channel); + return Calls.BlockingUnaryCall(call, request, token); + } + + public Task EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(emptyCallMethod, channel); + return Calls.AsyncUnaryCall(call, request, token); + } + + public SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(unaryCallMethod, channel); + return Calls.BlockingUnaryCall(call, request, token); + } + + public Task UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(unaryCallMethod, channel); + return Calls.AsyncUnaryCall(call, request, token); + } + } + + // server-side interface + public interface ITestService + { + void EmptyCall(Empty request, IObserver responseObserver); + + void UnaryCall(SimpleRequest request, IObserver responseObserver); + } + + public static ServerServiceDefinition BindService(ITestService serviceImpl) + { + return ServerServiceDefinition.CreateBuilder("/grpc.testing.TestService/") + .AddMethod(emptyCallMethod, serviceImpl.EmptyCall) + .AddMethod(unaryCallMethod, serviceImpl.UnaryCall) + .Build(); + } + + public static ITestServiceClient NewStub(Channel channel) + { + return new TestServiceClientStub(channel); + } + } +} \ No newline at end of file diff --git a/src/csharp/GrpcApi/proto/empty.proto b/src/csharp/GrpcApi/proto/empty.proto new file mode 100644 index 00000000000..c88b5318cd3 --- /dev/null +++ b/src/csharp/GrpcApi/proto/empty.proto @@ -0,0 +1,13 @@ +syntax = "proto2"; + +package grpc.testing; + +// An empty message that you can re-use to avoid defining duplicated empty +// messages in your project. A typical example is to use it as argument or the +// return value of a service API. For instance: +// +// service Foo { +// rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { }; +// }; +// +message Empty {} diff --git a/src/csharp/GrpcApi/math.proto b/src/csharp/GrpcApi/proto/math.proto old mode 100755 new mode 100644 similarity index 100% rename from src/csharp/GrpcApi/math.proto rename to src/csharp/GrpcApi/proto/math.proto diff --git a/src/csharp/GrpcApi/proto/messages.proto b/src/csharp/GrpcApi/proto/messages.proto new file mode 100644 index 00000000000..1d95154cf49 --- /dev/null +++ b/src/csharp/GrpcApi/proto/messages.proto @@ -0,0 +1,102 @@ +// Message definitions to be used by integration test service definitions. + +syntax = "proto2"; + +package grpc.testing; + +// The type of payload that should be returned. +enum PayloadType { + // Compressable text format. + COMPRESSABLE = 0; + + // Uncompressable binary format. + UNCOMPRESSABLE = 1; + + // Randomly chosen from all other formats defined in this enum. + RANDOM = 2; +} + +// A block of data, to simply increase gRPC message size. +message Payload { + // The type of data in body. + optional PayloadType type = 1; + // Primary contents of payload. + optional bytes body = 2; +} + +// Unary request. +message SimpleRequest { + // Desired payload type in the response from the server. + // If response_type is RANDOM, server randomly chooses one from other formats. + optional PayloadType response_type = 1; + + // Desired payload size in the response from the server. + // If response_type is COMPRESSABLE, this denotes the size before compression. + optional int32 response_size = 2; + + // Optional input payload sent along with the request. + optional Payload payload = 3; + + // Whether SimpleResponse should include username. + optional bool fill_username = 4; + + // Whether SimpleResponse should include OAuth scope. + optional bool fill_oauth_scope = 5; +} + +// Unary response, as configured by the request. +message SimpleResponse { + // Payload to increase message size. + optional Payload payload = 1; + // The user the request came from, for verifying authentication was + // successful when the client expected it. + optional string username = 2; + // OAuth scope. + optional string oauth_scope = 3; +} + +// Client-streaming request. +message StreamingInputCallRequest { + // Optional input payload sent along with the request. + optional Payload payload = 1; + + // Not expecting any payload from the response. +} + +// Client-streaming response. +message StreamingInputCallResponse { + // Aggregated size of payloads received from the client. + optional int32 aggregated_payload_size = 1; +} + +// Configuration for a particular response. +message ResponseParameters { + // Desired payload sizes in responses from the server. + // If response_type is COMPRESSABLE, this denotes the size before compression. + optional int32 size = 1; + + // Desired interval between consecutive responses in the response stream in + // microseconds. + optional int32 interval_us = 2; +} + +// Server-streaming request. +message StreamingOutputCallRequest { + // Desired payload type in the response from the server. + // If response_type is RANDOM, the payload from each response in the stream + // might be of different types. This is to simulate a mixed type of payload + // stream. + optional PayloadType response_type = 1; + + // Configuration for each expected response message. + repeated ResponseParameters response_parameters = 2; + + // Optional input payload sent along with the request. + optional Payload payload = 3; +} + +// Server-streaming response, as configured by the request and parameters. +message StreamingOutputCallResponse { + // Payload to increase response size. + optional Payload payload = 1; +} diff --git a/src/csharp/GrpcApi/proto/test.proto b/src/csharp/GrpcApi/proto/test.proto new file mode 100644 index 00000000000..8380ebb31de --- /dev/null +++ b/src/csharp/GrpcApi/proto/test.proto @@ -0,0 +1,42 @@ +// An integration test service that covers all the method signature permutations +// of unary/streaming requests/responses. +syntax = "proto2"; + +import "empty.proto"; +import "messages.proto"; + +package grpc.testing; + +// A simple service to test the various types of RPCs and experiment with +// performance with various types of payload. +service TestService { + // One empty request followed by one empty response. + rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty); + + // One request followed by one response. + // The server returns the client payload as-is. + rpc UnaryCall(SimpleRequest) returns (SimpleResponse); + + // One request followed by a sequence of responses (streamed download). + // The server returns the payload with client desired type and sizes. + rpc StreamingOutputCall(StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); + + // A sequence of requests followed by one response (streamed upload). + // The server returns the aggregated size of client payload as the result. + rpc StreamingInputCall(stream StreamingInputCallRequest) + returns (StreamingInputCallResponse); + + // A sequence of requests with each request served by the server immediately. + // As one request could lead to multiple responses, this interface + // demonstrates the idea of full duplexing. + rpc FullDuplexCall(stream StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); + + // A sequence of requests followed by a sequence of responses. + // The server buffers all the client requests and then serves them in order. A + // stream of responses are returned to the client when the server starts with + // first request. + rpc HalfDuplexCall(stream StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); +} From eb3e76e76c9789dddec88674a79c494eea1ce9c9 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 6 Feb 2015 11:43:13 -0800 Subject: [PATCH 2/6] scaffolding for interop_client and little bit of project renaming --- src/csharp/Grpc.sln | 12 +- src/csharp/GrpcApi/GrpcApi.csproj | 2 +- .../GrpcApi/{Examples.cs => MathExamples.cs} | 2 +- .../{GrpcDemo => InteropClient}/.gitignore | 0 src/csharp/InteropClient/InteropClient.cs | 172 ++++++++++++++++++ src/csharp/InteropClient/InteropClient.csproj | 59 ++++++ .../InteropClient/Properties/AssemblyInfo.cs | 22 +++ src/csharp/MathClient/.gitignore | 1 + .../Program.cs => MathClient/MathClient.cs} | 14 +- .../MathClient.csproj} | 2 +- .../Properties/AssemblyInfo.cs | 2 +- 11 files changed, 273 insertions(+), 15 deletions(-) rename src/csharp/GrpcApi/{Examples.cs => MathExamples.cs} (98%) rename src/csharp/{GrpcDemo => InteropClient}/.gitignore (100%) create mode 100644 src/csharp/InteropClient/InteropClient.cs create mode 100644 src/csharp/InteropClient/InteropClient.csproj create mode 100644 src/csharp/InteropClient/Properties/AssemblyInfo.cs create mode 100644 src/csharp/MathClient/.gitignore rename src/csharp/{GrpcDemo/Program.cs => MathClient/MathClient.cs} (65%) rename src/csharp/{GrpcDemo/GrpcDemo.csproj => MathClient/MathClient.csproj} (97%) rename src/csharp/{GrpcDemo => MathClient}/Properties/AssemblyInfo.cs (95%) diff --git a/src/csharp/Grpc.sln b/src/csharp/Grpc.sln index c46c4d67620..2fd10cb94af 100644 --- a/src/csharp/Grpc.sln +++ b/src/csharp/Grpc.sln @@ -1,8 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrpcDemo", "GrpcDemo\GrpcDemo.csproj", "{61ECB8EE-0C96-4F8E-B187-8E4D227417C0}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrpcApi", "GrpcApi\GrpcApi.csproj", "{7DC1433E-3225-42C7-B7EA-546D56E27A4B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrpcCore", "GrpcCore\GrpcCore.csproj", "{CCC4440E-49F7-4790-B0AF-FEABB0837AE7}" @@ -11,6 +9,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrpcCoreTests", "GrpcCoreTe EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrpcApiTests", "GrpcApiTests\GrpcApiTests.csproj", "{143B1C29-C442-4BE0-BF3F-A8F92288AC9F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MathClient", "MathClient\MathClient.csproj", "{61ECB8EE-0C96-4F8E-B187-8E4D227417C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InteropClient", "InteropClient\InteropClient.csproj", "{C61154BA-DD4A-4838-8420-0162A28925E0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 @@ -33,12 +35,16 @@ Global {86EC5CB4-4EA2-40A2-8057-86542A0353BB}.Debug|x86.Build.0 = Debug|Any CPU {86EC5CB4-4EA2-40A2-8057-86542A0353BB}.Release|x86.ActiveCfg = Release|Any CPU {86EC5CB4-4EA2-40A2-8057-86542A0353BB}.Release|x86.Build.0 = Release|Any CPU + {C61154BA-DD4A-4838-8420-0162A28925E0}.Debug|x86.ActiveCfg = Debug|x86 + {C61154BA-DD4A-4838-8420-0162A28925E0}.Debug|x86.Build.0 = Debug|x86 + {C61154BA-DD4A-4838-8420-0162A28925E0}.Release|x86.ActiveCfg = Release|x86 + {C61154BA-DD4A-4838-8420-0162A28925E0}.Release|x86.Build.0 = Release|x86 {CCC4440E-49F7-4790-B0AF-FEABB0837AE7}.Debug|x86.ActiveCfg = Debug|Any CPU {CCC4440E-49F7-4790-B0AF-FEABB0837AE7}.Debug|x86.Build.0 = Debug|Any CPU {CCC4440E-49F7-4790-B0AF-FEABB0837AE7}.Release|x86.ActiveCfg = Release|Any CPU {CCC4440E-49F7-4790-B0AF-FEABB0837AE7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = GrpcDemo\GrpcDemo.csproj + StartupItem = GrpcApi\GrpcApi.csproj EndGlobalSection EndGlobal diff --git a/src/csharp/GrpcApi/GrpcApi.csproj b/src/csharp/GrpcApi/GrpcApi.csproj index bf457a1e6b5..f0f11de2167 100644 --- a/src/csharp/GrpcApi/GrpcApi.csproj +++ b/src/csharp/GrpcApi/GrpcApi.csproj @@ -47,13 +47,13 @@ - + diff --git a/src/csharp/GrpcApi/Examples.cs b/src/csharp/GrpcApi/MathExamples.cs similarity index 98% rename from src/csharp/GrpcApi/Examples.cs rename to src/csharp/GrpcApi/MathExamples.cs index d2a6cc01fdb..43f0cedef6e 100644 --- a/src/csharp/GrpcApi/Examples.cs +++ b/src/csharp/GrpcApi/MathExamples.cs @@ -6,7 +6,7 @@ using Google.GRPC.Core.Utils; namespace math { - public class Examples + public static class MathExamples { public static void DivExample(MathGrpc.IMathServiceClient stub) { diff --git a/src/csharp/GrpcDemo/.gitignore b/src/csharp/InteropClient/.gitignore similarity index 100% rename from src/csharp/GrpcDemo/.gitignore rename to src/csharp/InteropClient/.gitignore diff --git a/src/csharp/InteropClient/InteropClient.cs b/src/csharp/InteropClient/InteropClient.cs new file mode 100644 index 00000000000..62091c5fdc3 --- /dev/null +++ b/src/csharp/InteropClient/InteropClient.cs @@ -0,0 +1,172 @@ +using System; +using NUnit.Framework; +using System.Text.RegularExpressions; +using Google.GRPC.Core; +using Google.ProtocolBuffers; +using grpc.testing; + +namespace InteropClient +{ + class InteropClient + { + private class ClientOptions + { + public bool help; + public string serverHost; + public string serverHostOverride; + public int? serverPort; + public string testCase; + public bool useTls; + public bool useTestCa; + } + + ClientOptions options; + + private InteropClient(ClientOptions options) { + this.options = options; + } + + public static void Main(string[] args) + { + Console.WriteLine("gRPC C# interop testing client"); + ClientOptions options = ParseArguments(args); + + if (options.serverHost == null || !options.serverPort.HasValue || options.testCase == null) + { + Console.WriteLine("Missing required argument."); + Console.WriteLine(); + options.help = true; + } + + if (options.help) + { + Console.WriteLine("Usage:"); + Console.WriteLine(" --server_host=HOSTNAME"); + Console.WriteLine(" --server_host_override=HOSTNAME"); + Console.WriteLine(" --server_port=PORT"); + Console.WriteLine(" --test_case=TESTCASE"); + Console.WriteLine(" --use_tls=BOOLEAN"); + Console.WriteLine(" --use_test_ca=BOOLEAN"); + Console.WriteLine(); + Environment.Exit(1); + } + + var interopClient = new InteropClient(options); + interopClient.Run(); + } + + private void Run() + { + string addr = string.Format("{0}:{1}", options.serverHost, options.serverPort); + using (Channel channel = new Channel(addr)) + { + TestServiceGrpc.ITestServiceClient client = new TestServiceGrpc.TestServiceClientStub(channel); + + RunTestCase(options.testCase, client); + } + + GrpcEnvironment.Shutdown(); + } + + private void RunTestCase(string testCase, TestServiceGrpc.ITestServiceClient client) + { + switch (testCase) + { + case "empty_unary": + RunEmptyUnary(client); + break; + case "large_unary": + RunLargeUnary(client); + break; + default: + throw new ArgumentException("Unknown test case " + testCase); + } + } + + private void RunEmptyUnary(TestServiceGrpc.ITestServiceClient client) + { + Console.WriteLine("running empty_unary"); + var response = client.EmptyCall(Empty.DefaultInstance); + Assert.IsNotNull(response); + } + + private void RunLargeUnary(TestServiceGrpc.ITestServiceClient client) + { + Console.WriteLine("running large_unary"); + var request = SimpleRequest.CreateBuilder() + .SetResponseType(PayloadType.COMPRESSABLE) + .SetResponseSize(314159) + .SetPayload(Payload.CreateBuilder().SetBody(ByteString.CopyFrom(new byte[271828]))) + .Build(); + + var response = client.UnaryCall(request); + + Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); + Assert.AreEqual(314159, response.Payload.Body.Length); + // TODO: assert that the response is all zeros... + } + + private static ClientOptions ParseArguments(string[] args) + { + var options = new ClientOptions(); + foreach(string arg in args) + { + ParseArgument(arg, options); + if (options.help) + { + break; + } + } + return options; + } + + private static void ParseArgument(string arg, ClientOptions options) + { + Match match; + match = Regex.Match(arg, "--server_host=(.*)"); + if (match.Success) + { + options.serverHost = match.Groups[1].Value.Trim(); + return; + } + + match = Regex.Match(arg, "--server_host_override=(.*)"); + if (match.Success) + { + options.serverHostOverride = match.Groups[1].Value.Trim(); + return; + } + + match = Regex.Match(arg, "--server_port=(.*)"); + if (match.Success) + { + options.serverPort = int.Parse(match.Groups[1].Value.Trim()); + return; + } + + match = Regex.Match(arg, "--test_case=(.*)"); + if (match.Success) + { + options.testCase = match.Groups[1].Value.Trim(); + return; + } + + match = Regex.Match(arg, "--use_tls=(.*)"); + if (match.Success) + { + options.useTls = bool.Parse(match.Groups[1].Value.Trim()); + return; + } + + match = Regex.Match(arg, "--use_test_ca=(.*)"); + if (match.Success) + { + options.useTestCa = bool.Parse(match.Groups[1].Value.Trim()); + return; + } + + Console.WriteLine(string.Format("Unrecognized argument \"{0}\"", arg)); + options.help = true; + } + } +} diff --git a/src/csharp/InteropClient/InteropClient.csproj b/src/csharp/InteropClient/InteropClient.csproj new file mode 100644 index 00000000000..ecc1c108759 --- /dev/null +++ b/src/csharp/InteropClient/InteropClient.csproj @@ -0,0 +1,59 @@ + + + + Debug + x86 + 10.0.0 + 2.0 + {C61154BA-DD4A-4838-8420-0162A28925E0} + Exe + InteropClient + InteropClient + InteropClient.InteropClient + v4.5 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + true + x86 + + + full + true + bin\Release + prompt + 4 + true + x86 + + + + + False + + + ..\lib\Google.ProtocolBuffers.dll + + + + + + + + + + {CCC4440E-49F7-4790-B0AF-FEABB0837AE7} + GrpcCore + + + {7DC1433E-3225-42C7-B7EA-546D56E27A4B} + GrpcApi + + + \ No newline at end of file diff --git a/src/csharp/InteropClient/Properties/AssemblyInfo.cs b/src/csharp/InteropClient/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..1f3cc19a9de --- /dev/null +++ b/src/csharp/InteropClient/Properties/AssemblyInfo.cs @@ -0,0 +1,22 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. +[assembly: AssemblyTitle("InteropClient")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("jtattermusch")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. +[assembly: AssemblyVersion("1.0.*")] +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/src/csharp/MathClient/.gitignore b/src/csharp/MathClient/.gitignore new file mode 100644 index 00000000000..ba077a4031a --- /dev/null +++ b/src/csharp/MathClient/.gitignore @@ -0,0 +1 @@ +bin diff --git a/src/csharp/GrpcDemo/Program.cs b/src/csharp/MathClient/MathClient.cs similarity index 65% rename from src/csharp/GrpcDemo/Program.cs rename to src/csharp/MathClient/MathClient.cs index c442c32193e..45222abb79b 100644 --- a/src/csharp/GrpcDemo/Program.cs +++ b/src/csharp/MathClient/MathClient.cs @@ -2,25 +2,23 @@ using System; using System.Runtime.InteropServices; using Google.GRPC.Core; using System.Threading; -using math; -namespace Google.GRPC.Demo +namespace math { - class MainClass + class MathClient { public static void Main (string[] args) { using (Channel channel = new Channel("127.0.0.1:23456")) { - MathGrpc.IMathServiceClient stub = new MathGrpc.MathServiceClientStub(channel); - Examples.DivExample(stub); + MathExamples.DivExample(stub); - Examples.FibExample(stub); + MathExamples.FibExample(stub); - Examples.SumExample(stub); + MathExamples.SumExample(stub); - Examples.DivManyExample(stub); + MathExamples.DivManyExample(stub); } GrpcEnvironment.Shutdown(); diff --git a/src/csharp/GrpcDemo/GrpcDemo.csproj b/src/csharp/MathClient/MathClient.csproj similarity index 97% rename from src/csharp/GrpcDemo/GrpcDemo.csproj rename to src/csharp/MathClient/MathClient.csproj index 31ce7f133b3..74213653d21 100644 --- a/src/csharp/GrpcDemo/GrpcDemo.csproj +++ b/src/csharp/MathClient/MathClient.csproj @@ -35,8 +35,8 @@ - + diff --git a/src/csharp/GrpcDemo/Properties/AssemblyInfo.cs b/src/csharp/MathClient/Properties/AssemblyInfo.cs similarity index 95% rename from src/csharp/GrpcDemo/Properties/AssemblyInfo.cs rename to src/csharp/MathClient/Properties/AssemblyInfo.cs index b8e1406da7c..f521cd63f0c 100644 --- a/src/csharp/GrpcDemo/Properties/AssemblyInfo.cs +++ b/src/csharp/MathClient/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; // Information about this assembly is defined by the following attributes. // Change them to the values specific to your project. -[assembly: AssemblyTitle ("GrpcDemo")] +[assembly: AssemblyTitle ("MathClient")] [assembly: AssemblyDescription ("")] [assembly: AssemblyConfiguration ("")] [assembly: AssemblyCompany ("")] From 56b805ff03f2618847676fc526d61d0f2ff7ed21 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 6 Feb 2015 12:20:28 -0800 Subject: [PATCH 3/6] added support for streaming calls to TestService stubs --- src/csharp/GrpcApi/TestServiceGrpc.cs | 75 +++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/src/csharp/GrpcApi/TestServiceGrpc.cs b/src/csharp/GrpcApi/TestServiceGrpc.cs index 65ca1f07677..e836d604929 100644 --- a/src/csharp/GrpcApi/TestServiceGrpc.cs +++ b/src/csharp/GrpcApi/TestServiceGrpc.cs @@ -15,6 +15,10 @@ namespace grpc.testing readonly static Marshaller emptyMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), Empty.ParseFrom); readonly static Marshaller simpleRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleRequest.ParseFrom); readonly static Marshaller simpleResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleResponse.ParseFrom); + readonly static Marshaller streamingOutputCallRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallRequest.ParseFrom); + readonly static Marshaller streamingOutputCallResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallResponse.ParseFrom); + readonly static Marshaller streamingInputCallRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallRequest.ParseFrom); + readonly static Marshaller streamingInputCallResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallResponse.ParseFrom); readonly static Method emptyCallMethod = new Method( MethodType.Unary, @@ -28,6 +32,30 @@ namespace grpc.testing simpleRequestMarshaller, simpleResponseMarshaller ); + readonly static Method streamingOutputCallMethod = new Method( + MethodType.ServerStreaming, + "/grpc.testing.TestService/StreamingOutputCall", + streamingOutputCallRequestMarshaller, + streamingOutputCallResponseMarshaller + ); + readonly static Method streamingInputCallMethod = new Method( + MethodType.ClientStreaming, + "/grpc.testing.TestService/StreamingInputCall", + streamingInputCallRequestMarshaller, + streamingInputCallResponseMarshaller + ); + readonly static Method fullDuplexCallMethod = new Method( + MethodType.DuplexStreaming, + "/grpc.testing.TestService/FullDuplexCall", + streamingOutputCallRequestMarshaller, + streamingOutputCallResponseMarshaller + ); + readonly static Method halfDuplexCallMethod = new Method( + MethodType.DuplexStreaming, + "/grpc.testing.TestService/HalfDuplexCall", + streamingOutputCallRequestMarshaller, + streamingOutputCallResponseMarshaller + ); public interface ITestServiceClient { @@ -39,10 +67,13 @@ namespace grpc.testing Task UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken)); - // TODO: StreamingOutputCall - // TODO: StreamingInputCall - // TODO: FullDuplexCall - // TODO: HalfDuplexCall + Task StreamingOutputCall(StreamingOutputCallRequest request, IObserver responseObserver, CancellationToken token = default(CancellationToken)); + + ClientStreamingAsyncResult StreamingInputCall(CancellationToken token = default(CancellationToken)); + + IObserver FullDuplexCall(IObserver responseObserver, CancellationToken token = default(CancellationToken)); + + IObserver HalfDuplexCall(IObserver responseObserver, CancellationToken token = default(CancellationToken)); } public class TestServiceClientStub : ITestServiceClient @@ -77,6 +108,30 @@ namespace grpc.testing var call = new Google.GRPC.Core.Call(unaryCallMethod, channel); return Calls.AsyncUnaryCall(call, request, token); } + + public Task StreamingOutputCall(StreamingOutputCallRequest request, IObserver responseObserver, CancellationToken token = default(CancellationToken)) { + var call = new Google.GRPC.Core.Call(streamingOutputCallMethod, channel); + return Calls.AsyncServerStreamingCall(call, request, responseObserver, token); + } + + public ClientStreamingAsyncResult StreamingInputCall(CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(streamingInputCallMethod, channel); + return Calls.AsyncClientStreamingCall(call, token); + } + + public IObserver FullDuplexCall(IObserver responseObserver, CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(fullDuplexCallMethod, channel); + return Calls.DuplexStreamingCall(call, responseObserver, token); + } + + + public IObserver HalfDuplexCall(IObserver responseObserver, CancellationToken token = default(CancellationToken)) + { + var call = new Google.GRPC.Core.Call(halfDuplexCallMethod, channel); + return Calls.DuplexStreamingCall(call, responseObserver, token); + } } // server-side interface @@ -85,6 +140,14 @@ namespace grpc.testing void EmptyCall(Empty request, IObserver responseObserver); void UnaryCall(SimpleRequest request, IObserver responseObserver); + + void StreamingOutputCall(StreamingOutputCallRequest request, IObserver responseObserver); + + IObserver StreamingInputCall(IObserver responseObserver); + + IObserver FullDuplexCall(IObserver responseObserver); + + IObserver HalfDuplexCall(IObserver responseObserver); } public static ServerServiceDefinition BindService(ITestService serviceImpl) @@ -92,6 +155,10 @@ namespace grpc.testing return ServerServiceDefinition.CreateBuilder("/grpc.testing.TestService/") .AddMethod(emptyCallMethod, serviceImpl.EmptyCall) .AddMethod(unaryCallMethod, serviceImpl.UnaryCall) + .AddMethod(streamingOutputCallMethod, serviceImpl.StreamingOutputCall) + .AddMethod(streamingInputCallMethod, serviceImpl.StreamingInputCall) + .AddMethod(fullDuplexCallMethod, serviceImpl.FullDuplexCall) + .AddMethod(halfDuplexCallMethod, serviceImpl.HalfDuplexCall) .Build(); } From d233d3ae58f477dc6718b434685af2b420bf942a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 6 Feb 2015 14:15:00 -0800 Subject: [PATCH 4/6] added some more interop tests --- src/csharp/Grpc.sln | 2 +- src/csharp/GrpcCore/GrpcCore.csproj | 1 + src/csharp/GrpcCore/Utils/RecordingQueue.cs | 45 +++++++ src/csharp/InteropClient/InteropClient.cs | 134 +++++++++++++++++++- 4 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 src/csharp/GrpcCore/Utils/RecordingQueue.cs diff --git a/src/csharp/Grpc.sln b/src/csharp/Grpc.sln index 2fd10cb94af..a7b2c9b5804 100644 --- a/src/csharp/Grpc.sln +++ b/src/csharp/Grpc.sln @@ -45,6 +45,6 @@ Global {CCC4440E-49F7-4790-B0AF-FEABB0837AE7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = GrpcApi\GrpcApi.csproj + StartupItem = InteropClient\InteropClient.csproj EndGlobalSection EndGlobal diff --git a/src/csharp/GrpcCore/GrpcCore.csproj b/src/csharp/GrpcCore/GrpcCore.csproj index fbfe50e4d88..95df8909173 100644 --- a/src/csharp/GrpcCore/GrpcCore.csproj +++ b/src/csharp/GrpcCore/GrpcCore.csproj @@ -62,6 +62,7 @@ + diff --git a/src/csharp/GrpcCore/Utils/RecordingQueue.cs b/src/csharp/GrpcCore/Utils/RecordingQueue.cs new file mode 100644 index 00000000000..8e2f8a496d4 --- /dev/null +++ b/src/csharp/GrpcCore/Utils/RecordingQueue.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Collections.Concurrent; + +namespace Google.GRPC.Core.Utils +{ + public class RecordingQueue : IObserver + { + readonly BlockingCollection queue = new BlockingCollection(); + TaskCompletionSource tcs = new TaskCompletionSource(); + + public void OnCompleted() + { + tcs.SetResult(null); + } + + public void OnError(Exception error) + { + tcs.SetException(error); + } + + public void OnNext(T value) + { + queue.Add(value); + } + + public BlockingCollection Queue + { + get + { + return queue; + } + } + + public Task Finished + { + get + { + return tcs.Task; + } + } + } +} + diff --git a/src/csharp/InteropClient/InteropClient.cs b/src/csharp/InteropClient/InteropClient.cs index 62091c5fdc3..40c4781304d 100644 --- a/src/csharp/InteropClient/InteropClient.cs +++ b/src/csharp/InteropClient/InteropClient.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using NUnit.Framework; using System.Text.RegularExpressions; using Google.GRPC.Core; +using Google.GRPC.Core.Utils; using Google.ProtocolBuffers; using grpc.testing; @@ -78,6 +80,18 @@ namespace InteropClient case "large_unary": RunLargeUnary(client); break; + case "client_streaming": + RunClientStreaming(client); + break; + case "server_streaming": + RunServerStreaming(client); + break; + case "ping_pong": + RunPingPong(client); + break; + case "empty_stream": + RunEmptyStream(client); + break; default: throw new ArgumentException("Unknown test case " + testCase); } @@ -88,6 +102,7 @@ namespace InteropClient Console.WriteLine("running empty_unary"); var response = client.EmptyCall(Empty.DefaultInstance); Assert.IsNotNull(response); + Console.WriteLine("Passed!"); } private void RunLargeUnary(TestServiceGrpc.ITestServiceClient client) @@ -96,14 +111,129 @@ namespace InteropClient var request = SimpleRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .SetResponseSize(314159) - .SetPayload(Payload.CreateBuilder().SetBody(ByteString.CopyFrom(new byte[271828]))) + .SetPayload(CreateZerosPayload(271828)) .Build(); var response = client.UnaryCall(request); Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); Assert.AreEqual(314159, response.Payload.Body.Length); - // TODO: assert that the response is all zeros... + Console.WriteLine("Passed!"); + } + + private void RunClientStreaming(TestServiceGrpc.ITestServiceClient client) + { + Console.WriteLine("running client_streaming"); + + var bodySizes = new List{27182, 8, 1828, 45904}; + + var context = client.StreamingInputCall(); + foreach (var size in bodySizes) + { + context.Inputs.OnNext( + StreamingInputCallRequest.CreateBuilder().SetPayload(CreateZerosPayload(size)).Build()); + } + context.Inputs.OnCompleted(); + + var response = context.Task.Result; + Assert.AreEqual(74922, response.AggregatedPayloadSize); + Console.WriteLine("Passed!"); + } + + private void RunServerStreaming(TestServiceGrpc.ITestServiceClient client) + { + Console.WriteLine("running server_streaming"); + + var bodySizes = new List{31415, 9, 2653, 58979}; + + var request = StreamingOutputCallRequest.CreateBuilder() + .SetResponseType(PayloadType.COMPRESSABLE) + .AddRangeResponseParameters(bodySizes.ConvertAll( + (size) => ResponseParameters.CreateBuilder().SetSize(size).Build())) + .Build(); + + var recorder = new RecordingObserver(); + client.StreamingOutputCall(request, recorder); + + var responseList = recorder.ToList().Result; + + foreach (var res in responseList) + { + Assert.AreEqual(PayloadType.COMPRESSABLE, res.Payload.Type); + } + CollectionAssert.AreEqual(bodySizes, responseList.ConvertAll((item) => item.Payload.Body.Length)); + Console.WriteLine("Passed!"); + } + + private void RunPingPong(TestServiceGrpc.ITestServiceClient client) + { + Console.WriteLine("running ping_pong"); + + var recorder = new RecordingQueue(); + var inputs = client.FullDuplexCall(recorder); + + StreamingOutputCallResponse response; + + inputs.OnNext(StreamingOutputCallRequest.CreateBuilder() + .SetResponseType(PayloadType.COMPRESSABLE) + .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) + .SetPayload(CreateZerosPayload(27182)).Build()); + + response = recorder.Queue.Take(); + Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); + Assert.AreEqual(31415, response.Payload.Body.Length); + + inputs.OnNext(StreamingOutputCallRequest.CreateBuilder() + .SetResponseType(PayloadType.COMPRESSABLE) + .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(9)) + .SetPayload(CreateZerosPayload(8)).Build()); + + response = recorder.Queue.Take(); + Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); + Assert.AreEqual(9, response.Payload.Body.Length); + + inputs.OnNext(StreamingOutputCallRequest.CreateBuilder() + .SetResponseType(PayloadType.COMPRESSABLE) + .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(2635)) + .SetPayload(CreateZerosPayload(1828)).Build()); + + response = recorder.Queue.Take(); + Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); + Assert.AreEqual(2653, response.Payload.Body.Length); + + + inputs.OnNext(StreamingOutputCallRequest.CreateBuilder() + .SetResponseType(PayloadType.COMPRESSABLE) + .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(58979)) + .SetPayload(CreateZerosPayload(45904)).Build()); + + response = recorder.Queue.Take(); + Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); + Assert.AreEqual(58979, response.Payload.Body.Length); + + recorder.Finished.Wait(); + Assert.AreEqual(0, recorder.Queue.Count); + + Console.WriteLine("Passed!"); + } + + private void RunEmptyStream(TestServiceGrpc.ITestServiceClient client) + { + Console.WriteLine("running empty_stream"); + + var recorder = new RecordingObserver(); + var inputs = client.FullDuplexCall(recorder); + inputs.OnCompleted(); + + var responseList = recorder.ToList().Result; + Assert.AreEqual(0, responseList.Count); + + Console.WriteLine("Passed!"); + } + + + private Payload CreateZerosPayload(int size) { + return Payload.CreateBuilder().SetBody(ByteString.CopyFrom(new byte[size])).Build(); } private static ClientOptions ParseArguments(string[] args) From 6b7523d5dcde762e6e969c5258eca160bffa5b30 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 6 Feb 2015 14:20:39 -0800 Subject: [PATCH 5/6] updated readme --- src/csharp/README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/csharp/README.md b/src/csharp/README.md index c2f988cc5e3..0df6925b395 100755 --- a/src/csharp/README.md +++ b/src/csharp/README.md @@ -47,8 +47,11 @@ CONTENTS - ext: The extension library that wraps C API to be more digestible by C#. +- GrpcApi: + API examples for math.proto and testservice.proto - GrpcCore: The main gRPC C# library. -- GrpcApi: - API examples for math.proto. - +- InteropClient: + Client for interop testing. +- MathClient: + An example client that sends some requests to math server. From 392d1e0cfe0c478dbf08cadc75618b2588dc028a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 9 Feb 2015 11:13:51 -0800 Subject: [PATCH 6/6] addressed review comments --- src/csharp/GrpcCore/Utils/RecordingQueue.cs | 5 +++++ src/csharp/InteropClient/{InteropClient.cs => Client.cs} | 9 +++++---- src/csharp/InteropClient/InteropClient.csproj | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) rename src/csharp/InteropClient/{InteropClient.cs => Client.cs} (98%) diff --git a/src/csharp/GrpcCore/Utils/RecordingQueue.cs b/src/csharp/GrpcCore/Utils/RecordingQueue.cs index 8e2f8a496d4..0726f00af7a 100644 --- a/src/csharp/GrpcCore/Utils/RecordingQueue.cs +++ b/src/csharp/GrpcCore/Utils/RecordingQueue.cs @@ -5,6 +5,11 @@ using System.Collections.Concurrent; namespace Google.GRPC.Core.Utils { + /// + /// Observer that allows us to await incoming messages one-by-one. + /// The implementation is not ideal and class will be probably replaced + /// by something more versatile in the future. + /// public class RecordingQueue : IObserver { readonly BlockingCollection queue = new BlockingCollection(); diff --git a/src/csharp/InteropClient/InteropClient.cs b/src/csharp/InteropClient/Client.cs similarity index 98% rename from src/csharp/InteropClient/InteropClient.cs rename to src/csharp/InteropClient/Client.cs index 40c4781304d..9f5815050e7 100644 --- a/src/csharp/InteropClient/InteropClient.cs +++ b/src/csharp/InteropClient/Client.cs @@ -7,9 +7,9 @@ using Google.GRPC.Core.Utils; using Google.ProtocolBuffers; using grpc.testing; -namespace InteropClient +namespace Google.GRPC.Interop { - class InteropClient + class Client { private class ClientOptions { @@ -24,7 +24,8 @@ namespace InteropClient ClientOptions options; - private InteropClient(ClientOptions options) { + private Client(ClientOptions options) + { this.options = options; } @@ -53,7 +54,7 @@ namespace InteropClient Environment.Exit(1); } - var interopClient = new InteropClient(options); + var interopClient = new Client(options); interopClient.Run(); } diff --git a/src/csharp/InteropClient/InteropClient.csproj b/src/csharp/InteropClient/InteropClient.csproj index ecc1c108759..b8e099d7852 100644 --- a/src/csharp/InteropClient/InteropClient.csproj +++ b/src/csharp/InteropClient/InteropClient.csproj @@ -9,7 +9,7 @@ Exe InteropClient InteropClient - InteropClient.InteropClient + Google.GRPC.Interop.Client v4.5 @@ -43,7 +43,7 @@ - +