diff --git a/examples/csharp/helloworld-from-cli/Greeter.sln b/examples/csharp/helloworld-from-cli/Greeter.sln
new file mode 100644
index 00000000000..ca50470e664
--- /dev/null
+++ b/examples/csharp/helloworld-from-cli/Greeter.sln
@@ -0,0 +1,34 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26228.4
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greeter", "Greeter\Greeter.csproj", "{13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GreeterClient", "GreeterClient\GreeterClient.csproj", "{B754FB02-D501-4308-8B89-33AB7119C80D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GreeterServer", "GreeterServer\GreeterServer.csproj", "{DDBFF994-E076-43AD-B18D-049DFC1B670C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B754FB02-D501-4308-8B89-33AB7119C80D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B754FB02-D501-4308-8B89-33AB7119C80D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B754FB02-D501-4308-8B89-33AB7119C80D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B754FB02-D501-4308-8B89-33AB7119C80D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/csharp/helloworld-from-cli/Greeter/Greeter.csproj b/examples/csharp/helloworld-from-cli/Greeter/Greeter.csproj
new file mode 100644
index 00000000000..6b26be1c9cd
--- /dev/null
+++ b/examples/csharp/helloworld-from-cli/Greeter/Greeter.csproj
@@ -0,0 +1,19 @@
+
+
+
+ Greeter
+ netcoreapp1.0
+ portable
+ Greeter
+ Greeter
+ 1.0.4
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/csharp/helloworld-from-cli/Greeter/Helloworld.cs b/examples/csharp/helloworld-from-cli/Greeter/Helloworld.cs
index 6477b4f35be..ecfc8e131cb 100644
--- a/examples/csharp/helloworld-from-cli/Greeter/Helloworld.cs
+++ b/examples/csharp/helloworld-from-cli/Greeter/Helloworld.cs
@@ -10,7 +10,6 @@ using scg = global::System.Collections.Generic;
namespace Helloworld {
/// Holder for reflection information generated from helloworld.proto
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public static partial class HelloworldReflection {
#region Descriptor
@@ -41,31 +40,36 @@ namespace Helloworld {
}
#region Messages
///
- /// The request message containing the user's name.
+ /// The request message containing the user's name.
///
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public sealed partial class HelloRequest : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new HelloRequest());
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser Parser { get { return _parser; } }
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Helloworld.HelloworldReflection.Descriptor.MessageTypes[0]; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloRequest() {
OnConstruction();
}
partial void OnConstruction();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloRequest(HelloRequest other) : this() {
name_ = other.name_;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloRequest Clone() {
return new HelloRequest(this);
}
@@ -73,6 +77,7 @@ namespace Helloworld {
/// Field number for the "name" field.
public const int NameFieldNumber = 1;
private string name_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Name {
get { return name_; }
set {
@@ -80,10 +85,12 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as HelloRequest);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(HelloRequest other) {
if (ReferenceEquals(other, null)) {
return false;
@@ -95,16 +102,19 @@ namespace Helloworld {
return true;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (Name.Length != 0) hash ^= Name.GetHashCode();
return hash;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (Name.Length != 0) {
output.WriteRawTag(10);
@@ -112,6 +122,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (Name.Length != 0) {
@@ -120,6 +131,7 @@ namespace Helloworld {
return size;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(HelloRequest other) {
if (other == null) {
return;
@@ -129,6 +141,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
@@ -147,31 +160,36 @@ namespace Helloworld {
}
///
- /// The response message containing the greetings
+ /// The response message containing the greetings
///
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public sealed partial class HelloReply : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new HelloReply());
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser Parser { get { return _parser; } }
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Helloworld.HelloworldReflection.Descriptor.MessageTypes[1]; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloReply() {
OnConstruction();
}
partial void OnConstruction();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloReply(HelloReply other) : this() {
message_ = other.message_;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloReply Clone() {
return new HelloReply(this);
}
@@ -179,6 +197,7 @@ namespace Helloworld {
/// Field number for the "message" field.
public const int MessageFieldNumber = 1;
private string message_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Message {
get { return message_; }
set {
@@ -186,10 +205,12 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as HelloReply);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(HelloReply other) {
if (ReferenceEquals(other, null)) {
return false;
@@ -201,16 +222,19 @@ namespace Helloworld {
return true;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (Message.Length != 0) hash ^= Message.GetHashCode();
return hash;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (Message.Length != 0) {
output.WriteRawTag(10);
@@ -218,6 +242,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (Message.Length != 0) {
@@ -226,6 +251,7 @@ namespace Helloworld {
return size;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(HelloReply other) {
if (other == null) {
return;
@@ -235,6 +261,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
diff --git a/examples/csharp/helloworld-from-cli/Greeter/HelloworldGrpc.cs b/examples/csharp/helloworld-from-cli/Greeter/HelloworldGrpc.cs
index 041f5a78d75..b321ea9e682 100644
--- a/examples/csharp/helloworld-from-cli/Greeter/HelloworldGrpc.cs
+++ b/examples/csharp/helloworld-from-cli/Greeter/HelloworldGrpc.cs
@@ -35,21 +35,21 @@
using System;
using System.Threading;
using System.Threading.Tasks;
-using Grpc.Core;
+using grpc = global::Grpc.Core;
namespace Helloworld {
///
- /// The greeting service definition.
+ /// The greeting service definition.
///
- public static class Greeter
+ public static partial class Greeter
{
static readonly string __ServiceName = "helloworld.Greeter";
- static readonly Marshaller __Marshaller_HelloRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloRequest.Parser.ParseFrom);
- static readonly Marshaller __Marshaller_HelloReply = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloReply.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_HelloRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloRequest.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_HelloReply = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloReply.Parser.ParseFrom);
- static readonly Method __Method_SayHello = new Method(
- MethodType.Unary,
+ static readonly grpc::Method __Method_SayHello = new grpc::Method(
+ grpc::MethodType.Unary,
__ServiceName,
"SayHello",
__Marshaller_HelloRequest,
@@ -62,29 +62,32 @@ namespace Helloworld {
}
/// Base class for server-side implementations of Greeter
- public abstract class GreeterBase
+ public abstract partial class GreeterBase
{
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual global::System.Threading.Tasks.Task SayHello(global::Helloworld.HelloRequest request, ServerCallContext context)
+ /// The request received from the client.
+ /// The context of the server-side call handler being invoked.
+ /// The response to send back to the client (wrapped by a task).
+ public virtual global::System.Threading.Tasks.Task SayHello(global::Helloworld.HelloRequest request, grpc::ServerCallContext context)
{
- throw new RpcException(new Status(StatusCode.Unimplemented, ""));
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
}
/// Client for Greeter
- public class GreeterClient : ClientBase
+ public partial class GreeterClient : grpc::ClientBase
{
/// Creates a new client for Greeter
/// The channel to use to make remote calls.
- public GreeterClient(Channel channel) : base(channel)
+ public GreeterClient(grpc::Channel channel) : base(channel)
{
}
/// Creates a new client for Greeter that uses a custom CallInvoker.
/// The callInvoker to use to make remote calls.
- public GreeterClient(CallInvoker callInvoker) : base(callInvoker)
+ public GreeterClient(grpc::CallInvoker callInvoker) : base(callInvoker)
{
}
/// Protected parameterless constructor to allow creation of test doubles.
@@ -98,33 +101,50 @@ namespace Helloworld {
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The response received from the server.
+ public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return SayHello(request, new CallOptions(headers, deadline, cancellationToken));
+ return SayHello(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The response received from the server.
+ public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_SayHello, null, options, request);
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The call object.
+ public virtual grpc::AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return SayHelloAsync(request, new CallOptions(headers, deadline, cancellationToken));
+ return SayHelloAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The call object.
+ public virtual grpc::AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_SayHello, null, options, request);
}
+ /// Creates a new instance of client from given ClientBaseConfiguration.
protected override GreeterClient NewInstance(ClientBaseConfiguration configuration)
{
return new GreeterClient(configuration);
@@ -132,9 +152,10 @@ namespace Helloworld {
}
/// Creates service definition that can be registered with a server
- public static ServerServiceDefinition BindService(GreeterBase serviceImpl)
+ /// An object implementing the server-side handling logic.
+ public static grpc::ServerServiceDefinition BindService(GreeterBase serviceImpl)
{
- return ServerServiceDefinition.CreateBuilder()
+ return grpc::ServerServiceDefinition.CreateBuilder()
.AddMethod(__Method_SayHello, serviceImpl.SayHello).Build();
}
diff --git a/examples/csharp/helloworld-from-cli/Greeter/project.json b/examples/csharp/helloworld-from-cli/Greeter/project.json
deleted file mode 100644
index 72254ce73e9..00000000000
--- a/examples/csharp/helloworld-from-cli/Greeter/project.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "title": "Greeter",
- "version": "1.0.0-*",
- "buildOptions": {
- "debugType": "portable",
- },
- "dependencies": {
- "Google.Protobuf": "3.0.0",
- "Grpc": "1.0.1",
- },
- "frameworks": {
- "net45": {
- "frameworkAssemblies": {
- "System.Runtime": "",
- "System.IO": ""
- },
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1"
- }
- },
- "netcoreapp1.0": {
- "dependencies": {
- "Microsoft.NETCore.App": {
- "type": "platform",
- "version": "1.0.1"
- }
- },
- "imports": "dnxcore50"
- }
- }
-}
diff --git a/examples/csharp/helloworld-from-cli/GreeterClient/GreeterClient.csproj b/examples/csharp/helloworld-from-cli/GreeterClient/GreeterClient.csproj
new file mode 100644
index 00000000000..24cacfc0219
--- /dev/null
+++ b/examples/csharp/helloworld-from-cli/GreeterClient/GreeterClient.csproj
@@ -0,0 +1,17 @@
+
+
+
+ GreeterClient
+ netcoreapp1.0
+ portable
+ GreeterClient
+ Exe
+ GreeterClient
+ 1.0.4
+
+
+
+
+
+
+
diff --git a/examples/csharp/helloworld-from-cli/GreeterClient/project.json b/examples/csharp/helloworld-from-cli/GreeterClient/project.json
deleted file mode 100644
index 09e156f68e8..00000000000
--- a/examples/csharp/helloworld-from-cli/GreeterClient/project.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "title": "GreeterClient",
- "version": "1.0.0-*",
- "buildOptions": {
- "debugType": "portable",
- "emitEntryPoint": "true"
- },
- "dependencies": {
- "Google.Protobuf": "3.0.0",
- "Grpc": "1.0.1",
- "Greeter": {
- "target": "project"
- }
- },
- "frameworks": {
- "net45": {
- "frameworkAssemblies": {
- "System.Runtime": "",
- "System.IO": ""
- },
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1"
- }
- },
- "netcoreapp1.0": {
- "dependencies": {
- "Microsoft.NETCore.App": {
- "type": "platform",
- "version": "1.0.1"
- }
- },
- "imports": "dnxcore50"
- }
- }
-}
diff --git a/examples/csharp/helloworld-from-cli/GreeterServer/GreeterServer.csproj b/examples/csharp/helloworld-from-cli/GreeterServer/GreeterServer.csproj
new file mode 100644
index 00000000000..f7980fa7283
--- /dev/null
+++ b/examples/csharp/helloworld-from-cli/GreeterServer/GreeterServer.csproj
@@ -0,0 +1,17 @@
+
+
+
+ GreeterServer
+ netcoreapp1.0
+ portable
+ GreeterServer
+ Exe
+ GreeterServer
+ 1.0.4
+
+
+
+
+
+
+
diff --git a/examples/csharp/helloworld-from-cli/GreeterServer/project.json b/examples/csharp/helloworld-from-cli/GreeterServer/project.json
deleted file mode 100644
index 8802fe32657..00000000000
--- a/examples/csharp/helloworld-from-cli/GreeterServer/project.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "title": "GreeterServer",
- "version": "1.0.0-*",
- "buildOptions": {
- "debugType": "portable",
- "emitEntryPoint": "true"
- },
- "dependencies": {
- "Google.Protobuf": "3.0.0",
- "Grpc": "1.0.1",
- "Greeter": {
- "target": "project"
- }
- },
- "frameworks": {
- "net45": {
- "frameworkAssemblies": {
- "System.Runtime": "",
- "System.IO": ""
- },
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.0.1"
- }
- },
- "netcoreapp1.0": {
- "dependencies": {
- "Microsoft.NETCore.App": {
- "type": "platform",
- "version": "1.0.1"
- }
- },
- "imports": "dnxcore50"
- }
- }
-}
diff --git a/examples/csharp/helloworld-from-cli/README.md b/examples/csharp/helloworld-from-cli/README.md
index 4db077631d8..c8f8149f73a 100644
--- a/examples/csharp/helloworld-from-cli/README.md
+++ b/examples/csharp/helloworld-from-cli/README.md
@@ -12,26 +12,19 @@ Example projects in this directory depend on the [Grpc](https://www.nuget.org/pa
and [Google.Protobuf](https://www.nuget.org/packages/Google.Protobuf/) NuGet packages
which have been already added to the project for you.
-The examples in this directory target .NET 4.5 framework, as .NET Core support is
-currently experimental.
-
PREREQUISITES
-------------
-- The DotNetCore SDK cli.
-
-- The .NET 4.5 framework.
-
-Both are available to download at https://www.microsoft.com/net/download
+- The [.NET Core SDK](https://www.microsoft.com/net/core).
BUILD
-------
From the `examples/csharp/helloworld-from-cli` directory:
-- `dotnet restore`
+- `dotnet restore Greeter.sln`
-- `dotnet build **/project.json` (this will automatically download NuGet dependencies)
+- `dotnet build Greeter.sln`
Try it!
-------
@@ -40,14 +33,14 @@ Try it!
```
> cd GreeterServer
- > dotnet run
+ > dotnet run -f netcoreapp1.0
```
- Run the client
```
> cd GreeterClient
- > dotnet run
+ > dotnet run -f netcoreapp1.0
```
Tutorial
diff --git a/examples/csharp/helloworld-from-cli/generate_protos.bat b/examples/csharp/helloworld-from-cli/generate_protos.bat
new file mode 100644
index 00000000000..0a35b70e088
--- /dev/null
+++ b/examples/csharp/helloworld-from-cli/generate_protos.bat
@@ -0,0 +1,42 @@
+@rem Copyright 2016, Google Inc.
+@rem All rights reserved.
+@rem
+@rem Redistribution and use in source and binary forms, with or without
+@rem modification, are permitted provided that the following conditions are
+@rem met:
+@rem
+@rem * Redistributions of source code must retain the above copyright
+@rem notice, this list of conditions and the following disclaimer.
+@rem * Redistributions in binary form must reproduce the above
+@rem copyright notice, this list of conditions and the following disclaimer
+@rem in the documentation and/or other materials provided with the
+@rem distribution.
+@rem * Neither the name of Google Inc. nor the names of its
+@rem contributors may be used to endorse or promote products derived from
+@rem this software without specific prior written permission.
+@rem
+@rem THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+@rem "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@rem LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+@rem A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+@rem OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+@rem SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+@rem LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+@rem DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+@rem THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+@rem (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+@rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+@rem Generate the C# code for .proto files
+
+setlocal
+
+@rem enter this directory
+cd /d %~dp0
+
+set PROTOC=%UserProfile%\.nuget\packages\Google.Protobuf.Tools\3.2.0\tools\windows_x64\protoc.exe
+set PLUGIN=%UserProfile%\.nuget\packages\Grpc.Tools\1.2.2\tools\windows_x64\grpc_csharp_plugin.exe
+
+%PROTOC% -I../../protos --csharp_out Greeter ../../protos/helloworld.proto --grpc_out Greeter --plugin=protoc-gen-grpc=%PLUGIN%
+
+endlocal
diff --git a/examples/csharp/helloworld-from-cli/global.json b/examples/csharp/helloworld-from-cli/global.json
deleted file mode 100644
index f3c33cef6a5..00000000000
--- a/examples/csharp/helloworld-from-cli/global.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "sdk": {
- "version": "1.0.0-preview2-003131"
- }
-}
\ No newline at end of file
diff --git a/examples/csharp/helloworld/Greeter/Greeter.csproj b/examples/csharp/helloworld/Greeter/Greeter.csproj
index 036e6b59fbc..8dcd2d90666 100644
--- a/examples/csharp/helloworld/Greeter/Greeter.csproj
+++ b/examples/csharp/helloworld/Greeter/Greeter.csproj
@@ -10,7 +10,8 @@
Greeter
Greeter
v4.5
- 2669b4f2
+
+
true
@@ -31,18 +32,18 @@
false
-
- False
- ..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll
+
+ ..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll
+ True
-
- False
- ..\packages\Grpc.Core.1.0.1\lib\net45\Grpc.Core.dll
+
+ ..\packages\Grpc.Core.1.2.2\lib\net45\Grpc.Core.dll
+ True
-
- False
- ..\packages\System.Interactive.Async.3.0.0\lib\net45\System.Interactive.Async.dll
+
+ ..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll
+ True
@@ -61,11 +62,11 @@
-
+
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
+
-
+
\ No newline at end of file
diff --git a/examples/csharp/helloworld/Greeter/Helloworld.cs b/examples/csharp/helloworld/Greeter/Helloworld.cs
index 6477b4f35be..ecfc8e131cb 100644
--- a/examples/csharp/helloworld/Greeter/Helloworld.cs
+++ b/examples/csharp/helloworld/Greeter/Helloworld.cs
@@ -10,7 +10,6 @@ using scg = global::System.Collections.Generic;
namespace Helloworld {
/// Holder for reflection information generated from helloworld.proto
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public static partial class HelloworldReflection {
#region Descriptor
@@ -41,31 +40,36 @@ namespace Helloworld {
}
#region Messages
///
- /// The request message containing the user's name.
+ /// The request message containing the user's name.
///
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public sealed partial class HelloRequest : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new HelloRequest());
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser Parser { get { return _parser; } }
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Helloworld.HelloworldReflection.Descriptor.MessageTypes[0]; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloRequest() {
OnConstruction();
}
partial void OnConstruction();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloRequest(HelloRequest other) : this() {
name_ = other.name_;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloRequest Clone() {
return new HelloRequest(this);
}
@@ -73,6 +77,7 @@ namespace Helloworld {
/// Field number for the "name" field.
public const int NameFieldNumber = 1;
private string name_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Name {
get { return name_; }
set {
@@ -80,10 +85,12 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as HelloRequest);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(HelloRequest other) {
if (ReferenceEquals(other, null)) {
return false;
@@ -95,16 +102,19 @@ namespace Helloworld {
return true;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (Name.Length != 0) hash ^= Name.GetHashCode();
return hash;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (Name.Length != 0) {
output.WriteRawTag(10);
@@ -112,6 +122,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (Name.Length != 0) {
@@ -120,6 +131,7 @@ namespace Helloworld {
return size;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(HelloRequest other) {
if (other == null) {
return;
@@ -129,6 +141,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
@@ -147,31 +160,36 @@ namespace Helloworld {
}
///
- /// The response message containing the greetings
+ /// The response message containing the greetings
///
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public sealed partial class HelloReply : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new HelloReply());
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser Parser { get { return _parser; } }
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Helloworld.HelloworldReflection.Descriptor.MessageTypes[1]; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloReply() {
OnConstruction();
}
partial void OnConstruction();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloReply(HelloReply other) : this() {
message_ = other.message_;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public HelloReply Clone() {
return new HelloReply(this);
}
@@ -179,6 +197,7 @@ namespace Helloworld {
/// Field number for the "message" field.
public const int MessageFieldNumber = 1;
private string message_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Message {
get { return message_; }
set {
@@ -186,10 +205,12 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as HelloReply);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(HelloReply other) {
if (ReferenceEquals(other, null)) {
return false;
@@ -201,16 +222,19 @@ namespace Helloworld {
return true;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (Message.Length != 0) hash ^= Message.GetHashCode();
return hash;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (Message.Length != 0) {
output.WriteRawTag(10);
@@ -218,6 +242,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (Message.Length != 0) {
@@ -226,6 +251,7 @@ namespace Helloworld {
return size;
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(HelloReply other) {
if (other == null) {
return;
@@ -235,6 +261,7 @@ namespace Helloworld {
}
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
diff --git a/examples/csharp/helloworld/Greeter/HelloworldGrpc.cs b/examples/csharp/helloworld/Greeter/HelloworldGrpc.cs
index 041f5a78d75..b321ea9e682 100644
--- a/examples/csharp/helloworld/Greeter/HelloworldGrpc.cs
+++ b/examples/csharp/helloworld/Greeter/HelloworldGrpc.cs
@@ -35,21 +35,21 @@
using System;
using System.Threading;
using System.Threading.Tasks;
-using Grpc.Core;
+using grpc = global::Grpc.Core;
namespace Helloworld {
///
- /// The greeting service definition.
+ /// The greeting service definition.
///
- public static class Greeter
+ public static partial class Greeter
{
static readonly string __ServiceName = "helloworld.Greeter";
- static readonly Marshaller __Marshaller_HelloRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloRequest.Parser.ParseFrom);
- static readonly Marshaller __Marshaller_HelloReply = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloReply.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_HelloRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloRequest.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_HelloReply = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Helloworld.HelloReply.Parser.ParseFrom);
- static readonly Method __Method_SayHello = new Method(
- MethodType.Unary,
+ static readonly grpc::Method __Method_SayHello = new grpc::Method(
+ grpc::MethodType.Unary,
__ServiceName,
"SayHello",
__Marshaller_HelloRequest,
@@ -62,29 +62,32 @@ namespace Helloworld {
}
/// Base class for server-side implementations of Greeter
- public abstract class GreeterBase
+ public abstract partial class GreeterBase
{
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual global::System.Threading.Tasks.Task SayHello(global::Helloworld.HelloRequest request, ServerCallContext context)
+ /// The request received from the client.
+ /// The context of the server-side call handler being invoked.
+ /// The response to send back to the client (wrapped by a task).
+ public virtual global::System.Threading.Tasks.Task SayHello(global::Helloworld.HelloRequest request, grpc::ServerCallContext context)
{
- throw new RpcException(new Status(StatusCode.Unimplemented, ""));
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
}
/// Client for Greeter
- public class GreeterClient : ClientBase
+ public partial class GreeterClient : grpc::ClientBase
{
/// Creates a new client for Greeter
/// The channel to use to make remote calls.
- public GreeterClient(Channel channel) : base(channel)
+ public GreeterClient(grpc::Channel channel) : base(channel)
{
}
/// Creates a new client for Greeter that uses a custom CallInvoker.
/// The callInvoker to use to make remote calls.
- public GreeterClient(CallInvoker callInvoker) : base(callInvoker)
+ public GreeterClient(grpc::CallInvoker callInvoker) : base(callInvoker)
{
}
/// Protected parameterless constructor to allow creation of test doubles.
@@ -98,33 +101,50 @@ namespace Helloworld {
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The response received from the server.
+ public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return SayHello(request, new CallOptions(headers, deadline, cancellationToken));
+ return SayHello(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The response received from the server.
+ public virtual global::Helloworld.HelloReply SayHello(global::Helloworld.HelloRequest request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_SayHello, null, options, request);
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The call object.
+ public virtual grpc::AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return SayHelloAsync(request, new CallOptions(headers, deadline, cancellationToken));
+ return SayHelloAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// Sends a greeting
+ /// Sends a greeting
///
- public virtual AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The call object.
+ public virtual grpc::AsyncUnaryCall SayHelloAsync(global::Helloworld.HelloRequest request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_SayHello, null, options, request);
}
+ /// Creates a new instance of client from given ClientBaseConfiguration.
protected override GreeterClient NewInstance(ClientBaseConfiguration configuration)
{
return new GreeterClient(configuration);
@@ -132,9 +152,10 @@ namespace Helloworld {
}
/// Creates service definition that can be registered with a server
- public static ServerServiceDefinition BindService(GreeterBase serviceImpl)
+ /// An object implementing the server-side handling logic.
+ public static grpc::ServerServiceDefinition BindService(GreeterBase serviceImpl)
{
- return ServerServiceDefinition.CreateBuilder()
+ return grpc::ServerServiceDefinition.CreateBuilder()
.AddMethod(__Method_SayHello, serviceImpl.SayHello).Build();
}
diff --git a/examples/csharp/helloworld/Greeter/packages.config b/examples/csharp/helloworld/Greeter/packages.config
index 2bb3a182a66..ec83cd83002 100644
--- a/examples/csharp/helloworld/Greeter/packages.config
+++ b/examples/csharp/helloworld/Greeter/packages.config
@@ -1,8 +1,8 @@
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/csharp/helloworld/GreeterClient/GreeterClient.csproj b/examples/csharp/helloworld/GreeterClient/GreeterClient.csproj
index 639ac0e70ca..4b6b1b3e12b 100644
--- a/examples/csharp/helloworld/GreeterClient/GreeterClient.csproj
+++ b/examples/csharp/helloworld/GreeterClient/GreeterClient.csproj
@@ -10,7 +10,8 @@
GreeterClient
GreeterClient
v4.5
- 5e942a7d
+
+
true
@@ -31,18 +32,18 @@
true
-
- False
- ..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll
+
+ ..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll
+ True
-
- False
- ..\packages\Grpc.Core.1.0.1\lib\net45\Grpc.Core.dll
+
+ ..\packages\Grpc.Core.1.2.2\lib\net45\Grpc.Core.dll
+ True
-
- False
- ..\packages\System.Interactive.Async.3.0.0\lib\net45\System.Interactive.Async.dll
+
+ ..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll
+ True
@@ -59,11 +60,11 @@
-
+
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
+
-
+
\ No newline at end of file
diff --git a/examples/csharp/helloworld/GreeterClient/packages.config b/examples/csharp/helloworld/GreeterClient/packages.config
index addcae0f173..b912fd49580 100644
--- a/examples/csharp/helloworld/GreeterClient/packages.config
+++ b/examples/csharp/helloworld/GreeterClient/packages.config
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/csharp/helloworld/GreeterServer/GreeterServer.csproj b/examples/csharp/helloworld/GreeterServer/GreeterServer.csproj
index aa7188839c5..97978fa7ace 100644
--- a/examples/csharp/helloworld/GreeterServer/GreeterServer.csproj
+++ b/examples/csharp/helloworld/GreeterServer/GreeterServer.csproj
@@ -10,7 +10,8 @@
GreeterServer
GreeterServer
v4.5
- 9c7b2963
+
+
true
@@ -31,18 +32,18 @@
true
-
- False
- ..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll
+
+ ..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll
+ True
-
- False
- ..\packages\Grpc.Core.1.0.1\lib\net45\Grpc.Core.dll
+
+ ..\packages\Grpc.Core.1.2.2\lib\net45\Grpc.Core.dll
+ True
-
- False
- ..\packages\System.Interactive.Async.3.0.0\lib\net45\System.Interactive.Async.dll
+
+ ..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll
+ True
@@ -59,11 +60,11 @@
-
+
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
+
-
+
\ No newline at end of file
diff --git a/examples/csharp/helloworld/GreeterServer/packages.config b/examples/csharp/helloworld/GreeterServer/packages.config
index addcae0f173..b912fd49580 100644
--- a/examples/csharp/helloworld/GreeterServer/packages.config
+++ b/examples/csharp/helloworld/GreeterServer/packages.config
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/csharp/helloworld/generate_protos.bat b/examples/csharp/helloworld/generate_protos.bat
index 0afa1297621..0d6e92d50f9 100644
--- a/examples/csharp/helloworld/generate_protos.bat
+++ b/examples/csharp/helloworld/generate_protos.bat
@@ -34,7 +34,7 @@ setlocal
@rem enter this directory
cd /d %~dp0
-set TOOLS_PATH=packages\Grpc.Tools.1.0.1\tools\windows_x86
+set TOOLS_PATH=packages\Grpc.Tools.1.2.2\tools\windows_x86
%TOOLS_PATH%\protoc.exe -I../../protos --csharp_out Greeter ../../protos/helloworld.proto --grpc_out Greeter --plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe
diff --git a/examples/csharp/route_guide/RouteGuide/RouteGuide.cs b/examples/csharp/route_guide/RouteGuide/RouteGuide.cs
index 54cb823983e..603809ee76f 100644
--- a/examples/csharp/route_guide/RouteGuide/RouteGuide.cs
+++ b/examples/csharp/route_guide/RouteGuide/RouteGuide.cs
@@ -53,10 +53,10 @@ namespace Routeguide {
}
#region Messages
///
- /// Points are represented as latitude-longitude pairs in the E7 representation
- /// (degrees multiplied by 10**7 and rounded to the nearest integer).
- /// Latitudes should be in the range +/- 90 degrees and longitude should be in
- /// the range +/- 180 degrees (inclusive).
+ /// Points are represented as latitude-longitude pairs in the E7 representation
+ /// (degrees multiplied by 10**7 and rounded to the nearest integer).
+ /// Latitudes should be in the range +/- 90 degrees and longitude should be in
+ /// the range +/- 180 degrees (inclusive).
///
public sealed partial class Point : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Point());
@@ -204,8 +204,8 @@ namespace Routeguide {
}
///
- /// A latitude-longitude rectangle, represented as two diagonally opposite
- /// points "lo" and "hi".
+ /// A latitude-longitude rectangle, represented as two diagonally opposite
+ /// points "lo" and "hi".
///
public sealed partial class Rectangle : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Rectangle());
@@ -244,7 +244,7 @@ namespace Routeguide {
public const int LoFieldNumber = 1;
private global::Routeguide.Point lo_;
///
- /// One corner of the rectangle.
+ /// One corner of the rectangle.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Routeguide.Point Lo {
@@ -258,7 +258,7 @@ namespace Routeguide {
public const int HiFieldNumber = 2;
private global::Routeguide.Point hi_;
///
- /// The other corner of the rectangle.
+ /// The other corner of the rectangle.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Routeguide.Point Hi {
@@ -371,9 +371,9 @@ namespace Routeguide {
}
///
- /// A feature names something at a given point.
+ /// A feature names something at a given point.
///
- /// If a feature could not be named, the name is empty.
+ /// If a feature could not be named, the name is empty.
///
public sealed partial class Feature : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Feature());
@@ -412,7 +412,7 @@ namespace Routeguide {
public const int NameFieldNumber = 1;
private string name_ = "";
///
- /// The name of the feature.
+ /// The name of the feature.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Name {
@@ -426,7 +426,7 @@ namespace Routeguide {
public const int LocationFieldNumber = 2;
private global::Routeguide.Point location_;
///
- /// The point where the feature is detected.
+ /// The point where the feature is detected.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Routeguide.Point Location {
@@ -533,7 +533,7 @@ namespace Routeguide {
}
///
- /// A RouteNote is a message sent while at a given point.
+ /// A RouteNote is a message sent while at a given point.
///
public sealed partial class RouteNote : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new RouteNote());
@@ -572,7 +572,7 @@ namespace Routeguide {
public const int LocationFieldNumber = 1;
private global::Routeguide.Point location_;
///
- /// The location from which the message is sent.
+ /// The location from which the message is sent.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Routeguide.Point Location {
@@ -586,7 +586,7 @@ namespace Routeguide {
public const int MessageFieldNumber = 2;
private string message_ = "";
///
- /// The message to be sent.
+ /// The message to be sent.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Message {
@@ -693,11 +693,11 @@ namespace Routeguide {
}
///
- /// A RouteSummary is received in response to a RecordRoute rpc.
+ /// A RouteSummary is received in response to a RecordRoute rpc.
///
- /// It contains the number of individual points received, the number of
- /// detected features, and the total distance covered as the cumulative sum of
- /// the distance between each point.
+ /// It contains the number of individual points received, the number of
+ /// detected features, and the total distance covered as the cumulative sum of
+ /// the distance between each point.
///
public sealed partial class RouteSummary : pb::IMessage {
private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new RouteSummary());
@@ -738,7 +738,7 @@ namespace Routeguide {
public const int PointCountFieldNumber = 1;
private int pointCount_;
///
- /// The number of points received.
+ /// The number of points received.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int PointCount {
@@ -752,7 +752,7 @@ namespace Routeguide {
public const int FeatureCountFieldNumber = 2;
private int featureCount_;
///
- /// The number of known features passed while traversing the route.
+ /// The number of known features passed while traversing the route.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int FeatureCount {
@@ -766,7 +766,7 @@ namespace Routeguide {
public const int DistanceFieldNumber = 3;
private int distance_;
///
- /// The distance covered in metres.
+ /// The distance covered in metres.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int Distance {
@@ -780,7 +780,7 @@ namespace Routeguide {
public const int ElapsedTimeFieldNumber = 4;
private int elapsedTime_;
///
- /// The duration of the traversal in seconds.
+ /// The duration of the traversal in seconds.
///
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int ElapsedTime {
diff --git a/examples/csharp/route_guide/RouteGuide/RouteGuide.csproj b/examples/csharp/route_guide/RouteGuide/RouteGuide.csproj
index eee8f0a1bce..360444e4918 100644
--- a/examples/csharp/route_guide/RouteGuide/RouteGuide.csproj
+++ b/examples/csharp/route_guide/RouteGuide/RouteGuide.csproj
@@ -11,7 +11,8 @@
RouteGuide
v4.5
512
- de2137f9
+
+
true
@@ -31,13 +32,13 @@
4
-
- False
- ..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll
+
+ ..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll
+ True
-
- False
- ..\packages\Grpc.Core.1.0.1\lib\net45\Grpc.Core.dll
+
+ ..\packages\Grpc.Core.1.2.2\lib\net45\Grpc.Core.dll
+ True
False
@@ -45,15 +46,15 @@
+
+ ..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll
+ True
+
-
- False
- ..\packages\System.Interactive.Async.3.0.0\lib\net45\System.Interactive.Async.dll
-
@@ -74,12 +75,12 @@
-
+
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
+
-
+
\ No newline at end of file
diff --git a/examples/csharp/route_guide/RouteGuide/RouteGuideGrpc.cs b/examples/csharp/route_guide/RouteGuide/RouteGuideGrpc.cs
index eb70c8e2db5..6f2d6bde620 100644
--- a/examples/csharp/route_guide/RouteGuide/RouteGuideGrpc.cs
+++ b/examples/csharp/route_guide/RouteGuide/RouteGuideGrpc.cs
@@ -35,45 +35,45 @@
using System;
using System.Threading;
using System.Threading.Tasks;
-using Grpc.Core;
+using grpc = global::Grpc.Core;
namespace Routeguide {
///
- /// Interface exported by the server.
+ /// Interface exported by the server.
///
- public static class RouteGuide
+ public static partial class RouteGuide
{
static readonly string __ServiceName = "routeguide.RouteGuide";
- static readonly Marshaller __Marshaller_Point = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Point.Parser.ParseFrom);
- static readonly Marshaller __Marshaller_Feature = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Feature.Parser.ParseFrom);
- static readonly Marshaller __Marshaller_Rectangle = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Rectangle.Parser.ParseFrom);
- static readonly Marshaller __Marshaller_RouteSummary = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.RouteSummary.Parser.ParseFrom);
- static readonly Marshaller __Marshaller_RouteNote = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.RouteNote.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_Point = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Point.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_Feature = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Feature.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_Rectangle = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Rectangle.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_RouteSummary = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.RouteSummary.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_RouteNote = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.RouteNote.Parser.ParseFrom);
- static readonly Method __Method_GetFeature = new Method(
- MethodType.Unary,
+ static readonly grpc::Method __Method_GetFeature = new grpc::Method(
+ grpc::MethodType.Unary,
__ServiceName,
"GetFeature",
__Marshaller_Point,
__Marshaller_Feature);
- static readonly Method __Method_ListFeatures = new Method(
- MethodType.ServerStreaming,
+ static readonly grpc::Method __Method_ListFeatures = new grpc::Method(
+ grpc::MethodType.ServerStreaming,
__ServiceName,
"ListFeatures",
__Marshaller_Rectangle,
__Marshaller_Feature);
- static readonly Method __Method_RecordRoute = new Method(
- MethodType.ClientStreaming,
+ static readonly grpc::Method __Method_RecordRoute = new grpc::Method(
+ grpc::MethodType.ClientStreaming,
__ServiceName,
"RecordRoute",
__Marshaller_Point,
__Marshaller_RouteSummary);
- static readonly Method __Method_RouteChat = new Method(
- MethodType.DuplexStreaming,
+ static readonly grpc::Method __Method_RouteChat = new grpc::Method(
+ grpc::MethodType.DuplexStreaming,
__ServiceName,
"RouteChat",
__Marshaller_RouteNote,
@@ -86,69 +86,83 @@ namespace Routeguide {
}
/// Base class for server-side implementations of RouteGuide
- public abstract class RouteGuideBase
+ public abstract partial class RouteGuideBase
{
///
- /// A simple RPC.
+ /// A simple RPC.
///
- /// Obtains the feature at a given position.
+ /// Obtains the feature at a given position.
///
- /// A feature with an empty name is returned if there's no feature at the given
- /// position.
+ /// A feature with an empty name is returned if there's no feature at the given
+ /// position.
///
- public virtual global::System.Threading.Tasks.Task GetFeature(global::Routeguide.Point request, ServerCallContext context)
+ /// The request received from the client.
+ /// The context of the server-side call handler being invoked.
+ /// The response to send back to the client (wrapped by a task).
+ public virtual global::System.Threading.Tasks.Task GetFeature(global::Routeguide.Point request, grpc::ServerCallContext context)
{
- throw new RpcException(new Status(StatusCode.Unimplemented, ""));
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
///
- /// A server-to-client streaming RPC.
+ /// A server-to-client streaming RPC.
///
- /// Obtains the Features available within the given Rectangle. Results are
- /// streamed rather than returned at once (e.g. in a response message with a
- /// repeated field), as the rectangle may cover a large area and contain a
- /// huge number of features.
+ /// Obtains the Features available within the given Rectangle. Results are
+ /// streamed rather than returned at once (e.g. in a response message with a
+ /// repeated field), as the rectangle may cover a large area and contain a
+ /// huge number of features.
///
- public virtual global::System.Threading.Tasks.Task ListFeatures(global::Routeguide.Rectangle request, IServerStreamWriter responseStream, ServerCallContext context)
+ /// The request received from the client.
+ /// Used for sending responses back to the client.
+ /// The context of the server-side call handler being invoked.
+ /// A task indicating completion of the handler.
+ public virtual global::System.Threading.Tasks.Task ListFeatures(global::Routeguide.Rectangle request, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context)
{
- throw new RpcException(new Status(StatusCode.Unimplemented, ""));
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
///
- /// A client-to-server streaming RPC.
+ /// A client-to-server streaming RPC.
///
- /// Accepts a stream of Points on a route being traversed, returning a
- /// RouteSummary when traversal is completed.
+ /// Accepts a stream of Points on a route being traversed, returning a
+ /// RouteSummary when traversal is completed.
///
- public virtual global::System.Threading.Tasks.Task RecordRoute(IAsyncStreamReader requestStream, ServerCallContext context)
+ /// Used for reading requests from the client.
+ /// The context of the server-side call handler being invoked.
+ /// The response to send back to the client (wrapped by a task).
+ public virtual global::System.Threading.Tasks.Task RecordRoute(grpc::IAsyncStreamReader requestStream, grpc::ServerCallContext context)
{
- throw new RpcException(new Status(StatusCode.Unimplemented, ""));
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
///
- /// A Bidirectional streaming RPC.
+ /// A Bidirectional streaming RPC.
///
- /// Accepts a stream of RouteNotes sent while a route is being traversed,
- /// while receiving other RouteNotes (e.g. from other users).
+ /// Accepts a stream of RouteNotes sent while a route is being traversed,
+ /// while receiving other RouteNotes (e.g. from other users).
///
- public virtual global::System.Threading.Tasks.Task RouteChat(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context)
+ /// Used for reading requests from the client.
+ /// Used for sending responses back to the client.
+ /// The context of the server-side call handler being invoked.
+ /// A task indicating completion of the handler.
+ public virtual global::System.Threading.Tasks.Task RouteChat(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context)
{
- throw new RpcException(new Status(StatusCode.Unimplemented, ""));
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
}
/// Client for RouteGuide
- public class RouteGuideClient : ClientBase
+ public partial class RouteGuideClient : grpc::ClientBase
{
/// Creates a new client for RouteGuide
/// The channel to use to make remote calls.
- public RouteGuideClient(Channel channel) : base(channel)
+ public RouteGuideClient(grpc::Channel channel) : base(channel)
{
}
/// Creates a new client for RouteGuide that uses a custom CallInvoker.
/// The callInvoker to use to make remote calls.
- public RouteGuideClient(CallInvoker callInvoker) : base(callInvoker)
+ public RouteGuideClient(grpc::CallInvoker callInvoker) : base(callInvoker)
{
}
/// Protected parameterless constructor to allow creation of test doubles.
@@ -162,117 +176,154 @@ namespace Routeguide {
}
///
- /// A simple RPC.
+ /// A simple RPC.
///
- /// Obtains the feature at a given position.
+ /// Obtains the feature at a given position.
///
- /// A feature with an empty name is returned if there's no feature at the given
- /// position.
+ /// A feature with an empty name is returned if there's no feature at the given
+ /// position.
///
- public virtual global::Routeguide.Feature GetFeature(global::Routeguide.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The response received from the server.
+ public virtual global::Routeguide.Feature GetFeature(global::Routeguide.Point request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return GetFeature(request, new CallOptions(headers, deadline, cancellationToken));
+ return GetFeature(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// A simple RPC.
+ /// A simple RPC.
///
- /// Obtains the feature at a given position.
+ /// Obtains the feature at a given position.
///
- /// A feature with an empty name is returned if there's no feature at the given
- /// position.
+ /// A feature with an empty name is returned if there's no feature at the given
+ /// position.
///
- public virtual global::Routeguide.Feature GetFeature(global::Routeguide.Point request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The response received from the server.
+ public virtual global::Routeguide.Feature GetFeature(global::Routeguide.Point request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_GetFeature, null, options, request);
}
///
- /// A simple RPC.
+ /// A simple RPC.
///
- /// Obtains the feature at a given position.
+ /// Obtains the feature at a given position.
///
- /// A feature with an empty name is returned if there's no feature at the given
- /// position.
+ /// A feature with an empty name is returned if there's no feature at the given
+ /// position.
///
- public virtual AsyncUnaryCall GetFeatureAsync(global::Routeguide.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The call object.
+ public virtual grpc::AsyncUnaryCall GetFeatureAsync(global::Routeguide.Point request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return GetFeatureAsync(request, new CallOptions(headers, deadline, cancellationToken));
+ return GetFeatureAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// A simple RPC.
+ /// A simple RPC.
///
- /// Obtains the feature at a given position.
+ /// Obtains the feature at a given position.
///
- /// A feature with an empty name is returned if there's no feature at the given
- /// position.
+ /// A feature with an empty name is returned if there's no feature at the given
+ /// position.
///
- public virtual AsyncUnaryCall GetFeatureAsync(global::Routeguide.Point request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The call object.
+ public virtual grpc::AsyncUnaryCall GetFeatureAsync(global::Routeguide.Point request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_GetFeature, null, options, request);
}
///
- /// A server-to-client streaming RPC.
+ /// A server-to-client streaming RPC.
///
- /// Obtains the Features available within the given Rectangle. Results are
- /// streamed rather than returned at once (e.g. in a response message with a
- /// repeated field), as the rectangle may cover a large area and contain a
- /// huge number of features.
+ /// Obtains the Features available within the given Rectangle. Results are
+ /// streamed rather than returned at once (e.g. in a response message with a
+ /// repeated field), as the rectangle may cover a large area and contain a
+ /// huge number of features.
///
- public virtual AsyncServerStreamingCall ListFeatures(global::Routeguide.Rectangle request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The request to send to the server.
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The call object.
+ public virtual grpc::AsyncServerStreamingCall ListFeatures(global::Routeguide.Rectangle request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return ListFeatures(request, new CallOptions(headers, deadline, cancellationToken));
+ return ListFeatures(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// A server-to-client streaming RPC.
+ /// A server-to-client streaming RPC.
///
- /// Obtains the Features available within the given Rectangle. Results are
- /// streamed rather than returned at once (e.g. in a response message with a
- /// repeated field), as the rectangle may cover a large area and contain a
- /// huge number of features.
+ /// Obtains the Features available within the given Rectangle. Results are
+ /// streamed rather than returned at once (e.g. in a response message with a
+ /// repeated field), as the rectangle may cover a large area and contain a
+ /// huge number of features.
///
- public virtual AsyncServerStreamingCall ListFeatures(global::Routeguide.Rectangle request, CallOptions options)
+ /// The request to send to the server.
+ /// The options for the call.
+ /// The call object.
+ public virtual grpc::AsyncServerStreamingCall ListFeatures(global::Routeguide.Rectangle request, grpc::CallOptions options)
{
return CallInvoker.AsyncServerStreamingCall(__Method_ListFeatures, null, options, request);
}
///
- /// A client-to-server streaming RPC.
+ /// A client-to-server streaming RPC.
///
- /// Accepts a stream of Points on a route being traversed, returning a
- /// RouteSummary when traversal is completed.
+ /// Accepts a stream of Points on a route being traversed, returning a
+ /// RouteSummary when traversal is completed.
///
- public virtual AsyncClientStreamingCall RecordRoute(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The call object.
+ public virtual grpc::AsyncClientStreamingCall RecordRoute(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return RecordRoute(new CallOptions(headers, deadline, cancellationToken));
+ return RecordRoute(new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// A client-to-server streaming RPC.
+ /// A client-to-server streaming RPC.
///
- /// Accepts a stream of Points on a route being traversed, returning a
- /// RouteSummary when traversal is completed.
+ /// Accepts a stream of Points on a route being traversed, returning a
+ /// RouteSummary when traversal is completed.
///
- public virtual AsyncClientStreamingCall RecordRoute(CallOptions options)
+ /// The options for the call.
+ /// The call object.
+ public virtual grpc::AsyncClientStreamingCall RecordRoute(grpc::CallOptions options)
{
return CallInvoker.AsyncClientStreamingCall(__Method_RecordRoute, null, options);
}
///
- /// A Bidirectional streaming RPC.
+ /// A Bidirectional streaming RPC.
///
- /// Accepts a stream of RouteNotes sent while a route is being traversed,
- /// while receiving other RouteNotes (e.g. from other users).
+ /// Accepts a stream of RouteNotes sent while a route is being traversed,
+ /// while receiving other RouteNotes (e.g. from other users).
///
- public virtual AsyncDuplexStreamingCall RouteChat(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ /// The initial metadata to send with the call. This parameter is optional.
+ /// An optional deadline for the call. The call will be cancelled if deadline is hit.
+ /// An optional token for canceling the call.
+ /// The call object.
+ public virtual grpc::AsyncDuplexStreamingCall RouteChat(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
{
- return RouteChat(new CallOptions(headers, deadline, cancellationToken));
+ return RouteChat(new grpc::CallOptions(headers, deadline, cancellationToken));
}
///
- /// A Bidirectional streaming RPC.
+ /// A Bidirectional streaming RPC.
///
- /// Accepts a stream of RouteNotes sent while a route is being traversed,
- /// while receiving other RouteNotes (e.g. from other users).
+ /// Accepts a stream of RouteNotes sent while a route is being traversed,
+ /// while receiving other RouteNotes (e.g. from other users).
///
- public virtual AsyncDuplexStreamingCall RouteChat(CallOptions options)
+ /// The options for the call.
+ /// The call object.
+ public virtual grpc::AsyncDuplexStreamingCall RouteChat(grpc::CallOptions options)
{
return CallInvoker.AsyncDuplexStreamingCall(__Method_RouteChat, null, options);
}
+ /// Creates a new instance of client from given ClientBaseConfiguration.
protected override RouteGuideClient NewInstance(ClientBaseConfiguration configuration)
{
return new RouteGuideClient(configuration);
@@ -280,9 +331,10 @@ namespace Routeguide {
}
/// Creates service definition that can be registered with a server
- public static ServerServiceDefinition BindService(RouteGuideBase serviceImpl)
+ /// An object implementing the server-side handling logic.
+ public static grpc::ServerServiceDefinition BindService(RouteGuideBase serviceImpl)
{
- return ServerServiceDefinition.CreateBuilder()
+ return grpc::ServerServiceDefinition.CreateBuilder()
.AddMethod(__Method_GetFeature, serviceImpl.GetFeature)
.AddMethod(__Method_ListFeatures, serviceImpl.ListFeatures)
.AddMethod(__Method_RecordRoute, serviceImpl.RecordRoute)
diff --git a/examples/csharp/route_guide/RouteGuide/packages.config b/examples/csharp/route_guide/RouteGuide/packages.config
index b7c401b3c85..2dde11f1dd3 100644
--- a/examples/csharp/route_guide/RouteGuide/packages.config
+++ b/examples/csharp/route_guide/RouteGuide/packages.config
@@ -1,8 +1,8 @@
-
-
-
-
+
+
+
-
+
+
\ No newline at end of file
diff --git a/examples/csharp/route_guide/RouteGuideClient/RouteGuideClient.csproj b/examples/csharp/route_guide/RouteGuideClient/RouteGuideClient.csproj
index a513f6af877..162eaeddc13 100644
--- a/examples/csharp/route_guide/RouteGuideClient/RouteGuideClient.csproj
+++ b/examples/csharp/route_guide/RouteGuideClient/RouteGuideClient.csproj
@@ -11,7 +11,8 @@
RouteGuideClient
v4.5
512
- b880049a
+
+
AnyCPU
@@ -33,13 +34,13 @@
4
-
- False
- ..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll
+
+ ..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll
+ True
-
- False
- ..\packages\Grpc.Core.1.0.1\lib\net45\Grpc.Core.dll
+
+ ..\packages\Grpc.Core.1.2.2\lib\net45\Grpc.Core.dll
+ True
False
@@ -47,9 +48,9 @@
-
- False
- ..\packages\System.Interactive.Async.3.0.0\lib\net45\System.Interactive.Async.dll
+
+ ..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll
+ True
@@ -71,12 +72,12 @@
-
+
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
+
-
+
\ No newline at end of file
diff --git a/examples/csharp/route_guide/RouteGuideClient/packages.config b/examples/csharp/route_guide/RouteGuideClient/packages.config
index b7c401b3c85..2dde11f1dd3 100644
--- a/examples/csharp/route_guide/RouteGuideClient/packages.config
+++ b/examples/csharp/route_guide/RouteGuideClient/packages.config
@@ -1,8 +1,8 @@
-
-
-
-
+
+
+
-
+
+
\ No newline at end of file
diff --git a/examples/csharp/route_guide/RouteGuideServer/RouteGuideServer.csproj b/examples/csharp/route_guide/RouteGuideServer/RouteGuideServer.csproj
index 8892554b7ed..b6f2f351aaa 100644
--- a/examples/csharp/route_guide/RouteGuideServer/RouteGuideServer.csproj
+++ b/examples/csharp/route_guide/RouteGuideServer/RouteGuideServer.csproj
@@ -11,7 +11,8 @@
RouteGuideServer
v4.5
512
- 946ecc79
+
+
AnyCPU
@@ -33,13 +34,13 @@
4
-
- False
- ..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll
+
+ ..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll
+ True
-
- False
- ..\packages\Grpc.Core.1.0.1\lib\net45\Grpc.Core.dll
+
+ ..\packages\Grpc.Core.1.2.2\lib\net45\Grpc.Core.dll
+ True
False
@@ -47,15 +48,15 @@
+
+ ..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll
+ True
+
-
- False
- ..\packages\System.Interactive.Async.3.0.0\lib\net45\System.Interactive.Async.dll
-
@@ -72,12 +73,12 @@
-
+
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
+
-
+
\ No newline at end of file
diff --git a/examples/csharp/route_guide/RouteGuideServer/packages.config b/examples/csharp/route_guide/RouteGuideServer/packages.config
index dd498f48ea3..46df6453da6 100644
--- a/examples/csharp/route_guide/RouteGuideServer/packages.config
+++ b/examples/csharp/route_guide/RouteGuideServer/packages.config
@@ -1,9 +1,9 @@
-
-
-
-
+
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/examples/csharp/route_guide/generate_protos.bat b/examples/csharp/route_guide/generate_protos.bat
index 69f5e0f4a39..fbd951aeb27 100644
--- a/examples/csharp/route_guide/generate_protos.bat
+++ b/examples/csharp/route_guide/generate_protos.bat
@@ -34,7 +34,7 @@ setlocal
@rem enter this directory
cd /d %~dp0
-set TOOLS_PATH=packages\Grpc.Tools.1.0.0\tools\windows_x86
+set TOOLS_PATH=packages\Grpc.Tools.1.2.2\tools\windows_x86
%TOOLS_PATH%\protoc.exe -I../../protos --csharp_out RouteGuide ../../protos/route_guide.proto --grpc_out RouteGuide --plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe
diff --git a/src/core/ext/filters/message_size/message_size_filter.c b/src/core/ext/filters/message_size/message_size_filter.c
index db0f0119053..e3ffc41f905 100644
--- a/src/core/ext/filters/message_size/message_size_filter.c
+++ b/src/core/ext/filters/message_size/message_size_filter.c
@@ -130,6 +130,8 @@ static void recv_message_ready(grpc_exec_ctx* exec_ctx, void* user_data,
GRPC_ERROR_UNREF(new_error);
}
gpr_free(message_string);
+ } else {
+ GRPC_ERROR_REF(error);
}
// Invoke the next callback.
grpc_closure_run(exec_ctx, calld->next_recv_message_ready, error);
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
index a4cee391047..5d74532edeb 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
@@ -2603,6 +2603,7 @@ static bool incoming_byte_stream_next(grpc_exec_ctx *exec_ctx,
(grpc_chttp2_incoming_byte_stream *)byte_stream;
grpc_chttp2_stream *s = bs->stream;
if (s->unprocessed_incoming_frames_buffer.length > 0) {
+ GPR_TIMER_END("incoming_byte_stream_next", 0);
return true;
} else {
gpr_ref(&bs->refs);
diff --git a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
index 4d904700569..c57c260c960 100644
--- a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
+++ b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
@@ -141,7 +141,8 @@ namespace Grpc.Core.Tests
{
if (server == null)
{
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { serviceDefinition },
Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } }
diff --git a/src/csharp/Grpc.Core/ChannelOptions.cs b/src/csharp/Grpc.Core/ChannelOptions.cs
index 46a2c6695f6..5de9b1ee3c4 100644
--- a/src/csharp/Grpc.Core/ChannelOptions.cs
+++ b/src/csharp/Grpc.Core/ChannelOptions.cs
@@ -172,6 +172,9 @@ namespace Grpc.Core
/// Secondary user agent: goes at the end of the user-agent metadata
public const string SecondaryUserAgentString = "grpc.secondary_user_agent";
+ /// If non-zero, allow the use of SO_REUSEPORT for server if it's available (default 1)
+ public const string SoReuseport = "grpc.so_reuseport";
+
///
/// Creates native object for a collection of channel options.
///
diff --git a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
index 50dacc2eaaf..02bcd18cb55 100644
--- a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
+++ b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
@@ -55,7 +55,8 @@ namespace Math.Tests
[TestFixtureSetUp]
public void Init()
{
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { Math.BindService(new MathServiceImpl()) },
Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } }
diff --git a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
index 25a58fb3864..0ebc3c33700 100644
--- a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
+++ b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
@@ -57,7 +57,8 @@ namespace Grpc.HealthCheck.Tests
{
serviceImpl = new HealthServiceImpl();
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { Grpc.Health.V1.Health.BindService(serviceImpl) },
Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } }
diff --git a/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs b/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs
index 4216dc1d6be..780a9b73047 100644
--- a/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs
@@ -54,7 +54,8 @@ namespace Grpc.IntegrationTesting
[SetUp]
public void Init()
{
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { TestService.BindService(new UnimplementedTestServiceImpl()) },
Ports = { { Host, ServerPort.PickUnused, SslServerCredentials.Insecure } }
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
index 4960a53f92d..04f833fcf5e 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
@@ -56,7 +56,8 @@ namespace Grpc.IntegrationTesting
[TestFixtureSetUp]
public void Init()
{
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { TestService.BindService(new TestServiceImpl()) },
Ports = { { Host, ServerPort.PickUnused, TestCredentials.CreateSslServerCredentials() } }
diff --git a/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs b/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs
index d55e658d949..ef63f530f68 100644
--- a/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs
@@ -56,7 +56,8 @@ namespace Grpc.IntegrationTesting
[SetUp]
public void Init()
{
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { TestService.BindService(new FakeTestService()) },
Ports = { { Host, ServerPort.PickUnused, TestCredentials.CreateSslServerCredentials() } }
diff --git a/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs b/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
index 377dad63f40..48ecc2344fc 100644
--- a/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
@@ -67,7 +67,8 @@ namespace Grpc.IntegrationTesting
var serverCredentials = new SslServerCredentials(new[] { keyCertPair }, rootCert, true);
var clientCredentials = new SslCredentials(rootCert, keyCertPair);
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { TestService.BindService(new SslCredentialsTestServiceImpl()) },
Ports = { { Host, ServerPort.PickUnused, serverCredentials } }
diff --git a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
index 1d0845e276c..22edbed0402 100644
--- a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
+++ b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
@@ -58,7 +58,8 @@ namespace Grpc.Reflection.Tests
{
serviceImpl = new ReflectionServiceImpl(ServerReflection.Descriptor);
- server = new Server
+ // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
+ server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) })
{
Services = { ServerReflection.BindService(serviceImpl) },
Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } }
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896
new file mode 100644
index 00000000000..c1212832425
Binary files /dev/null and b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896 differ
diff --git a/test/core/security/BUILD b/test/core/security/BUILD
index 8c63f9143d1..a81e1d366b0 100644
--- a/test/core/security/BUILD
+++ b/test/core/security/BUILD
@@ -44,7 +44,8 @@ cc_library(
srcs = ["oauth2_utils.c"],
hdrs = ["oauth2_utils.h"],
deps = ["//:grpc"],
- copts = ['-std=c99']
+ copts = ['-std=c99'],
+ visibility = ["//test/cpp:__subpackages__"],
)
cc_test(
diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD
new file mode 100644
index 00000000000..1a3e8d916fa
--- /dev/null
+++ b/test/cpp/interop/BUILD
@@ -0,0 +1,90 @@
+# Copyright 2017, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+licenses(["notice"]) # 3-clause BSD
+
+cc_library(
+ name = "server_helper_lib",
+ srcs = [
+ "server_helper.cc",
+ ],
+ hdrs = [
+ "server_helper.h",
+ ],
+ deps = [
+ "//test/cpp/util:test_util",
+ "//external:gflags",
+ ],
+)
+
+cc_binary(
+ name = "interop_server",
+ srcs = [
+ "interop_server.cc",
+ "interop_server_bootstrap.cc",
+ ],
+ deps = [
+ ":server_helper_lib",
+ "//:grpc++",
+ "//src/proto/grpc/testing:empty_proto",
+ "//src/proto/grpc/testing:messages_proto",
+ "//src/proto/grpc/testing:test_proto",
+ "//test/cpp/util:test_config",
+ ],
+)
+
+cc_library(
+ name = "client_helper_lib",
+ srcs = [
+ "client_helper.cc",
+ "interop_client.cc",
+ ],
+ hdrs = [
+ "client_helper.h",
+ "interop_client.h",
+ ],
+ deps = [
+ "//test/cpp/util:test_util",
+ "//src/proto/grpc/testing:empty_proto",
+ "//src/proto/grpc/testing:messages_proto",
+ "//src/proto/grpc/testing:test_proto",
+ "//test/core/security:oauth2_utils",
+ "//test/cpp/util:test_config",
+ ],
+)
+
+cc_binary(
+ name = "interop_client",
+ srcs = [
+ "client.cc",
+ ],
+ deps = [
+ ":client_helper_lib",
+ ],
+)
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index 0cc270f52cb..8b7bc1f14dd 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -85165,6 +85165,29 @@
],
"uses_polling": false
},
+ {
+ "args": [
+ "test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896"
+ ],
+ "ci_platforms": [
+ "linux"
+ ],
+ "cpu_cost": 0.1,
+ "exclude_configs": [
+ "tsan"
+ ],
+ "exclude_iomgrs": [
+ "uv"
+ ],
+ "flaky": false,
+ "language": "c",
+ "name": "api_fuzzer_one_entry",
+ "platforms": [
+ "mac",
+ "linux"
+ ],
+ "uses_polling": false
+ },
{
"args": [
"test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6499902139924480"
diff --git a/tools/run_tests/python_utils/jobset.py b/tools/run_tests/python_utils/jobset.py
index 5d812f28ee9..460f359cf35 100755
--- a/tools/run_tests/python_utils/jobset.py
+++ b/tools/run_tests/python_utils/jobset.py
@@ -348,7 +348,7 @@ class Jobset(object):
"""Manages one run of jobs."""
def __init__(self, check_cancelled, maxjobs, newline_on_success, travis,
- stop_on_failure, add_env, quiet_success):
+ stop_on_failure, add_env, quiet_success, max_time):
self._running = set()
self._check_cancelled = check_cancelled
self._cancelled = False
@@ -360,6 +360,7 @@ class Jobset(object):
self._stop_on_failure = stop_on_failure
self._add_env = add_env
self._quiet_success = quiet_success
+ self._max_time = max_time
self.resultset = {}
self._remaining = None
self._start_time = time.time()
@@ -379,6 +380,12 @@ class Jobset(object):
def start(self, spec):
"""Start a job. Return True on success, False on failure."""
while True:
+ if self._max_time > 0 and time.time() - self._start_time > self._max_time:
+ skipped_job_result = JobResult()
+ skipped_job_result.state = 'SKIPPED'
+ message('SKIPPED', spec.shortname, do_newline=True)
+ self.resultset[spec.shortname] = [skipped_job_result]
+ return True
if self.cancelled(): return False
current_cpu_cost = self.cpu_cost()
if current_cpu_cost == 0: break
@@ -474,7 +481,8 @@ def run(cmdlines,
stop_on_failure=False,
add_env={},
skip_jobs=False,
- quiet_success=False):
+ quiet_success=False,
+ max_time=-1):
if skip_jobs:
resultset = {}
skipped_job_result = JobResult()
@@ -486,7 +494,7 @@ def run(cmdlines,
js = Jobset(check_cancelled,
maxjobs if maxjobs is not None else _DEFAULT_MAX_JOBS,
newline_on_success, travis, stop_on_failure, add_env,
- quiet_success)
+ quiet_success, max_time)
for cmdline, remaining in tag_remaining(cmdlines):
if not js.start(cmdline):
break
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 9130bc960a8..a1ec1b2f457 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -1210,6 +1210,7 @@ argp.add_argument('--quiet_success',
'Useful when running many iterations of each test (argument -n).')
argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
help='Dont try to iterate over many polling strategies when they exist')
+argp.add_argument('--max_time', default=-1, type=int, help='Maximum test runtime in seconds')
args = argp.parse_args()
if args.force_default_poller:
@@ -1465,7 +1466,7 @@ def _build_and_run(
not re.search(args.regex_exclude, spec.shortname))))
# When running on travis, we want out test runs to be as similar as possible
# for reproducibility purposes.
- if args.travis:
+ if args.travis and args.max_time <= 0:
massaged_one_run = sorted(one_run, key=lambda x: x.shortname)
else:
# whereas otherwise, we want to shuffle things up to give all tests a
@@ -1493,7 +1494,7 @@ def _build_and_run(
all_runs, check_cancelled, newline_on_success=newline_on_success,
travis=args.travis, maxjobs=args.jobs,
stop_on_failure=args.stop_on_failure,
- quiet_success=args.quiet_success)
+ quiet_success=args.quiet_success, max_time=args.max_time)
if resultset:
for k, v in sorted(resultset.items()):
num_runs, num_failures = _calculate_num_runs_failures(v)
diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py
index 1da754d9f8c..02f0ec5eff1 100755
--- a/tools/run_tests/run_tests_matrix.py
+++ b/tools/run_tests/run_tests_matrix.py
@@ -377,6 +377,9 @@ if __name__ == "__main__":
argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
help='How many times to run each tests. >1 runs implies ' +
'omitting passing test from the output & reports.')
+ argp.add_argument('--max_time', default=-1, type=int,
+ help='Maximum amount of time to run tests for' +
+ '(other tests will be skipped)')
args = argp.parse_args()
extra_args = []
@@ -388,6 +391,8 @@ if __name__ == "__main__":
extra_args.append('-n')
extra_args.append('%s' % args.runs_per_test)
extra_args.append('--quiet_success')
+ if args.max_time > 0:
+ extra_args.extend(('--max_time', '%d' % args.max_time))
all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
_create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)