< Summary

Class:Azure.Security.KeyVault.Certificates.CertificateProperties
Assembly:Azure.Security.KeyVault.Certificates
File(s):C:\Git\azure-sdk-for-net\sdk\keyvault\Azure.Security.KeyVault.Certificates\src\CertificateProperties.cs
Covered lines:28
Uncovered lines:19
Coverable lines:47
Total lines:176
Line coverage:59.5% (28 of 47)
Covered branches:17
Total branches:20
Branch coverage:85% (17 of 20)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor()-100%100%
.ctor(...)-0%100%
.ctor(...)-0%100%
get_Id()-100%100%
get_Name()-100%100%
get_VaultUri()-0%100%
get_Version()-100%100%
get_X509Thumbprint()-0%100%
get_Tags()-100%100%
get_Enabled()-100%100%
get_NotBefore()-0%100%
get_ExpiresOn()-0%100%
get_CreatedOn()-0%100%
get_UpdatedOn()-0%100%
get_RecoverableDays()-0%100%
get_RecoveryLevel()-0%100%
get_HasTags()-100%100%
Azure.Security.KeyVault.IJsonDeserializable.ReadProperties(...)-100%100%
ReadProperty(...)-100%100%
ParseId(...)-75%62.5%

File(s)

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

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.Collections.Generic;
 6using System.Globalization;
 7using System.Text.Json;
 8using System.Threading;
 9using Azure.Core;
 10
 11namespace Azure.Security.KeyVault.Certificates
 12{
 13    /// <summary>
 14    /// <see cref="CertificateProperties"/> contains identity and other basic properties of a <see cref="KeyVaultCertifi
 15    /// </summary>
 16    public class CertificateProperties : IJsonDeserializable
 17    {
 18        private const string IdPropertyName = "id";
 19        private const string X509ThumprintPropertyName = "x5t";
 20        private const string TagsPropertyName = "tags";
 21        private const string AttributesPropertyName = "attributes";
 22
 23        private CertificateAttributes _attributes;
 24        private Dictionary<string, string> _tags;
 25
 8226        internal CertificateProperties()
 27        {
 8228        }
 29
 30        /// <summary>
 31        /// Initializes a new instance of the <see cref="CertificateProperties"/> class.
 32        /// </summary>
 33        /// <param name="name">The name of the certificate.</param>
 34        /// <exception cref="ArgumentException"><paramref name="name"/> is an empty string.</exception>
 35        /// <exception cref="ArgumentNullException"><paramref name="name"/> is null.</exception>
 036        public CertificateProperties(string name)
 37        {
 038            Argument.AssertNotNullOrEmpty(name, nameof(name));
 39
 040            Name = name;
 041        }
 42
 43        /// <summary>
 44        /// Initializes a new instance of the <see cref="CertificateProperties"/> class.
 45        /// </summary>
 46        /// <param name="id">The identifier of the certificate.</param>
 47        /// <exception cref="ArgumentNullException"><paramref name="id"/> is null.</exception>
 048        public CertificateProperties(Uri id)
 49        {
 050            Argument.AssertNotNull(id, nameof(id));
 51
 052            Id = id;
 053            ParseId(id);
 054        }
 55
 56        /// <summary>
 57        /// Gets the identifier of the certificate.
 58        /// </summary>
 15259        public Uri Id { get; internal set; }
 60
 61        /// <summary>
 62        /// Gets the name of the certificate.
 63        /// </summary>
 12464        public string Name { get; internal set; }
 65
 66        /// <summary>
 67        /// Gets the <see cref="Uri"/> of the vault in which the certificate is stored.
 68        /// </summary>
 069        public Uri VaultUri { get; internal set; }
 70
 71        /// <summary>
 72        /// Gets the version of the certificate.
 73        /// </summary>
 10474        public string Version { get; internal set; }
 75
 76        /// <summary>
 77        /// Gets the digital thumbprint of the certificate which can be used to uniquely identify it.
 78        /// </summary>
 079        public byte[] X509Thumbprint { get; internal set; }
 80
 81        /// <summary>
 82        /// Gets the tags applied to the certificate.
 83        /// </summary>
 4084        public IDictionary<string, string> Tags => LazyInitializer.EnsureInitialized(ref _tags);
 85
 86        /// <summary>
 87        /// Gets or sets a value indicating whether the certificate is currently enabled. If null, the server default wi
 88        /// </summary>
 3289        public bool? Enabled { get => _attributes.Enabled; set => _attributes.Enabled = value; }
 90
 91        /// <summary>
 92        /// Gets a <see cref="DateTimeOffset"/> indicating when the certificate will be valid.
 93        /// </summary>
 094        public DateTimeOffset? NotBefore { get => _attributes.NotBefore; internal set => _attributes.NotBefore = value; 
 95
 96        /// <summary>
 97        /// Gets a <see cref="DateTimeOffset"/> indicating when the certificate will expire.
 98        /// </summary>
 099        public DateTimeOffset? ExpiresOn { get => _attributes.ExpiresOn; internal set => _attributes.ExpiresOn = value; 
 100
 101        /// <summary>
 102        /// Gets a <see cref="DateTimeOffset"/> indicating when the certificate was created.
 103        /// </summary>
 0104        public DateTimeOffset? CreatedOn { get => _attributes.CreatedOn; internal set => _attributes.CreatedOn = value; 
 105
 106        /// <summary>
 107        /// Gets a <see cref="DateTimeOffset"/> indicating when the certificate was updated.
 108        /// </summary>
 0109        public DateTimeOffset? UpdatedOn { get => _attributes.UpdatedOn; internal set => _attributes.UpdatedOn = value; 
 110
 111        /// <summary>
 112        /// Gets the number of days a certificate is retained before being deleted for a soft delete-enabled Key Vault.
 113        /// </summary>
 0114        public int? RecoverableDays { get => _attributes.RecoverableDays; internal set => _attributes.RecoverableDays = 
 115
 116        /// <summary>
 117        /// Gets the recovery level currently in effect for certificates in the Key Vault.
 118        /// If <c>Purgeable</c>, the certificates can be permanently deleted by an authorized user;
 119        /// otherwise, only the service can purge the certificates at the end of the retention interval.
 120        /// </summary>
 121        /// <value>Possible values include <c>Purgeable</c>, <c>Recoverable+Purgeable</c>, <c>Recoverable</c>, and <c>Re
 0122        public string RecoveryLevel { get => _attributes.RecoveryLevel; internal set => _attributes.RecoveryLevel = valu
 123
 8124        internal bool HasTags => _tags != null;
 125
 126        void IJsonDeserializable.ReadProperties(JsonElement json)
 127        {
 32128            foreach (JsonProperty prop in json.EnumerateObject())
 129            {
 10130                ReadProperty(prop);
 131            }
 6132        }
 133
 134        internal void ReadProperty(JsonProperty prop)
 135        {
 298136            switch (prop.Name)
 137            {
 138                case IdPropertyName:
 76139                    var id = prop.Value.GetString();
 76140                    Id = new Uri(id);
 76141                    ParseId(Id);
 76142                    break;
 143
 144                case X509ThumprintPropertyName:
 68145                    X509Thumbprint = Base64Url.Decode(prop.Value.GetString());
 68146                    break;
 147
 148                case TagsPropertyName:
 32149                    foreach (JsonProperty tagProp in prop.Value.EnumerateObject())
 150                    {
 8151                        Tags[tagProp.Name] = tagProp.Value.GetString();
 152                    }
 153                    break;
 154
 155                case AttributesPropertyName:
 80156                    _attributes.ReadProperties(prop.Value);
 157                    break;
 158            }
 88159        }
 160
 161        private void ParseId(Uri idToParse)
 162        {
 163            // We expect an identifier with either 3 or 4 segments: host + collection + name [+ version]
 76164            if (idToParse.Segments.Length != 3 && idToParse.Segments.Length != 4)
 0165                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Invalid ObjectIdentifier: {0}. 
 166
 76167            if (!string.Equals(idToParse.Segments[1], "certificates" + "/", StringComparison.OrdinalIgnoreCase))
 0168                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Invalid ObjectIdentifier: {0}. 
 169
 76170            VaultUri = new Uri($"{idToParse.Scheme}://{idToParse.Authority}");
 76171            Name = idToParse.Segments[2].Trim('/');
 76172            Version = (idToParse.Segments.Length == 4) ? idToParse.Segments[3].TrimEnd('/') : null;
 76173        }
 174
 175    }
 176}