From 41ee90519daca1ed535737187004e88170f882b9 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 22 Oct 2019 10:18:07 -0700 Subject: [PATCH 1/2] Return ValueTask from GetTokenAsync --- sdk/core/Azure.Core/src/TokenCredential.cs | 2 +- sdk/core/Azure.Core/tests/TestFramework/TestRecording.cs | 4 ++-- .../src/Authorization/EventHubSharedKeyCredential.cs | 2 +- .../src/Authorization/EventHubTokenCredential.cs | 2 +- .../src/Authorization/SharedAccessSignatureCredential.cs | 4 ++-- .../tests/Amqp/AmqpEventHubClientTests.cs | 8 ++++---- .../tests/Amqp/AmqpEventHubConsumerTests.cs | 2 +- .../tests/Amqp/CbsTokenProviderTests.cs | 6 +++--- .../Azure.Identity/src/AuthorizationCodeCredential.cs | 2 +- sdk/identity/Azure.Identity/src/ChainedTokenCredential.cs | 2 +- .../Azure.Identity/src/ClientCertificateCredential.cs | 2 +- sdk/identity/Azure.Identity/src/ClientSecretCredential.cs | 2 +- sdk/identity/Azure.Identity/src/DefaultAzureCredential.cs | 2 +- sdk/identity/Azure.Identity/src/DeviceCodeCredential.cs | 2 +- sdk/identity/Azure.Identity/src/EnvironmentCredential.cs | 2 +- .../Azure.Identity/src/InteractiveBrowserCredential.cs | 2 +- .../Azure.Identity/src/ManagedIdentityCredential.cs | 2 +- .../Azure.Identity/src/SharedTokenCacheCredential.cs | 2 +- .../Azure.Identity/src/UsernamePasswordCredential.cs | 2 +- .../Azure.Identity/tests/DeviceCodeCredentialTests.cs | 2 +- .../tests/InteractiveBrowserCredentialTests.cs | 2 +- .../tests/Mock/MockManagedIdentityCredentialTests.cs | 2 +- .../Azure.Identity/tests/TokenCredentialProviderTests.cs | 4 ++-- 23 files changed, 31 insertions(+), 31 deletions(-) diff --git a/sdk/core/Azure.Core/src/TokenCredential.cs b/sdk/core/Azure.Core/src/TokenCredential.cs index 2705f1e09bc1..08a079f891ac 100644 --- a/sdk/core/Azure.Core/src/TokenCredential.cs +++ b/sdk/core/Azure.Core/src/TokenCredential.cs @@ -17,7 +17,7 @@ public abstract class TokenCredential /// The with authentication information. /// The to use. /// A valid . - public abstract Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken); + public abstract ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken); /// /// Gets an for the specified set of scopes. diff --git a/sdk/core/Azure.Core/tests/TestFramework/TestRecording.cs b/sdk/core/Azure.Core/tests/TestFramework/TestRecording.cs index a8db6577ffd9..8ffccc01435d 100644 --- a/sdk/core/Azure.Core/tests/TestFramework/TestRecording.cs +++ b/sdk/core/Azure.Core/tests/TestFramework/TestRecording.cs @@ -261,9 +261,9 @@ public void DisableIdReuse() private class TestCredential : TokenCredential { - public override Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) + public override ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) { - return Task.FromResult(GetToken(requestContext, cancellationToken)); + return new ValueTask(GetToken(requestContext, cancellationToken)); } public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken) diff --git a/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubSharedKeyCredential.cs b/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubSharedKeyCredential.cs index 1f1653c40d76..1bdd971624c4 100755 --- a/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubSharedKeyCredential.cs +++ b/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubSharedKeyCredential.cs @@ -70,7 +70,7 @@ public EventHubSharedKeyCredential(string sharedAccessKeyName, /// /// The token representing the shared access signature for this credential. /// - public override Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) => throw new InvalidOperationException(Resources.SharedKeyCredentialCannotGenerateTokens); + public override ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) => throw new InvalidOperationException(Resources.SharedKeyCredentialCannotGenerateTokens); /// /// Coverts to shared access signature credential. diff --git a/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubTokenCredential.cs b/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubTokenCredential.cs index 5904ef53336c..fd5e1e4fe206 100755 --- a/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubTokenCredential.cs +++ b/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/EventHubTokenCredential.cs @@ -81,7 +81,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, /// /// The token representing the shared access signature for this credential. /// - public override Task GetTokenAsync(TokenRequestContext requestContext, + public override ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) => Credential.GetTokenAsync(requestContext, cancellationToken); } } diff --git a/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/SharedAccessSignatureCredential.cs b/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/SharedAccessSignatureCredential.cs index ca46217256b0..6ad7064e4cc6 100755 --- a/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/SharedAccessSignatureCredential.cs +++ b/sdk/eventhub/Azure.Messaging.EventHubs/src/Authorization/SharedAccessSignatureCredential.cs @@ -58,7 +58,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, /// /// The token representing the shared access signature for this credential. /// - public override Task GetTokenAsync(TokenRequestContext requestContext, - CancellationToken cancellationToken) => Task.FromResult(new AccessToken(SharedAccessSignature.Value, SharedAccessSignature.SignatureExpiration)); + public override ValueTask GetTokenAsync(TokenRequestContext requestContext, + CancellationToken cancellationToken) => new ValueTask(new AccessToken(SharedAccessSignature.Value, SharedAccessSignature.SignatureExpiration)); } } diff --git a/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubClientTests.cs b/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubClientTests.cs index 3a22a93b8a4b..aec396ca02f0 100755 --- a/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubClientTests.cs +++ b/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubClientTests.cs @@ -232,7 +232,7 @@ public void GetPropertiesAsyncCreatesTheRequest() mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.Is(value => value == cancellationSource.Token))) - .Returns(Task.FromResult(new AccessToken(tokenValue, DateTimeOffset.MaxValue))) + .Returns(new ValueTask(new AccessToken(tokenValue, DateTimeOffset.MaxValue))) .Verifiable(); mockConverter @@ -273,7 +273,7 @@ public void GetPropertiesAsyncRespectsTheRetryPolicy(RetryOptions retryOptions) mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.Is(value => value == cancellationSource.Token))) - .Returns(Task.FromResult(new AccessToken(tokenValue, DateTimeOffset.MaxValue))); + .Returns(new ValueTask(new AccessToken(tokenValue, DateTimeOffset.MaxValue))); mockConverter .Setup(converter => converter.CreateEventHubPropertiesRequest(It.Is(value => value == eventHubName), It.Is(value => value == tokenValue))) @@ -354,7 +354,7 @@ public void GetPartitionPropertiesAsyncCreatesTheRequest() mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.Is(value => value == cancellationSource.Token))) - .Returns(Task.FromResult(new AccessToken(tokenValue, DateTimeOffset.MaxValue))) + .Returns(new ValueTask(new AccessToken(tokenValue, DateTimeOffset.MaxValue))) .Verifiable(); mockConverter @@ -396,7 +396,7 @@ public void GetPartitionPropertiesAsyncRespectsTheRetryPolicy(RetryOptions retry mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.Is(value => value == cancellationSource.Token))) - .Returns(Task.FromResult(new AccessToken(tokenValue, DateTimeOffset.MaxValue))); + .Returns(new ValueTask(new AccessToken(tokenValue, DateTimeOffset.MaxValue))); mockConverter .Setup(converter => converter.CreatePartitionPropertiesRequest(It.Is(value => value == eventHubName), It.Is(value => value == partitionId), It.Is(value => value == tokenValue))) diff --git a/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubConsumerTests.cs b/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubConsumerTests.cs index 3d6e08153429..ce856062f255 100755 --- a/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubConsumerTests.cs +++ b/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/AmqpEventHubConsumerTests.cs @@ -271,7 +271,7 @@ public void ReceiveAsyncRespectsTheRetryPolicy(RetryOptions retryOptions) mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.Is(value => value == cancellationSource.Token))) - .Returns(Task.FromResult(new AccessToken(tokenValue, DateTimeOffset.MaxValue))); + .Returns(new ValueTask(new AccessToken(tokenValue, DateTimeOffset.MaxValue))); mockScope .Setup(scope => scope.OpenConsumerLinkAsync( diff --git a/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/CbsTokenProviderTests.cs b/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/CbsTokenProviderTests.cs index 97e8b3c949bf..481f51bb5985 100755 --- a/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/CbsTokenProviderTests.cs +++ b/sdk/eventhub/Azure.Messaging.EventHubs/tests/Amqp/CbsTokenProviderTests.cs @@ -47,7 +47,7 @@ public async Task GetTokenAsyncPassesAlongTheClaims() mockCredential .Setup(credential => credential.GetTokenAsync(It.Is(value => value.Scopes == requiredClaims), It.IsAny())) - .Returns(Task.FromResult(new AccessToken("blah", DateTimeOffset.Parse("2015-10-27T00:00:00Z")))) + .Returns(new ValueTask(new AccessToken("blah", DateTimeOffset.Parse("2015-10-27T00:00:00Z")))) .Verifiable(); await provider.GetTokenAsync(new Uri("http://www.here.com"), "nobody", requiredClaims); @@ -70,7 +70,7 @@ public async Task GetTokenAsyncPopulatesUsingTheCredentialAccessToken() mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(new AccessToken(tokenValue, expires))); + .Returns(new ValueTask(new AccessToken(tokenValue, expires))); CbsToken cbsToken = await provider.GetTokenAsync(new Uri("http://www.here.com"), "nobody", new string[0]); @@ -114,7 +114,7 @@ public async Task GetTokenAsyncSetsTheCorrectTypeForOtherTokens() mockCredential .Setup(credential => credential.GetTokenAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(new AccessToken(tokenValue, expires))); + .Returns(new ValueTask(new AccessToken(tokenValue, expires))); CbsToken cbsToken = await provider.GetTokenAsync(new Uri("http://www.here.com"), "nobody", new string[0]); diff --git a/sdk/identity/Azure.Identity/src/AuthorizationCodeCredential.cs b/sdk/identity/Azure.Identity/src/AuthorizationCodeCredential.cs index bbd72fd42603..4b1322f17995 100644 --- a/sdk/identity/Azure.Identity/src/AuthorizationCodeCredential.cs +++ b/sdk/identity/Azure.Identity/src/AuthorizationCodeCredential.cs @@ -87,7 +87,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.Identity.AuthorizationCodeCredential.GetToken"); diff --git a/sdk/identity/Azure.Identity/src/ChainedTokenCredential.cs b/sdk/identity/Azure.Identity/src/ChainedTokenCredential.cs index 542ce68d35bd..be84e8b50f0d 100644 --- a/sdk/identity/Azure.Identity/src/ChainedTokenCredential.cs +++ b/sdk/identity/Azure.Identity/src/ChainedTokenCredential.cs @@ -71,7 +71,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// The first non default returned by the specified sources. If all credentials in the chain return default a default is returned. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { AccessToken token = new AccessToken(); diff --git a/sdk/identity/Azure.Identity/src/ClientCertificateCredential.cs b/sdk/identity/Azure.Identity/src/ClientCertificateCredential.cs index eda9fd3b5837..aaf5089a5bdb 100644 --- a/sdk/identity/Azure.Identity/src/ClientCertificateCredential.cs +++ b/sdk/identity/Azure.Identity/src/ClientCertificateCredential.cs @@ -80,7 +80,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { return await _client.AuthenticateAsync(TenantId, ClientId, ClientCertificate, requestContext.Scopes, cancellationToken).ConfigureAwait(false); } diff --git a/sdk/identity/Azure.Identity/src/ClientSecretCredential.cs b/sdk/identity/Azure.Identity/src/ClientSecretCredential.cs index 10d0759e0242..ad8716af5395 100644 --- a/sdk/identity/Azure.Identity/src/ClientSecretCredential.cs +++ b/sdk/identity/Azure.Identity/src/ClientSecretCredential.cs @@ -65,7 +65,7 @@ public ClientSecretCredential(string tenantId, string clientId, string clientSec /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { return await _client.AuthenticateAsync(TenantId, ClientId, ClientSecret, requestContext.Scopes, cancellationToken).ConfigureAwait(false); } diff --git a/sdk/identity/Azure.Identity/src/DefaultAzureCredential.cs b/sdk/identity/Azure.Identity/src/DefaultAzureCredential.cs index 5f6fb58b5bbf..cacde49cf19b 100644 --- a/sdk/identity/Azure.Identity/src/DefaultAzureCredential.cs +++ b/sdk/identity/Azure.Identity/src/DefaultAzureCredential.cs @@ -85,7 +85,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell throw new AuthenticationFailedException(CredentialNotFoundMessage); } - public override Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) + public override ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) { throw new AuthenticationFailedException(CredentialNotFoundMessage); } diff --git a/sdk/identity/Azure.Identity/src/DeviceCodeCredential.cs b/sdk/identity/Azure.Identity/src/DeviceCodeCredential.cs index 9787ed47b76f..c353a5f40783 100644 --- a/sdk/identity/Azure.Identity/src/DeviceCodeCredential.cs +++ b/sdk/identity/Azure.Identity/src/DeviceCodeCredential.cs @@ -124,7 +124,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.Identity.DeviceCodeCredential.GetToken"); diff --git a/sdk/identity/Azure.Identity/src/EnvironmentCredential.cs b/sdk/identity/Azure.Identity/src/EnvironmentCredential.cs index 138f1914a403..3df145706629 100644 --- a/sdk/identity/Azure.Identity/src/EnvironmentCredential.cs +++ b/sdk/identity/Azure.Identity/src/EnvironmentCredential.cs @@ -83,7 +83,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls, or a default . - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { return (_credential != null) ? await _credential.GetTokenAsync(requestContext, cancellationToken).ConfigureAwait(false) : default; } diff --git a/sdk/identity/Azure.Identity/src/InteractiveBrowserCredential.cs b/sdk/identity/Azure.Identity/src/InteractiveBrowserCredential.cs index 474b68b1c4f8..39497d7752c4 100644 --- a/sdk/identity/Azure.Identity/src/InteractiveBrowserCredential.cs +++ b/sdk/identity/Azure.Identity/src/InteractiveBrowserCredential.cs @@ -82,7 +82,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { if (_account != null) { diff --git a/sdk/identity/Azure.Identity/src/ManagedIdentityCredential.cs b/sdk/identity/Azure.Identity/src/ManagedIdentityCredential.cs index 7f2217a6d953..10a11b9802cd 100644 --- a/sdk/identity/Azure.Identity/src/ManagedIdentityCredential.cs +++ b/sdk/identity/Azure.Identity/src/ManagedIdentityCredential.cs @@ -42,7 +42,7 @@ public ManagedIdentityCredential(string clientId = null, TokenCredentialOptions /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls, or a default if no managed identity is available. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { return await _client.AuthenticateAsync(requestContext.Scopes, _clientId, cancellationToken).ConfigureAwait(false); } diff --git a/sdk/identity/Azure.Identity/src/SharedTokenCacheCredential.cs b/sdk/identity/Azure.Identity/src/SharedTokenCacheCredential.cs index e50c1b2eb9ae..29099606b9cf 100644 --- a/sdk/identity/Azure.Identity/src/SharedTokenCacheCredential.cs +++ b/sdk/identity/Azure.Identity/src/SharedTokenCacheCredential.cs @@ -71,7 +71,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime /// An which can be used to authenticate service client calls - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { try { diff --git a/sdk/identity/Azure.Identity/src/UsernamePasswordCredential.cs b/sdk/identity/Azure.Identity/src/UsernamePasswordCredential.cs index d9ba4478e53f..6980b39ee767 100644 --- a/sdk/identity/Azure.Identity/src/UsernamePasswordCredential.cs +++ b/sdk/identity/Azure.Identity/src/UsernamePasswordCredential.cs @@ -94,7 +94,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell /// The details of the authentication request. /// A controlling the request lifetime. /// An which can be used to authenticate service client calls. - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken = default) { using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.Identity.UsernamePasswordCredential.GetToken"); diff --git a/sdk/identity/Azure.Identity/tests/DeviceCodeCredentialTests.cs b/sdk/identity/Azure.Identity/tests/DeviceCodeCredentialTests.cs index bb8788887858..497030413a66 100644 --- a/sdk/identity/Azure.Identity/tests/DeviceCodeCredentialTests.cs +++ b/sdk/identity/Azure.Identity/tests/DeviceCodeCredentialTests.cs @@ -128,7 +128,7 @@ public async Task AuthenticateWithDeviceCodeMockVerifyCallbackCancellationAsync( var cred = InstrumentClient(new DeviceCodeCredential(VerifyDeviceCodeCallbackCancellationToken, ClientId, options: options)); - Task getTokenTask = cred.GetTokenAsync(new TokenRequestContext(new string[] { "https://vault.azure.net/.default" }), cancelSource.Token); + ValueTask getTokenTask = cred.GetTokenAsync(new TokenRequestContext(new string[] { "https://vault.azure.net/.default" }), cancelSource.Token); try { diff --git a/sdk/identity/Azure.Identity/tests/InteractiveBrowserCredentialTests.cs b/sdk/identity/Azure.Identity/tests/InteractiveBrowserCredentialTests.cs index 9ad975204702..aa7aadafdb09 100644 --- a/sdk/identity/Azure.Identity/tests/InteractiveBrowserCredentialTests.cs +++ b/sdk/identity/Azure.Identity/tests/InteractiveBrowserCredentialTests.cs @@ -34,7 +34,7 @@ public void AuthenticateBrowserCancellationAsync() var cancelSource = new CancellationTokenSource(); - Task getTokenTask = cred.GetTokenAsync(new TokenRequestContext(new string[] { "https://vault.azure.net/.default" }), cancelSource.Token); + ValueTask getTokenTask = cred.GetTokenAsync(new TokenRequestContext(new string[] { "https://vault.azure.net/.default" }), cancelSource.Token); cancelSource.Cancel(); diff --git a/sdk/identity/Azure.Identity/tests/Mock/MockManagedIdentityCredentialTests.cs b/sdk/identity/Azure.Identity/tests/Mock/MockManagedIdentityCredentialTests.cs index 15b7993bc9cf..e8a3ab2f9687 100644 --- a/sdk/identity/Azure.Identity/tests/Mock/MockManagedIdentityCredentialTests.cs +++ b/sdk/identity/Azure.Identity/tests/Mock/MockManagedIdentityCredentialTests.cs @@ -23,7 +23,7 @@ public async Task CancellationTokenHonoredAsync() var cancellation = new CancellationTokenSource(); - Task getTokenComplete = credential.GetTokenAsync(new TokenRequestContext(MockScopes.Default), cancellation.Token); + ValueTask getTokenComplete = credential.GetTokenAsync(new TokenRequestContext(MockScopes.Default), cancellation.Token); cancellation.Cancel(); diff --git a/sdk/identity/Azure.Identity/tests/TokenCredentialProviderTests.cs b/sdk/identity/Azure.Identity/tests/TokenCredentialProviderTests.cs index aa8f334a002c..f3e5845a7140 100644 --- a/sdk/identity/Azure.Identity/tests/TokenCredentialProviderTests.cs +++ b/sdk/identity/Azure.Identity/tests/TokenCredentialProviderTests.cs @@ -32,7 +32,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell return _scope == requestContext.Scopes[0] ? new AccessToken(_token, DateTimeOffset.MaxValue) : default; } - public override async Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) + public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) { await Task.CompletedTask; @@ -47,7 +47,7 @@ public override AccessToken GetToken(TokenRequestContext requestContext, Cancell throw new MockException(); } - public override Task GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) + public override ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken) { throw new MockException(); } From 0e8c1bef462978845d0eb031d5df45c93cfdefd1 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 22 Oct 2019 10:51:02 -0700 Subject: [PATCH 2/2] Support ValueTasks --- .../DiagnosticScopeValidatingInterceptor.cs | 21 ++++++++- .../UseSyncMethodsInterceptor.cs | 46 ++++++++++++++++++- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/sdk/core/Azure.Core/tests/TestFramework/DiagnosticScopeValidatingInterceptor.cs b/sdk/core/Azure.Core/tests/TestFramework/DiagnosticScopeValidatingInterceptor.cs index 9ef93a3cd7fe..a18f222703bb 100644 --- a/sdk/core/Azure.Core/tests/TestFramework/DiagnosticScopeValidatingInterceptor.cs +++ b/sdk/core/Azure.Core/tests/TestFramework/DiagnosticScopeValidatingInterceptor.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Azure.Core.Tests; using Castle.DynamicProxy; @@ -36,10 +37,26 @@ public void Intercept(IInvocation invocation) return; } - var result = (Task)invocation.ReturnValue; try { - result.GetAwaiter().GetResult(); + object returnValue = invocation.ReturnValue; + if (returnValue is Task t) + { + t.GetAwaiter().GetResult(); + } + else + { + // Await ValueTask + Type returnType = returnValue.GetType(); + MethodInfo getAwaiterMethod = returnType.GetMethod("GetAwaiter", BindingFlags.Instance | BindingFlags.Public); + MethodInfo getResultMethod = getAwaiterMethod.ReturnType.GetMethod("GetResult", BindingFlags.Instance | BindingFlags.Public); + + getResultMethod.Invoke( + getAwaiterMethod.Invoke(returnValue, Array.Empty()), + Array.Empty()); + + } + expectedEvents.Add(expectedEventPrefix + ".Stop"); } catch (Exception ex) diff --git a/sdk/core/Azure.Core/tests/TestFramework/UseSyncMethodsInterceptor.cs b/sdk/core/Azure.Core/tests/TestFramework/UseSyncMethodsInterceptor.cs index 6dfe6c8be936..2d7fabf7e2c5 100644 --- a/sdk/core/Azure.Core/tests/TestFramework/UseSyncMethodsInterceptor.cs +++ b/sdk/core/Azure.Core/tests/TestFramework/UseSyncMethodsInterceptor.cs @@ -87,7 +87,7 @@ public void Intercept(IInvocation invocation) } else { - invocation.ReturnValue = _taskFromResultMethod.MakeGenericMethod(returnType).Invoke(null, new[] { result }); + SetAsyncResult(invocation, returnType, result); } } catch (TargetInvocationException exception) @@ -98,9 +98,51 @@ public void Intercept(IInvocation invocation) } else { - invocation.ReturnValue = _taskFromExceptionMethod.MakeGenericMethod(methodInfo.ReturnType).Invoke(null, new[] { exception.InnerException }); + SetAsyncException(invocation, returnType, exception.InnerException); + } + } + } + + private void SetAsyncResult(IInvocation invocation, Type returnType, object result) + { + Type methodReturnType = invocation.Method.ReturnType; + if (methodReturnType.IsGenericType) + { + if (methodReturnType.GetGenericTypeDefinition() == typeof(Task<>)) + { + invocation.ReturnValue = _taskFromResultMethod.MakeGenericMethod(returnType).Invoke(null, new[] { result }); + return; + } + if (methodReturnType.GetGenericTypeDefinition() == typeof(ValueTask<>)) + { + invocation.ReturnValue = Activator.CreateInstance(typeof(ValueTask<>).MakeGenericType(returnType), result); + return; } } + + throw new NotSupportedException(); + } + + private void SetAsyncException(IInvocation invocation, Type returnType, Exception result) + { + Type methodReturnType = invocation.Method.ReturnType; + if (methodReturnType.IsGenericType) + { + if (methodReturnType.GetGenericTypeDefinition() == typeof(Task<>)) + { + invocation.ReturnValue = _taskFromExceptionMethod.MakeGenericMethod(returnType).Invoke(null, new[] { result }); + return; + } + + if (methodReturnType.GetGenericTypeDefinition() == typeof(ValueTask<>)) + { + var task = _taskFromExceptionMethod.MakeGenericMethod(returnType).Invoke(null, new[] { result }); + invocation.ReturnValue = Activator.CreateInstance(typeof(ValueTask<>).MakeGenericType(returnType), task); + return; + } + } + + throw new NotSupportedException(); } private static MethodInfo GetMethod(IInvocation invocation, string nonAsyncMethodName, Type[] types) =>