< Summary

Class:Azure.Security.KeyVault.Keys.RecoverDeletedKeyOperation
Assembly:Azure.Security.KeyVault.Keys
File(s):C:\Git\azure-sdk-for-net\sdk\keyvault\Azure.Security.KeyVault.Keys\src\RecoverDeletedKeyOperation.cs
Covered lines:24
Uncovered lines:22
Coverable lines:46
Total lines:139
Line coverage:52.1% (24 of 46)
Covered branches:8
Total branches:18
Branch coverage:44.4% (8 of 18)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.cctor()-100%100%
.ctor(...)-100%50%
get_Id()-0%100%
get_Value()-100%100%
get_HasCompleted()-100%100%
get_HasValue()-0%100%
GetRawResponse()-100%100%
UpdateStatus(...)-0%0%
UpdateStatusAsync()-76.92%100%
WaitForCompletionAsync(...)-100%100%
WaitForCompletionAsync(...)-0%100%
CheckCompletedAsync()-80%83.33%
CheckCompleted(...)-0%0%

File(s)

C:\Git\azure-sdk-for-net\sdk\keyvault\Azure.Security.KeyVault.Keys\src\RecoverDeletedKeyOperation.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.Threading;
 6using System.Threading.Tasks;
 7using Azure.Core;
 8using Azure.Core.Pipeline;
 9
 10namespace Azure.Security.KeyVault.Keys
 11{
 12    /// <summary>
 13    /// A long-running operation for <see cref="KeyClient.StartRecoverDeletedKey(string, CancellationToken)"/> or <see c
 14    /// </summary>
 15    public class RecoverDeletedKeyOperation : Operation<KeyVaultKey>
 16    {
 217        private static readonly TimeSpan s_defaultPollingInterval = TimeSpan.FromSeconds(2);
 18
 19        private readonly KeyVaultPipeline _pipeline;
 20        private readonly KeyVaultKey _value;
 21        private Response _response;
 22        private bool _completed;
 23
 1224        internal RecoverDeletedKeyOperation(KeyVaultPipeline pipeline, Response<KeyVaultKey> response)
 25        {
 1226            _pipeline = pipeline;
 1227            _value = response.Value ?? throw new InvalidOperationException("The response does not contain a value.");
 1228            _response = response.GetRawResponse();
 1229        }
 30
 31        /// <inheritdoc/>
 032        public override string Id => _value.Id.ToString();
 33
 34        /// <summary>
 35        /// Gets the <see cref="KeyVaultKey"/> of the key being recovered.
 36        /// You should await <see cref="WaitForCompletionAsync(CancellationToken)"/> before attempting to use a key in t
 37        /// </summary>
 38        /// <remarks>
 39        /// Azure Key Vault will return a <see cref="KeyVaultKey"/> immediately but may take time to actually recover th
 40        /// </remarks>
 1241        public override KeyVaultKey Value => _value;
 42
 43        /// <inheritdoc/>
 6044        public override bool HasCompleted => _completed;
 45
 46        /// <inheritdoc/>
 047        public override bool HasValue => true;
 48
 49        /// <inheritdoc/>
 6850        public override Response GetRawResponse() => _response;
 51
 52        /// <inheritdoc/>
 53        public override Response UpdateStatus(CancellationToken cancellationToken = default)
 54        {
 055            if (!_completed)
 56            {
 057                using DiagnosticScope scope = _pipeline.CreateScope($"{nameof(RecoverDeletedKeyOperation)}.{nameof(Updat
 058                scope.AddAttribute("secret", _value.Name);
 059                scope.Start();
 60
 61                try
 62                {
 063                    _response = _pipeline.GetResponse(RequestMethod.Get, cancellationToken, KeyClient.KeysPath, _value.N
 064                    _completed = CheckCompleted(_response);
 065                }
 066                catch (Exception e)
 67                {
 068                    scope.Failed(e);
 069                    throw;
 70                }
 71            }
 72
 073            return GetRawResponse();
 74        }
 75
 76        /// <inheritdoc/>
 77        public override async ValueTask<Response> UpdateStatusAsync(CancellationToken cancellationToken = default)
 78        {
 6079            if (!_completed)
 80            {
 6081                using DiagnosticScope scope = _pipeline.CreateScope($"{nameof(RecoverDeletedKeyOperation)}.{nameof(Updat
 6082                scope.AddAttribute("secret", _value.Name);
 6083                scope.Start();
 84
 85                try
 86                {
 6087                    _response = await _pipeline.GetResponseAsync(RequestMethod.Get, cancellationToken, KeyClient.KeysPat
 6088                    _completed = await CheckCompletedAsync(_response).ConfigureAwait(false);
 6089                }
 090                catch (Exception e)
 91                {
 092                    scope.Failed(e);
 093                    throw;
 94                }
 6095            }
 96
 6097            return GetRawResponse();
 6098        }
 99
 100        /// <inheritdoc />
 101        public override ValueTask<Response<KeyVaultKey>> WaitForCompletionAsync(CancellationToken cancellationToken = de
 8102            this.DefaultWaitForCompletionAsync(s_defaultPollingInterval, cancellationToken);
 103
 104        /// <inheritdoc />
 105        public override ValueTask<Response<KeyVaultKey>> WaitForCompletionAsync(TimeSpan pollingInterval, CancellationTo
 0106            this.DefaultWaitForCompletionAsync(pollingInterval, cancellationToken);
 107
 108        private async ValueTask<bool> CheckCompletedAsync(Response response)
 109        {
 60110            switch (response.Status)
 111            {
 112                case 200:
 113                case 403: // Access denied but proof the key was recovered.
 8114                    return true;
 115
 116                case 404:
 52117                    return false;
 118
 119                default:
 0120                    throw await _pipeline.Diagnostics.CreateRequestFailedExceptionAsync(response).ConfigureAwait(false);
 121            }
 60122        }
 123        private bool CheckCompleted(Response response)
 124        {
 0125            switch (response.Status)
 126            {
 127                case 200:
 128                case 403: // Access denied but proof the key was recovered.
 0129                    return true;
 130
 131                case 404:
 0132                    return false;
 133
 134                default:
 0135                    throw _pipeline.Diagnostics.CreateRequestFailedException(response);
 136            }
 137        }
 138    }
 139}