|
|
|
@ -40,6 +40,7 @@ using System.Threading.Tasks; |
|
|
|
|
using Grpc.Core; |
|
|
|
|
using Grpc.Core.Utils; |
|
|
|
|
using Grpc.Testing; |
|
|
|
|
using Moq; |
|
|
|
|
using NUnit.Framework; |
|
|
|
|
|
|
|
|
|
namespace Grpc.IntegrationTesting |
|
|
|
@ -50,37 +51,37 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
Server server; |
|
|
|
|
Channel channel; |
|
|
|
|
TestService.ITestServiceClient client; |
|
|
|
|
List<ChannelOption> options; |
|
|
|
|
Mock<TestService.ITestService> serviceMock; |
|
|
|
|
AsyncAuthInterceptor asyncAuthInterceptor; |
|
|
|
|
|
|
|
|
|
[TestFixtureSetUp] |
|
|
|
|
[SetUp] |
|
|
|
|
public void Init() |
|
|
|
|
{ |
|
|
|
|
var serverCredentials = new SslServerCredentials(new[] { new KeyCertificatePair(File.ReadAllText(TestCredentials.ServerCertChainPath), File.ReadAllText(TestCredentials.ServerPrivateKeyPath)) }); |
|
|
|
|
serviceMock = new Mock<TestService.ITestService>(); |
|
|
|
|
serviceMock.Setup(m => m.UnaryCall(It.IsAny<SimpleRequest>(), It.IsAny<ServerCallContext>())) |
|
|
|
|
.Returns(new Func<SimpleRequest, ServerCallContext, Task<SimpleResponse>>(UnaryCallHandler)); |
|
|
|
|
|
|
|
|
|
server = new Server |
|
|
|
|
{ |
|
|
|
|
Services = { TestService.BindService(new TestServiceImpl()) }, |
|
|
|
|
Ports = { { Host, ServerPort.PickUnused, serverCredentials } } |
|
|
|
|
Services = { TestService.BindService(serviceMock.Object) }, |
|
|
|
|
Ports = { { Host, ServerPort.PickUnused, TestCredentials.CreateSslServerCredentials() } } |
|
|
|
|
}; |
|
|
|
|
server.Start(); |
|
|
|
|
|
|
|
|
|
var options = new List<ChannelOption> |
|
|
|
|
options = new List<ChannelOption> |
|
|
|
|
{ |
|
|
|
|
new ChannelOption(ChannelOptions.SslTargetNameOverride, TestCredentials.DefaultHostOverride) |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var asyncAuthInterceptor = new AsyncAuthInterceptor(async (context, metadata) => |
|
|
|
|
asyncAuthInterceptor = new AsyncAuthInterceptor(async (context, metadata) => |
|
|
|
|
{ |
|
|
|
|
await Task.Delay(100); // make sure the operation is asynchronous. |
|
|
|
|
await Task.Delay(100).ConfigureAwait(false); // make sure the operation is asynchronous. |
|
|
|
|
metadata.Add("authorization", "SECRET_TOKEN"); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
var clientCredentials = ChannelCredentials.Create( |
|
|
|
|
new SslCredentials(File.ReadAllText(TestCredentials.ClientCertAuthorityPath)), |
|
|
|
|
CallCredentials.FromInterceptor(asyncAuthInterceptor)); |
|
|
|
|
channel = new Channel(Host, server.Ports.Single().BoundPort, clientCredentials, options); |
|
|
|
|
client = TestService.NewClient(channel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[TestFixtureTearDown] |
|
|
|
|
[TearDown] |
|
|
|
|
public void Cleanup() |
|
|
|
|
{ |
|
|
|
|
channel.ShutdownAsync().Wait(); |
|
|
|
@ -90,8 +91,29 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
[Test] |
|
|
|
|
public void MetadataCredentials() |
|
|
|
|
{ |
|
|
|
|
var response = client.UnaryCall(new SimpleRequest { ResponseSize = 10 }); |
|
|
|
|
Assert.AreEqual(10, response.Payload.Body.Length); |
|
|
|
|
var channelCredentials = ChannelCredentials.Create(TestCredentials.CreateSslCredentials(), |
|
|
|
|
CallCredentials.FromInterceptor(asyncAuthInterceptor)); |
|
|
|
|
channel = new Channel(Host, server.Ports.Single().BoundPort, channelCredentials, options); |
|
|
|
|
client = TestService.NewClient(channel); |
|
|
|
|
|
|
|
|
|
client.UnaryCall(new SimpleRequest {}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void MetadataCredentials_PerCall() |
|
|
|
|
{ |
|
|
|
|
channel = new Channel(Host, server.Ports.Single().BoundPort, TestCredentials.CreateSslCredentials(), options); |
|
|
|
|
client = TestService.NewClient(channel); |
|
|
|
|
|
|
|
|
|
var callCredentials = CallCredentials.FromInterceptor(asyncAuthInterceptor); |
|
|
|
|
client.UnaryCall(new SimpleRequest { }, new CallOptions(credentials: callCredentials)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Task<SimpleResponse> UnaryCallHandler(SimpleRequest request, ServerCallContext context) |
|
|
|
|
{ |
|
|
|
|
var authToken = context.RequestHeaders.First((entry) => entry.Key == "authorization").Value; |
|
|
|
|
Assert.AreEqual("SECRET_TOKEN", authToken); |
|
|
|
|
return Task.FromResult(new SimpleResponse()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|