diff --git a/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs b/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs index a3a613be746..99a2d47e6e9 100644 --- a/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs +++ b/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs @@ -54,10 +54,20 @@ namespace Grpc.Core.Tests var deadline = DateTime.UtcNow; Assert.AreEqual(deadline, options.WithDeadline(deadline).Deadline.Value); - var token = new CancellationTokenSource().Token; - Assert.AreEqual(token, options.WithCancellationToken(token).CancellationToken); + var cancellationToken = new CancellationTokenSource().Token; + Assert.AreEqual(cancellationToken, options.WithCancellationToken(cancellationToken).CancellationToken); + + var writeOptions = new WriteOptions(); + Assert.AreSame(writeOptions, options.WithWriteOptions(writeOptions).WriteOptions); + + var propagationToken = new ContextPropagationToken(CallSafeHandle.NullInstance, DateTime.UtcNow, + CancellationToken.None, ContextPropagationOptions.Default); + Assert.AreSame(propagationToken, options.WithPropagationToken(propagationToken).PropagationToken); + + var credentials = new FakeCallCredentials(); + Assert.AreSame(credentials, options.WithCredentials(credentials).Credentials); - // Change original instance is unchanged. + // Check that the original instance is unchanged. Assert.IsNull(options.Headers); Assert.IsNull(options.Deadline); Assert.AreEqual(CancellationToken.None, options.CancellationToken); diff --git a/src/csharp/Grpc.Core/CallOptions.cs b/src/csharp/Grpc.Core/CallOptions.cs index caf8210d917..9ca88849ee5 100644 --- a/src/csharp/Grpc.Core/CallOptions.cs +++ b/src/csharp/Grpc.Core/CallOptions.cs @@ -100,10 +100,7 @@ namespace Grpc.Core /// public WriteOptions WriteOptions { - get - { - return this.writeOptions; - } + get { return this.writeOptions; } } /// @@ -111,10 +108,7 @@ namespace Grpc.Core /// public ContextPropagationToken PropagationToken { - get - { - return this.propagationToken; - } + get { return this.propagationToken; } } /// @@ -122,10 +116,7 @@ namespace Grpc.Core /// public CallCredentials Credentials { - get - { - return this.credentials; - } + get { return this.credentials; } } /// @@ -164,6 +155,42 @@ namespace Grpc.Core return newOptions; } + /// + /// Returns new instance of with + /// WriteOptions set to the value provided. Values of all other fields are preserved. + /// + /// The write options. + public CallOptions WithWriteOptions(WriteOptions writeOptions) + { + var newOptions = this; + newOptions.writeOptions = writeOptions; + return newOptions; + } + + /// + /// Returns new instance of with + /// PropagationToken set to the value provided. Values of all other fields are preserved. + /// + /// The context propagation token. + public CallOptions WithPropagationToken(ContextPropagationToken propagationToken) + { + var newOptions = this; + newOptions.propagationToken = propagationToken; + return newOptions; + } + + /// + /// Returns new instance of with + /// Credentials set to the value provided. Values of all other fields are preserved. + /// + /// The call credentials. + public CallOptions WithCredentials(CallCredentials credentials) + { + var newOptions = this; + newOptions.credentials = credentials; + return newOptions; + } + /// /// Returns a new instance of with /// all previously unset values set to their defaults and deadline and cancellation