diff --git a/sdk/keyvault/azure-security-keyvault-common/test/CMakeLists.txt b/sdk/keyvault/azure-security-keyvault-common/test/CMakeLists.txt index ed9e174a2..4869a2fc7 100644 --- a/sdk/keyvault/azure-security-keyvault-common/test/CMakeLists.txt +++ b/sdk/keyvault/azure-security-keyvault-common/test/CMakeLists.txt @@ -24,4 +24,4 @@ target_link_libraries(azure-security-keyvault-common-test PUBLIC azure-security- # gtest_add_tests will scan the test from azure-core-test and call add_test # for each test to ctest. This enables `ctest -r` to run specific tests directly. gtest_add_tests(TARGET azure-security-keyvault-common-test - TEST_PREFIX azure-security-keyvault-common-test.) + TEST_PREFIX azure-security-keyvault-common-unittest.) diff --git a/sdk/keyvault/azure-security-keyvault-keys/inc/azure/keyvault/key_vault.hpp b/sdk/keyvault/azure-security-keyvault-keys/inc/azure/keyvault/key_vault.hpp index 16fb4ff6a..0186be601 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/inc/azure/keyvault/key_vault.hpp +++ b/sdk/keyvault/azure-security-keyvault-keys/inc/azure/keyvault/key_vault.hpp @@ -4,4 +4,11 @@ #pragma once #include "azure/keyvault/keys/dll_import_export.hpp" +#include "azure/keyvault/keys/json_web_key.hpp" #include "azure/keyvault/keys/key_client.hpp" +#include "azure/keyvault/keys/key_client_options.hpp" +#include "azure/keyvault/keys/key_operation.hpp" +#include "azure/keyvault/keys/key_properties.hpp" +#include "azure/keyvault/keys/key_release_policy.hpp" +#include "azure/keyvault/keys/key_type.hpp" +#include "azure/keyvault/keys/key_vault_key.hpp" diff --git a/sdk/keyvault/azure-security-keyvault-keys/test/CMakeLists.txt b/sdk/keyvault/azure-security-keyvault-keys/test/CMakeLists.txt index f038e2f37..83af55f4e 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/test/CMakeLists.txt +++ b/sdk/keyvault/azure-security-keyvault-keys/test/CMakeLists.txt @@ -9,6 +9,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) include(GoogleTest) +################## Unit Tests ########################## add_executable ( azure-security-keyvault-keys-test key_client_test.cpp @@ -24,4 +25,23 @@ target_link_libraries(azure-security-keyvault-keys-test PRIVATE azure-security-k # gtest_add_tests will scan the test from azure-core-test and call add_test # for each test to ctest. This enables `ctest -r` to run specific tests directly. gtest_add_tests(TARGET azure-security-keyvault-keys-test - TEST_PREFIX azure-security-keyvault-keys-test.) + TEST_PREFIX azure-security-keyvault-keys-unittest.) + + +################## Live Tests ########################## +add_executable ( + azure-security-keyvault-keys-test-live + key_client_test_live.cpp + main.cpp +) + +if (MSVC) + target_compile_options(azure-security-keyvault-keys-test-live PUBLIC /wd6326 /wd26495 /wd26812) +endif() + +target_link_libraries(azure-security-keyvault-keys-test-live PRIVATE azure-security-keyvault-keys azure-identity gtest gmock) + +# gtest_add_tests will scan the test from azure-core-test and call add_test +# for each test to ctest. This enables `ctest -r` to run specific tests directly. +gtest_add_tests(TARGET azure-security-keyvault-keys-test-live + TEST_PREFIX azure-security-keyvault-keys-livetest.) diff --git a/sdk/keyvault/azure-security-keyvault-keys/test/key_client_base_test.hpp b/sdk/keyvault/azure-security-keyvault-keys/test/key_client_base_test.hpp new file mode 100644 index 000000000..4617f2c4c --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-keys/test/key_client_base_test.hpp @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// SPDX-License-Identifier: MIT + +/** + * @file + * @brief The base class to construct and init a Key Vault client. + * + */ + +#include + +#include +#include +#include + +#include + +namespace Azure { namespace Security { namespace KeyVault { namespace Keys { namespace Test { + + class KeyVaultClientTest : public ::testing::Test { + protected: + std::shared_ptr m_credential; + std::string m_keyVaultUrl; + std::unique_ptr m_client; + + // Create + virtual void SetUp() override + { + std::string tenantId = std::getenv("AZURE_TENANT_ID"); + std::string clientId = std::getenv("AZURE_CLIENT_ID"); + std::string secretId = std::getenv("AZURE_CLIENT_SECRET"); + m_credential + = std::make_shared(tenantId, clientId, secretId); + + m_keyVaultUrl = std::getenv("AZURE_KEYVAULT_URL"); + } + }; + +}}}}} // namespace Azure::Security::KeyVault::Keys::Test diff --git a/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test.cpp b/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test.cpp index c33a62d1b..79efed01a 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test.cpp +++ b/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test.cpp @@ -15,17 +15,12 @@ TEST(KeyClient, initClient) { auto credential = std::make_shared("tenantID", "AppId", "SecretId"); - EXPECT_NO_THROW(KeyClient keyClient("vaultUrl", credential)); -} - -TEST(KeyClient, DISABLED_SendRequestDefault) -{ - auto credential - = std::make_shared("tenantID", "AppId", "SecretId"); - KeyClient keyClient("vaultUrl", credential); - auto r = keyClient.GetKey("KeyName"); - auto t = r.ExtractValue(); - auto rr = r.ExtractRawResponse(); - - EXPECT_EQ(t.Name(), "KeyName"); + { + EXPECT_NO_THROW(KeyClient keyClient("vaultUrl", credential)); + } + { + KeyClientOptions options; + options.RetryOptions.MaxRetries = 10; + EXPECT_NO_THROW(KeyClient keyClient("vaultUrl", credential)); + } } diff --git a/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test_live.cpp b/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test_live.cpp new file mode 100644 index 000000000..310185035 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-keys/test/key_client_test_live.cpp @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// SPDX-License-Identifier: MIT + +#if defined(_MSC_VER) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "gtest/gtest.h" + +#include "key_client_base_test.hpp" + +#include + +#include + +using namespace Azure::Security::KeyVault::Keys::Test; + +TEST_F(KeyVaultClientTest, GetKey) +{ + Azure::Security::KeyVault::Keys::KeyClient keyClient(m_keyVaultUrl, m_credential); + // Assuming and RS Key exists in the KeyVault Account. + std::string keyName("testKey"); + + auto r = keyClient.GetKey(keyName); + auto key = r.ExtractValue(); + + EXPECT_EQ(key.Name(), keyName); + EXPECT_EQ(key.GetKeyType(), Azure::Security::KeyVault::Keys::KeyTypeEnum::Rsa); +} diff --git a/sdk/keyvault/azure-security-keyvault-keys/test/main.cpp b/sdk/keyvault/azure-security-keyvault-keys/test/main.cpp index 3d0b851aa..197a409dc 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/test/main.cpp +++ b/sdk/keyvault/azure-security-keyvault-keys/test/main.cpp @@ -3,9 +3,22 @@ #include "gtest/gtest.h" +#if defined(BUILD_CURL_HTTP_TRANSPORT_ADAPTER) +#include +#endif + int main(int argc, char** argv) { +#if defined(BUILD_CURL_HTTP_TRANSPORT_ADAPTER) + curl_global_init(CURL_GLOBAL_ALL); +#endif + testing::InitGoogleTest(&argc, argv); auto r = RUN_ALL_TESTS(); + +#if defined(BUILD_CURL_HTTP_TRANSPORT_ADAPTER) + // Can't call global cleanup due to: https://github.com/Azure/azure-sdk-for-cpp/issues/1499 + // curl_global_cleanup(); +#endif return r; } diff --git a/sdk/keyvault/ci.yml b/sdk/keyvault/ci.yml index 6c4792c3d..cd6fc7e63 100644 --- a/sdk/keyvault/ci.yml +++ b/sdk/keyvault/ci.yml @@ -33,9 +33,9 @@ stages: - template: ../../eng/pipelines/templates/stages/archetype-sdk-client.yml parameters: ServiceDirectory: keyvault - CtestRegex: azure-security-keyvault - LiveTestCtestRegex: live-azure-security-keyvault - SubscriptionConfiguration: $(sub-config-azure-cloud-test-resources-preview) + CtestRegex: "azure-security-keyvault.*-unittest" + LiveTestCtestRegex: "azure-security-keyvault.*-livetest" + SubscriptionConfiguration: $(sub-config-azure-cloud-test-resources) Artifacts: - Name: azure-security-keyvault-common Path: azure-security-keyvault-common diff --git a/sdk/keyvault/test-resources.json b/sdk/keyvault/test-resources.json index 8e498ed72..583611ea4 100644 --- a/sdk/keyvault/test-resources.json +++ b/sdk/keyvault/test-resources.json @@ -9,6 +9,13 @@ "description": "The base resource name." } }, + "keyName": { + "type": "string", + "defaultValue": "testKey", + "metadata": { + "description": "The initial key in the keys." + } + }, "tenantId": { "type": "string", "defaultValue": "72f988bf-86f1-41af-91ab-2d7cd011db47", @@ -16,6 +23,18 @@ "description": "The tenant ID to which the application and resources belong." } }, + "testApplicationId": { + "type": "string", + "metadata": { + "description": "The application client ID used to run tests." + } + }, + "testApplicationSecret": { + "type": "string", + "metadata": { + "description": "The application client secret used to run tests." + } + }, "testApplicationOid": { "type": "string", "defaultValue": "b3653439-8136-4cd5-aac3-2a9460871ca6", @@ -30,26 +49,6 @@ "description": "The location of the resource. By default, this is the same as the resource group." } }, - "hsmLocation": { - "type": "string", - "defaultValue": "southcentralus", - "allowedValues": [ - "eastus2", - "southcentralus", - "northeurope", - "westeurope" - ], - "metadata": { - "description": "The location of the Managed HSM. By default, this is 'southcentralus'." - } - }, - "enableHsm": { - "type": "bool", - "defaultValue": false, - "metadata": { - "description": "Whether to enable deployment of Managed HSM. The default is false." - } - }, "enableSoftDelete": { "type": "bool", "defaultValue": true, @@ -70,34 +69,43 @@ "metadata": { "description": "Key Vault SKU to deploy. The default is 'premium'" } + }, + "keyType": { + "type": "string", + "defaultValue": "RSA", + "metadata": { + "description": "The JsonWebKeyType of the key to be created." + } + }, + "keyOps": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "The permitted JSON web key operations of the key to be created." + } + }, + "keySize": { + "type": "int", + "defaultValue": 2048, + "metadata": { + "description": "The size in bits of the key to be created." + } + }, + "curveName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "The JsonWebKeyCurveName of the key to be created." + } } }, "variables": { - "azureKeyVaultUrl": "[format('https://{0}{1}', parameters('baseName'), parameters('keyVaultDomainSuffix'))]", - "hsmApiVersion": "2020-04-01-preview", - "hsmName": "[concat(parameters('baseName'), 'hsm')]", - "mgmtApiVersion": "2019-04-01", - "blobContainerName": "backup", - "primaryAccountName": "[concat(parameters('baseName'), 'prim')]", - "encryption": { - "services": { - "blob": { - "enabled": true - } - }, - "keySource": "Microsoft.Storage" - }, - "networkAcls": { - "bypass": "AzureServices", - "virtualNetworkRules": [], - "ipRules": [], - "defaultAction": "Allow" - } + "azureKeyVaultUrl": "[format('https://{0}{1}', parameters('baseName'), parameters('keyVaultDomainSuffix'))]" }, "resources": [ { "type": "Microsoft.KeyVault/vaults", - "apiVersion": "2016-10-01", + "apiVersion": "2019-09-01", "name": "[parameters('baseName')]", "location": "[parameters('location')]", "properties": { @@ -167,71 +175,18 @@ } }, { - "type": "Microsoft.KeyVault/managedHSMs", - "apiVersion": "[variables('hsmApiVersion')]", - "name": "[variables('hsmName')]", - "condition": "[parameters('enableHsm')]", - "location": "[parameters('hsmLocation')]", - "sku": { - "family": "B", - "name": "Standard_B1" - }, - "properties": { - "tenantId": "[parameters('tenantId')]", - "initialAdminObjectIds": [ - "[parameters('testApplicationOid')]" - ], - "enablePurgeProtection": false, - "enableSoftDelete": "[parameters('enableSoftDelete')]" - } - }, - { - "type": "Microsoft.Storage/storageAccounts", - "apiVersion": "[variables('mgmtApiVersion')]", - "name": "[variables('primaryAccountName')]", + "type": "Microsoft.KeyVault/vaults/keys", + "apiVersion": "2019-09-01", + "name": "[concat(parameters('baseName'), '/', parameters('keyName'))]", "location": "[parameters('location')]", - "sku": { - "name": "Standard_RAGRS", - "tier": "Standard" - }, - "kind": "StorageV2", - "properties": { - "networkAcls": "[variables('networkAcls')]", - "supportsHttpsTrafficOnly": true, - "encryption": "[variables('encryption')]", - "accessTier": "Hot" - } - }, - { - "type": "Microsoft.Storage/storageAccounts/blobServices", - "apiVersion": "2019-06-01", - "name": "[concat(variables('primaryAccountName'), '/default')]", "dependsOn": [ - "[resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName'))]" - ], - "sku": { - "name": "Standard_RAGRS", - "tier": "Standard" - }, - "properties": { - "cors": { - "corsRules": [] - }, - "deleteRetentionPolicy": { - "enabled": false - } - } - }, - { - "type": "Microsoft.Storage/storageAccounts/blobServices/containers", - "apiVersion": "2019-06-01", - "name": "[concat(variables('primaryAccountName'), '/default/', variables('blobContainerName'))]", - "dependsOn": [ - "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('primaryAccountName'), 'default')]", - "[resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName'))]" + "[resourceId('Microsoft.KeyVault/vaults', parameters('baseName'))]" ], "properties": { - "publicAccess": "None" + "kty": "[parameters('keyType')]", + "keyOps": "[parameters('keyOps')]", + "keySize": "[parameters('keySize')]", + "curveName": "[parameters('curveName')]" } } ], @@ -240,10 +195,17 @@ "type": "string", "value": "[variables('azureKeyVaultUrl')]" }, - "AZURE_MANAGEDHSM_URL": { + "AZURE_TENANT_ID": { "type": "string", - "condition": "[parameters('enableHsm')]", - "value": "[reference(variables('hsmName')).hsmUri]" + "value": "[parameters('tenantId')]" + }, + "AZURE_CLIENT_ID": { + "type": "string", + "value": "[parameters('testApplicationId')]" + }, + "AZURE_CLIENT_SECRET": { + "type": "string", + "value": "[parameters('testApplicationSecret')]" }, "KEYVAULT_SKU": { "type": "string", @@ -252,18 +214,6 @@ "CLIENT_OBJECTID": { "type": "string", "value": "[parameters('testApplicationOid')]" - }, - "BLOB_STORAGE_ACCOUNT_NAME": { - "type": "string", - "value": "[variables('primaryAccountName')]" - }, - "BLOB_PRIMARY_STORAGE_ACCOUNT_KEY": { - "type": "string", - "value": "[listKeys(variables('primaryAccountName'), variables('mgmtApiVersion')).keys[0].value]" - }, - "BLOB_CONTAINER_NAME": { - "type": "string", - "value": "[variables('blobContainerName')]" } } }