diff --git a/sdk/appconfiguration/Azure.Data.AppConfiguration/src/Azure.Data.AppConfiguration.csproj b/sdk/appconfiguration/Azure.Data.AppConfiguration/src/Azure.Data.AppConfiguration.csproj index 704821720c7c3..c267309506b73 100644 --- a/sdk/appconfiguration/Azure.Data.AppConfiguration/src/Azure.Data.AppConfiguration.csproj +++ b/sdk/appconfiguration/Azure.Data.AppConfiguration/src/Azure.Data.AppConfiguration.csproj @@ -25,10 +25,12 @@ + + diff --git a/sdk/appconfiguration/Azure.Data.AppConfiguration/src/ConfigurationClient.cs b/sdk/appconfiguration/Azure.Data.AppConfiguration/src/ConfigurationClient.cs index a4a3fd2f440aa..dea556eda456c 100644 --- a/sdk/appconfiguration/Azure.Data.AppConfiguration/src/ConfigurationClient.cs +++ b/sdk/appconfiguration/Azure.Data.AppConfiguration/src/ConfigurationClient.cs @@ -332,7 +332,7 @@ private Request CreateSetRequest(ConfigurationSetting setting, ConditionalReques request.Headers.Add(s_mediaTypeKeyValueApplicationHeader); request.Headers.Add(HttpHeader.Common.JsonContentType); - if (requestOptions != default) + if (requestOptions != null) { ConditionalRequestOptionsExtensions.ApplyHeaders(request, requestOptions); } @@ -484,7 +484,7 @@ private Request CreateDeleteRequest(string key, string label, ConditionalRequest request.Method = RequestMethod.Delete; BuildUriForKvRoute(request.Uri, key, label); - if (requestOptions != default) + if (requestOptions != null) { ConditionalRequestOptionsExtensions.ApplyHeaders(request, requestOptions); } @@ -680,7 +680,7 @@ private Request CreateGetRequest(string key, string label, DateTimeOffset accept request.Headers.Add(AcceptDatetimeHeader, dateTime); } - if (requestOptions != default) + if (requestOptions != null) { ConditionalRequestOptionsExtensions.ApplyHeaders(request, requestOptions); } diff --git a/sdk/core/Azure.Core/src/Shared/ContentTypeUtilities.cs b/sdk/core/Azure.Core/src/Shared/ContentTypeUtilities.cs index b412940073c17..c13a1047ee7d2 100644 --- a/sdk/core/Azure.Core/src/Shared/ContentTypeUtilities.cs +++ b/sdk/core/Azure.Core/src/Shared/ContentTypeUtilities.cs @@ -1,17 +1,22 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#nullable enable +#nullable disable using System; -using System.Diagnostics.CodeAnalysis; using System.Text; namespace Azure.Core.Pipeline { +#if !TESTFRAMEWORK internal static class ContentTypeUtilities +#else +#pragma warning disable SA1649 // File name should match first type name + internal static class TestFrameworkContentTypeUtilities +#pragma warning restore SA1649 // File name should match first type name +#endif { - public static bool TryGetTextEncoding(string? contentType, [NotNullWhen(true)] out Encoding? encoding) + public static bool TryGetTextEncoding(string contentType, out Encoding encoding) { const string charsetMarker = "; charset="; const string utf8Charset = "utf-8"; diff --git a/sdk/core/Azure.Core/src/ResponseExceptionExtensions.cs b/sdk/core/Azure.Core/src/Shared/ResponseExceptionExtensions.cs similarity index 74% rename from sdk/core/Azure.Core/src/ResponseExceptionExtensions.cs rename to sdk/core/Azure.Core/src/Shared/ResponseExceptionExtensions.cs index 2a217959de887..3162034f7fdef 100644 --- a/sdk/core/Azure.Core/src/ResponseExceptionExtensions.cs +++ b/sdk/core/Azure.Core/src/Shared/ResponseExceptionExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics; using System.Globalization; using System.IO; using System.Text; @@ -9,16 +10,16 @@ namespace Azure.Core { - public static class ResponseExceptionExtensions + internal static class ResponseExceptionExtensions { private const string DefaultMessage = "Service request failed."; - public static Task CreateRequestFailedExceptionAsync(this Response response) + public static ValueTask CreateRequestFailedExceptionAsync(this Response response) { return CreateRequestFailedExceptionAsync(response, DefaultMessage); } - public static Task CreateRequestFailedExceptionAsync(this Response response, string message) + public static ValueTask CreateRequestFailedExceptionAsync(this Response response, string message) { return CreateRequestFailedExceptionAsync(message, response, true); } @@ -30,16 +31,18 @@ public static RequestFailedException CreateRequestFailedException(this Response public static RequestFailedException CreateRequestFailedException(this Response response, string message) { - return CreateRequestFailedExceptionAsync(message, response, false).EnsureCompleted(); + ValueTask messageTask = CreateRequestFailedExceptionAsync(message, response, false); + Debug.Assert(messageTask.IsCompleted); + return messageTask.GetAwaiter().GetResult(); } - public static async Task CreateRequestFailedExceptionAsync(string message, Response response, bool async) + public static async ValueTask CreateRequestFailedExceptionAsync(string message, Response response, bool async) { message = await CreateRequestFailedMessageAsync(message, response, async).ConfigureAwait(false); return new RequestFailedException(response.Status, message); } - public static async Task CreateRequestFailedMessageAsync(string message, Response response, bool async) + public static async ValueTask CreateRequestFailedMessageAsync(string message, Response response, bool async) { StringBuilder messageBuilder = new StringBuilder() .AppendLine(message) diff --git a/sdk/core/Azure.Core/src/Pipeline/RetriableStream.cs b/sdk/core/Azure.Core/src/Shared/RetriableStream.cs similarity index 86% rename from sdk/core/Azure.Core/src/Pipeline/RetriableStream.cs rename to sdk/core/Azure.Core/src/Shared/RetriableStream.cs index 4d70c7f1c4f5f..f4d39fd213265 100644 --- a/sdk/core/Azure.Core/src/Pipeline/RetriableStream.cs +++ b/sdk/core/Azure.Core/src/Shared/RetriableStream.cs @@ -1,8 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +#nullable disable + using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Runtime.ExceptionServices; using System.Threading; @@ -10,7 +13,7 @@ namespace Azure.Core.Pipeline { - public static class RetriableStream + internal static class RetriableStream { public static Stream Create( Func responseFactory, @@ -40,7 +43,7 @@ public static Stream Create( return new RetriableStreamImpl(initialResponse, streamFactory, asyncResponseFactory, responseClassifier, maxRetries); } - private class RetriableStreamImpl : ReadOnlyStream + private class RetriableStreamImpl : Stream { private readonly ResponseClassifier _responseClassifier; @@ -58,7 +61,7 @@ private class RetriableStreamImpl : ReadOnlyStream private int _retryCount; - private List? _exceptions; + private List _exceptions; public RetriableStreamImpl(Stream initialStream, Func streamFactory, Func> asyncStreamFactory, ResponseClassifier responseClassifier, int maxRetries) { @@ -129,7 +132,9 @@ public override int Read(byte[] buffer, int offset, int count) } catch (Exception e) { - RetryAsync(e, false).EnsureCompleted(); + Task task = RetryAsync(e, false); + Debug.Assert(task.IsCompleted); + task.GetAwaiter().GetResult(); } } } @@ -153,6 +158,23 @@ private static Stream EnsureStream(Stream stream) return stream; } + + public override bool CanWrite => false; + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } } } } diff --git a/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj b/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj index e195bb36d09e3..9f40e8df76216 100644 --- a/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj +++ b/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj @@ -2,7 +2,7 @@ {84491222-6C36-4FA7-BBAE-1FA804129151} $(RequiredTargetFrameworks) - $(DefineConstants);HAS_INTERNALS_VISIBLE_CORE + $(DefineConstants);TESTFRAMEWORK;HAS_INTERNALS_VISIBLE_CORE @@ -21,4 +21,8 @@ Azure.Core + + + + diff --git a/sdk/core/Azure.Core/tests/TestFramework.props b/sdk/core/Azure.Core/tests/TestFramework.props index 7ab98935cca7a..b9ebf0a7dfa91 100644 --- a/sdk/core/Azure.Core/tests/TestFramework.props +++ b/sdk/core/Azure.Core/tests/TestFramework.props @@ -1,6 +1,7 @@  SessionRecords + $(DefineConstants);TESTFRAMEWORK diff --git a/sdk/core/Azure.Core/tests/TestFramework/RecordEntry.cs b/sdk/core/Azure.Core/tests/TestFramework/RecordEntry.cs index 4211c938bc10c..f53f8c1cbd00e 100644 --- a/sdk/core/Azure.Core/tests/TestFramework/RecordEntry.cs +++ b/sdk/core/Azure.Core/tests/TestFramework/RecordEntry.cs @@ -266,7 +266,7 @@ private static bool IsTextContentType(IDictionary requestHeade { encoding = null; return TryGetContentType(requestHeaders, out string contentType) && - ContentTypeUtilities.TryGetTextEncoding(contentType, out encoding); + TestFrameworkContentTypeUtilities.TryGetTextEncoding(contentType, out encoding); } public void Sanitize(RecordedTestSanitizer sanitizer) diff --git a/sdk/identity/Azure.Identity/src/Azure.Identity.csproj b/sdk/identity/Azure.Identity/src/Azure.Identity.csproj index 1950de20b318c..dbc471623ee45 100644 --- a/sdk/identity/Azure.Identity/src/Azure.Identity.csproj +++ b/sdk/identity/Azure.Identity/src/Azure.Identity.csproj @@ -27,6 +27,8 @@ + + diff --git a/sdk/keyvault/Azure.Security.KeyVault.Certificates/src/Azure.Security.KeyVault.Certificates.csproj b/sdk/keyvault/Azure.Security.KeyVault.Certificates/src/Azure.Security.KeyVault.Certificates.csproj index ca24cf1285c4a..099022aaddeb9 100644 --- a/sdk/keyvault/Azure.Security.KeyVault.Certificates/src/Azure.Security.KeyVault.Certificates.csproj +++ b/sdk/keyvault/Azure.Security.KeyVault.Certificates/src/Azure.Security.KeyVault.Certificates.csproj @@ -24,9 +24,6 @@ - - - @@ -37,7 +34,10 @@ + + + diff --git a/sdk/keyvault/Azure.Security.KeyVault.Keys/src/Azure.Security.KeyVault.Keys.csproj b/sdk/keyvault/Azure.Security.KeyVault.Keys/src/Azure.Security.KeyVault.Keys.csproj index f45036dbc156e..c67bf12f21d07 100644 --- a/sdk/keyvault/Azure.Security.KeyVault.Keys/src/Azure.Security.KeyVault.Keys.csproj +++ b/sdk/keyvault/Azure.Security.KeyVault.Keys/src/Azure.Security.KeyVault.Keys.csproj @@ -33,7 +33,9 @@ + + diff --git a/sdk/keyvault/Azure.Security.KeyVault.Secrets/src/Azure.Security.KeyVault.Secrets.csproj b/sdk/keyvault/Azure.Security.KeyVault.Secrets/src/Azure.Security.KeyVault.Secrets.csproj index d562e9b161e69..9e7b22bde9265 100644 --- a/sdk/keyvault/Azure.Security.KeyVault.Secrets/src/Azure.Security.KeyVault.Secrets.csproj +++ b/sdk/keyvault/Azure.Security.KeyVault.Secrets/src/Azure.Security.KeyVault.Secrets.csproj @@ -31,7 +31,9 @@ - + + + diff --git a/sdk/storage/Azure.Storage.Blobs/src/Azure.Storage.Blobs.csproj b/sdk/storage/Azure.Storage.Blobs/src/Azure.Storage.Blobs.csproj index 482d2f575393b..ecd65c1b7f962 100644 --- a/sdk/storage/Azure.Storage.Blobs/src/Azure.Storage.Blobs.csproj +++ b/sdk/storage/Azure.Storage.Blobs/src/Azure.Storage.Blobs.csproj @@ -21,4 +21,7 @@ + + + \ No newline at end of file diff --git a/sdk/storage/Azure.Storage.Files/src/Azure.Storage.Files.csproj b/sdk/storage/Azure.Storage.Files/src/Azure.Storage.Files.csproj index f5a5e4ada06a1..bcbfd50ba3d41 100644 --- a/sdk/storage/Azure.Storage.Files/src/Azure.Storage.Files.csproj +++ b/sdk/storage/Azure.Storage.Files/src/Azure.Storage.Files.csproj @@ -24,4 +24,7 @@ + + + \ No newline at end of file