First cut at removing proxy tests (#4416)
* FIrst cut at removing proxy tests Changed the proxy tests from opt-out to opt-in so they're disabled by default. Removed lines enabling proxy from ci.yml file.
This commit is contained in:
parent
6706c20b26
commit
d8f6aa9d27
@ -7,10 +7,20 @@
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "-DINSTALL_GTEST=OFF -DBUILD_TESTING=ON -DBUILD_TRANSPORT_CURL=ON -DBUILD_SAMPLES=ON -DBUILD_PERFORMANCE_TESTS=ON",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "-v",
|
||||
"ctestCommandArgs": "",
|
||||
"variables": [
|
||||
{
|
||||
"name": "INSTALL_GTEST",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_TESTING",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "VCPKG_TARGET_TRIPLET",
|
||||
"value": "x64-windows-static",
|
||||
@ -25,6 +35,26 @@
|
||||
"name": "VCPKG_MANIFEST_MODE",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_TRANSPORT_CURL",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_SAMPLES",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_PERFORMANCE_TESTS",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -74,6 +104,11 @@
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_SAMPLES",
|
||||
"value": "True",
|
||||
@ -101,6 +136,11 @@
|
||||
"name": "MSVC_USE_STATIC_CRT",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -129,6 +169,11 @@
|
||||
"name": "MSVC_USE_STATIC_CRT",
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -154,8 +199,8 @@
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "DISABLE_PROXY_TESTS",
|
||||
"value": "True",
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
@ -220,6 +265,11 @@
|
||||
"name": "BUILD_PERFORMANCE_TESTS",
|
||||
"value": "true",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -239,6 +289,11 @@
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_TRANSPORT_CURL",
|
||||
"value": "True",
|
||||
@ -287,6 +342,11 @@
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_TRANSPORT_CURL",
|
||||
"value": "True",
|
||||
@ -325,6 +385,11 @@
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_TRANSPORT_CURL",
|
||||
"value": "True",
|
||||
@ -367,6 +432,11 @@
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_SAMPLES",
|
||||
"value": "True",
|
||||
@ -419,6 +489,11 @@
|
||||
"value": "True",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_PROXY_TESTS",
|
||||
"value": "False",
|
||||
"type": "BOOL"
|
||||
},
|
||||
{
|
||||
"name": "BUILD_SAMPLES",
|
||||
"value": "True",
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
"Pool": "Azure Pipelines",
|
||||
"BuildArgs": "-j 10",
|
||||
"VCPKG_DEFAULT_TRIPLET": "x64-osx",
|
||||
"CmakeArgs": " -DBUILD_TESTING=ON -DDISABLE_PROXY_TESTS=ON -DBUILD_PERFORMANCE_TESTS=ON -DRUN_LONG_UNIT_TESTS=ON -DBUILD_TRANSPORT_CURL=ON",
|
||||
"CmakeArgs": " -DBUILD_TESTING=ON -DENABLE_PROXY_TESTS=OFF -DBUILD_PERFORMANCE_TESTS=ON -DRUN_LONG_UNIT_TESTS=ON -DBUILD_TRANSPORT_CURL=ON",
|
||||
"PublishMapFiles": "true"
|
||||
}
|
||||
},
|
||||
@ -59,7 +59,7 @@
|
||||
"CmakeArgs": " -DBUILD_TRANSPORT_CURL=ON"
|
||||
},
|
||||
"Win32Api_release_curl": {
|
||||
"CmakeArgs": " -DBUILD_TESTING=ON -DDISABLE_PROXY_TESTS=ON -DBUILD_PERFORMANCE_TESTS=ON -DRUN_LONG_UNIT_TESTS=ON -DBUILD_TRANSPORT_CURL=ON -DMSVC_USE_STATIC_CRT=ON ",
|
||||
"CmakeArgs": " -DBUILD_TESTING=ON -DENABLE_PROXY_TESTS=OFF -DBUILD_PERFORMANCE_TESTS=ON -DRUN_LONG_UNIT_TESTS=ON -DBUILD_TRANSPORT_CURL=ON -DMSVC_USE_STATIC_CRT=ON ",
|
||||
"BuildArgs": "--parallel 8 --config Release",
|
||||
"PublishMapFiles": "true"
|
||||
}
|
||||
|
||||
@ -5,9 +5,11 @@ cmake_minimum_required (VERSION 3.13)
|
||||
|
||||
set(azure-core-test)
|
||||
|
||||
# Create test data for FileUpload test (100K) by writing 1K * 100 times
|
||||
# Create test data for FileUpload test (100K) by writing 100 * 1000 times
|
||||
set(RANGE 0)
|
||||
#cSpell:disable
|
||||
set(1K "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
|
||||
#cSpell:enable
|
||||
file(WRITE ${CMAKE_BINARY_DIR}/fileData "")
|
||||
while(RANGE LESS 100)
|
||||
file(APPEND ${CMAKE_BINARY_DIR}/fileData "${1K}")
|
||||
@ -109,6 +111,11 @@ if (DISABLE_PROXY_TESTS)
|
||||
add_compile_definitions(DISABLE_PROXY_TESTS)
|
||||
endif()
|
||||
|
||||
if (ENABLE_PROXY_TESTS)
|
||||
message(STATUS "Enabling proxy tests." )
|
||||
add_compile_definitions(ENABLE_PROXY_TESTS)
|
||||
endif()
|
||||
|
||||
# If the System.TeamProjectId ADO variable is set, we are running in the pipeline, behave accordingly.
|
||||
if (ENV{SYSTEM_TEAMPROJECTID})
|
||||
add_compile_definitions(IN_CI_PIPELINE)
|
||||
|
||||
@ -87,7 +87,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
static void checkResponseCode(
|
||||
Azure::Core::Http::HttpStatusCode code,
|
||||
Azure::Core::Http::HttpStatusCode expectedCode = Azure::Core::Http::HttpStatusCode::Ok);
|
||||
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
std::string HttpProxyServer()
|
||||
{
|
||||
std::string proxyUrl{Azure::Core::_internal::Environment::GetVariable("SQUID_PROXY_URL")};
|
||||
@ -107,6 +107,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
}
|
||||
return proxyUrl;
|
||||
}
|
||||
#endif
|
||||
std::string TestProxyUrl()
|
||||
{
|
||||
std::string proxyUrl{Azure::Core::_internal::Environment::GetVariable("PROXY_URL")};
|
||||
@ -116,20 +117,23 @@ namespace Azure { namespace Core { namespace Test {
|
||||
}
|
||||
return proxyUrl;
|
||||
}
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
static bool ProxyStatusChecked;
|
||||
static bool IsSquidProxyRunning;
|
||||
#endif
|
||||
static bool IsTestProxyRunning;
|
||||
|
||||
protected:
|
||||
// Create
|
||||
virtual void SetUp() override
|
||||
{
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
#if defined(IN_CI_PIPELINE)
|
||||
// If we're in the CI pipeline, don't probe for the squid or test proxy running - just assume
|
||||
// they are.
|
||||
// If we're in the CI pipeline, don't probe for the squid or test proxy running - just
|
||||
// assume they are.
|
||||
IsSquidProxyRunning = true;
|
||||
IsTestProxyRunning = true;
|
||||
#else // !defined(IN_CI_PIPELINE)
|
||||
IsTestProxyRunning = true;
|
||||
if (!ProxyStatusChecked)
|
||||
{
|
||||
Azure::Core::Http::Policies::TransportOptions options;
|
||||
@ -177,10 +181,13 @@ namespace Azure { namespace Core { namespace Test {
|
||||
ProxyStatusChecked = true;
|
||||
}
|
||||
#endif
|
||||
#endif // ENABLE_PROXY_TESTS
|
||||
}
|
||||
};
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
bool TransportAdapterOptions::ProxyStatusChecked{false};
|
||||
bool TransportAdapterOptions::IsSquidProxyRunning{false};
|
||||
#endif
|
||||
bool TransportAdapterOptions::IsTestProxyRunning{false};
|
||||
|
||||
void TransportAdapterOptions::checkResponseCode(
|
||||
@ -272,7 +279,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
using namespace Azure::Core::Http::_internal;
|
||||
using namespace Azure::Core::Http::Policies::_internal;
|
||||
|
||||
#if !defined(DISABLE_PROXY_TESTS)
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
// constexpr char SocksProxyServer[] = "socks://98.162.96.41:4145";
|
||||
TEST_F(TransportAdapterOptions, SimpleProxyTests)
|
||||
{
|
||||
@ -416,7 +423,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
}
|
||||
}
|
||||
|
||||
#endif // defined(DISABLE_PROXY_TESTS)
|
||||
#endif // defined(ENABLE_PROXY_TESTS)
|
||||
|
||||
TEST_F(TransportAdapterOptions, DisableCrlValidation)
|
||||
{
|
||||
@ -435,7 +442,7 @@ namespace Azure { namespace Core { namespace Test {
|
||||
auto response = pipeline.Send(request, Azure::Core::Context::ApplicationContext);
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
}
|
||||
#if !defined(DISABLE_PROXY_TESTS)
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
if (IsSquidProxyRunning)
|
||||
{
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
@ -524,396 +531,402 @@ namespace Azure { namespace Core { namespace Test {
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_F(TransportAdapterOptions, MultipleCrlOperations)
|
||||
{
|
||||
// LetsEncrypt certificates don't contain a distribution point URL extension. While this seems
|
||||
// to work when run locally, it fails in the CI pipeline. "https://www.wikipedia.org" uses a
|
||||
// LetsEncrypt certificate, so when testing manually, it is important to add it to the list.
|
||||
std::vector<std::string> testUrls{
|
||||
AzureSdkHttpbinServer::Get(), // Uses a Microsoft/DigiCert certificate.
|
||||
"https://aws.amazon.com", // Uses a Amazon/Starfield Technologies certificate.
|
||||
"https://www.example.com/", // Uses a DigiCert certificate.
|
||||
"https://www.google.com/", // Uses a google certificate.
|
||||
};
|
||||
|
||||
GTEST_LOG_(INFO) << "Basic test calls.";
|
||||
// Not strictly a proxy test, but this test case has been unreliable over time.
|
||||
#if defined(ENABLE_PROXY_TESTS)
|
||||
TEST_F(TransportAdapterOptions, MultipleCrlOperations)
|
||||
{
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
// LetsEncrypt certificates don't contain a distribution point URL extension. While this seems
|
||||
// to work when run locally, it fails in the CI pipeline. "https://www.wikipedia.org" uses a
|
||||
// LetsEncrypt certificate, so when testing manually, it is important to add it to the list.
|
||||
std::vector<std::string> testUrls{
|
||||
AzureSdkHttpbinServer::Get(), // Uses a Microsoft/DigiCert certificate.
|
||||
"https://aws.amazon.com", // Uses a Amazon/Starfield Technologies certificate.
|
||||
"https://www.example.com/", // Uses a DigiCert certificate.
|
||||
"https://www.google.com/", // Uses a google certificate.
|
||||
};
|
||||
|
||||
// FIrst verify connectivity to the test servers.
|
||||
transportOptions.EnableCertificateRevocationListCheck = false;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
for (auto const& target : testUrls)
|
||||
GTEST_LOG_(INFO) << "Basic test calls.";
|
||||
{
|
||||
GTEST_LOG_(INFO) << "Test " << target;
|
||||
Azure::Core::Url url(target);
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> response;
|
||||
EXPECT_NO_THROW(
|
||||
response = pipeline.Send(request, Azure::Core::Context::ApplicationContext));
|
||||
if (response && response->GetStatusCode() != Azure::Core::Http::HttpStatusCode::Found)
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// FIrst verify connectivity to the test servers.
|
||||
transportOptions.EnableCertificateRevocationListCheck = false;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
for (auto const& target : testUrls)
|
||||
{
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
GTEST_LOG_(INFO) << "Test " << target;
|
||||
Azure::Core::Url url(target);
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> response;
|
||||
EXPECT_NO_THROW(
|
||||
response = pipeline.Send(request, Azure::Core::Context::ApplicationContext));
|
||||
if (response && response->GetStatusCode() != Azure::Core::Http::HttpStatusCode::Found)
|
||||
{
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now verify that once we enable CRL checks, we can still access the URLs.
|
||||
GTEST_LOG_(INFO) << "Test with CRL checks enabled";
|
||||
{
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// Note that the default is to *disable* CRL checks, because they are disabled
|
||||
// by default. So we test *enabling* CRL validation checks.
|
||||
transportOptions.EnableCertificateRevocationListCheck = true;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
for (auto const& target : testUrls)
|
||||
// Now verify that once we enable CRL checks, we can still access the URLs.
|
||||
GTEST_LOG_(INFO) << "Test with CRL checks enabled";
|
||||
{
|
||||
GTEST_LOG_(INFO) << "Test " << target;
|
||||
Azure::Core::Url url(target);
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> response;
|
||||
EXPECT_NO_THROW(
|
||||
response = pipeline.Send(request, Azure::Core::Context::ApplicationContext));
|
||||
if (response && response->GetStatusCode() != Azure::Core::Http::HttpStatusCode::Found)
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// Note that the default is to *disable* CRL checks, because they are disabled
|
||||
// by default. So we test *enabling* CRL validation checks.
|
||||
transportOptions.EnableCertificateRevocationListCheck = true;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
for (auto const& target : testUrls)
|
||||
{
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
GTEST_LOG_(INFO) << "Test " << target;
|
||||
Azure::Core::Url url(target);
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> response;
|
||||
EXPECT_NO_THROW(
|
||||
response = pipeline.Send(request, Azure::Core::Context::ApplicationContext));
|
||||
if (response && response->GetStatusCode() != Azure::Core::Http::HttpStatusCode::Found)
|
||||
{
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now verify that once we enable CRL checks, we can still access the URLs.
|
||||
GTEST_LOG_(INFO) << "Test with CRL checks enabled. Iteration 2.";
|
||||
{
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// Note that the default is to *disable* CRL checks, because they are disabled
|
||||
// by default. So we test *enabling* CRL validation checks.
|
||||
transportOptions.EnableCertificateRevocationListCheck = true;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
for (auto const& target : testUrls)
|
||||
// Now verify that once we enable CRL checks, we can still access the URLs.
|
||||
GTEST_LOG_(INFO) << "Test with CRL checks enabled. Iteration 2.";
|
||||
{
|
||||
GTEST_LOG_(INFO) << "Test " << target;
|
||||
Azure::Core::Url url(target);
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> response;
|
||||
EXPECT_NO_THROW(
|
||||
response = pipeline.Send(request, Azure::Core::Context::ApplicationContext));
|
||||
if (response && response->GetStatusCode() != Azure::Core::Http::HttpStatusCode::Found)
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// Note that the default is to *disable* CRL checks, because they are disabled
|
||||
// by default. So we test *enabling* CRL validation checks.
|
||||
transportOptions.EnableCertificateRevocationListCheck = true;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
for (auto const& target : testUrls)
|
||||
{
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
GTEST_LOG_(INFO) << "Test " << target;
|
||||
Azure::Core::Url url(target);
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
std::unique_ptr<Azure::Core::Http::RawResponse> response;
|
||||
EXPECT_NO_THROW(
|
||||
response = pipeline.Send(request, Azure::Core::Context::ApplicationContext));
|
||||
if (response && response->GetStatusCode() != Azure::Core::Http::HttpStatusCode::Found)
|
||||
{
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(TransportAdapterOptions, TestRootCertificate)
|
||||
{
|
||||
// On Windows and OSX, setting a root certificate disables the default system certificate
|
||||
// store. That means that if we set the expected certificate, we won't be able to connect to
|
||||
// the server because the certificates root CA is not in the store.
|
||||
#if defined(AZ_PLATFORM_LINUX)
|
||||
// cspell:disable
|
||||
std::string azurewebsitesCertificate
|
||||
= "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh"
|
||||
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3"
|
||||
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH"
|
||||
"MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT"
|
||||
"MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv"
|
||||
"c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD"
|
||||
"ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr"
|
||||
"RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n"
|
||||
"l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm"
|
||||
"GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR"
|
||||
"EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb"
|
||||
"OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo"
|
||||
"o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO"
|
||||
"4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4"
|
||||
"7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj"
|
||||
"WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR"
|
||||
"GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB"
|
||||
"AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j"
|
||||
"BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud"
|
||||
"JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG"
|
||||
"CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu"
|
||||
"Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln"
|
||||
"aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j"
|
||||
"cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG"
|
||||
"MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j"
|
||||
"cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD"
|
||||
"AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA"
|
||||
"WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs"
|
||||
"K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa"
|
||||
"+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl"
|
||||
"Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J"
|
||||
"+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh";
|
||||
// cspell:enable
|
||||
|
||||
{
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// Note that the default is to *disable* CRL checks, because they are disabled
|
||||
// by default. So we test *enabling* CRL validation checks.
|
||||
transportOptions.ExpectedTlsRootCertificate = azurewebsitesCertificate;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
Azure::Core::Url url(AzureSdkHttpbinServer::Get());
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
auto response = pipeline.Send(request, Azure::Core::Context::ApplicationContext);
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
const std::string TestProxyHttpsCertificate =
|
||||
TEST_F(TransportAdapterOptions, TestRootCertificate)
|
||||
{
|
||||
// On Windows and OSX, setting a root certificate disables the default system certificate
|
||||
// store. That means that if we set the expected certificate, we won't be able to connect to
|
||||
// the server because the certificates root CA is not in the store.
|
||||
#if defined(AZ_PLATFORM_LINUX)
|
||||
// cspell:disable
|
||||
"MIIDSDCCAjCgAwIBAgIUIoKu8Oao7j10TLNxaUG2Bs0FrRwwDQYJKoZIhvcNAQEL"
|
||||
"BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgwNTIxMTcyM1oXDTIzMDgw"
|
||||
"NTIxMTcyM1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF"
|
||||
"AAOCAQ8AMIIBCgKCAQEA0UPG7ER++5/9D/qa4SCtt7QvdHwcpidbwktPNU8iRW7V"
|
||||
"pIDPWS4goLp/+7+maT0Z/mqwSO3JDtm/dtdlr3F/5EMgyUExnYcvUixZAiyFyEwj"
|
||||
"j6wnAtNvqsg4rDqBlD17fuqTVsZm9Yo7QYub6p5PeznWYucOxRrczqFCiW4uj0Yk"
|
||||
"GgUHPPmCvhSDKowV8CYRHfkD6R8R4SFkoP3/uejXHxeXoYJNMWq5K0GqGaOZtNFB"
|
||||
"F7QWZHoLrRpZcY4h+DxwP3c+/FdlVcs9nstkF+EnTnwx5IRyKsaWb/pUEmYKvNDz"
|
||||
"wi6qnRUdu+DghZuvyZZDgwoYrSZokcbKumk0MsLC3QIDAQABo4GRMIGOMA8GA1Ud"
|
||||
"EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGmMBYGA1UdJQEB/wQMMAoGCCsGAQUF"
|
||||
"BwMBMBcGA1UdEQEB/wQNMAuCCWxvY2FsaG9zdDA6BgorBgEEAYI3VAEBBCwMKkFT"
|
||||
"UC5ORVQgQ29yZSBIVFRQUyBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0ZTANBgkqhkiG"
|
||||
"9w0BAQsFAAOCAQEARX4NxGbycdPVuqvu/CO+/LpWrEm1OcOl7N57/mD5npTIJT78"
|
||||
"TYtXk1J61akumKdf5CaBgCDRcl35LhioFZIMEsiOidffAp6t493xocncFBhIYYrZ"
|
||||
"HS6aKsZKPu8h3wOLpYu+zh7f0Hx6pkHPAfw4+knmQjDYomz/hTwuo/MuT8k6Ee7B"
|
||||
"NGWqxUamLI8bucuf2ZfT1XOq83uWaFF5KwAuVLhpzo39/TmPyYGnaoKRYf9QjabS"
|
||||
"LUjecMNLJFWHUSD4cKHvXJjDYZEiCiy+MdUDytWIsfw0fzAUjz9Qaz8YpZ+fXufM"
|
||||
"MNMNfyJHSMEMFIT2D1UaQiwryXWQWJ93OiSdjA==";
|
||||
std::string azurewebsitesCertificate
|
||||
= "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh"
|
||||
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3"
|
||||
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH"
|
||||
"MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT"
|
||||
"MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv"
|
||||
"c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD"
|
||||
"ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr"
|
||||
"RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n"
|
||||
"l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm"
|
||||
"GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR"
|
||||
"EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb"
|
||||
"OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo"
|
||||
"o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO"
|
||||
"4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4"
|
||||
"7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj"
|
||||
"WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR"
|
||||
"GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB"
|
||||
"AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j"
|
||||
"BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud"
|
||||
"JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG"
|
||||
"CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu"
|
||||
"Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln"
|
||||
"aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j"
|
||||
"cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG"
|
||||
"MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j"
|
||||
"cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD"
|
||||
"AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA"
|
||||
"WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs"
|
||||
"K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa"
|
||||
"+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl"
|
||||
"Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J"
|
||||
"+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh";
|
||||
// cspell:enable
|
||||
|
||||
const std::string InvalidTestProxyHttpsCertificate
|
||||
= "MIIIujCCBqKgAwIBAgITMwAxS6DhmVCLBf6MWwAAADFLoDANBgkqhkiG9w0BAQwF"
|
||||
"ADBZMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u"
|
||||
"MSowKAYDVQQDEyFNaWNyb3NvZnQgQXp1cmUgVExTIElzc3VpbmcgQ0EgMDEwHhcN"
|
||||
"MjIwMzE0MTgzOTU1WhcNMjMwMzA5MTgzOTU1WjBqMQswCQYDVQQGEwJVUzELMAkG"
|
||||
"A1UECBMCV0ExEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD"
|
||||
"b3Jwb3JhdGlvbjEcMBoGA1UEAwwTKi5henVyZXdlYnNpdGVzLm5ldDCCASIwDQYJ"
|
||||
"KoZIhvcNAQEBBQADggEPADCCAQoCggEBAM3heDMqn7v8cmh4A9vECuEfuiUnKBIw"
|
||||
"7y0Sf499Z7WW92HDkIvV3eJ6jcyq41f2UJcG8ivCu30eMnYyyI+aRHIedkvOBA2i"
|
||||
"PqG78e99qGTuKCj9lrJGVfeTBJ1VIlPvfuHFv/3JaKIBpRtuqxCdlgsGAJQmvHEn"
|
||||
"vIHUV2jgj4iWNBDoC83ShtWg6qV2ol7yiaClB20Af5byo36jVdMN6vS+/othn3jG"
|
||||
"pn+NP00DWYbP5y4qhs5XLH9wQZaTUPKIaUxmHewErcM0rMAaWl8wMqQTeNYf3l5D"
|
||||
"ax50yuEg9VVjtbDdSmvOkslGpVqsOl1NrmyN7gCvcvcRUQcxIiXJQc0CAwEAAaOC"
|
||||
"BGgwggRkMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgCt9776fP8QyIudPZwe"
|
||||
"PhhqtGcpXc+xDCTKhYY069yCigAAAX+Jw/reAAAEAwBHMEUCIE8AAjvwO4AffPn7"
|
||||
"un67WykJ2hGB4n8qJE7pk4QYjWW+AiEA/pio1E9ALt30Kh/Ga4gRefH1ILbQ8n4h"
|
||||
"bHFatezIcvYAdwB6MoxU2LcttiDqOOBSHumEFnAyE4VNO9IrwTpXo1LrUgAAAX+J"
|
||||
"w/qlAAAEAwBIMEYCIQCdbj6FOX6wK+dLoqjWKuCgkKSsZsJKpVik6HjlRgomzQIh"
|
||||
"AM7mYp5dBFmNLas3fFcP0rMMK+17n8u0GhFH2KpkPr1SAHYA6D7Q2j71BjUy51co"
|
||||
"vIlryQPTy9ERa+zraeF3fW0GvW4AAAF/icP6jgAABAMARzBFAiAhjTz3PBjqRrpY"
|
||||
"eH7us44lESC7c0dzdTcehTeAwmEyrgIhAOCaqmqA+ercv+39jzFWkctG36bazRFX"
|
||||
"4gGNiKU0bctcMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwIwCgYIKwYBBQUH"
|
||||
"AwEwPAYJKwYBBAGCNxUHBC8wLQYlKwYBBAGCNxUIh73XG4Hn60aCgZ0ujtAMh/Da"
|
||||
"HV2ChOVpgvOnPgIBZAIBJTCBrgYIKwYBBQUHAQEEgaEwgZ4wbQYIKwYBBQUHMAKG"
|
||||
"YWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0"
|
||||
"JTIwQXp1cmUlMjBUTFMlMjBJc3N1aW5nJTIwQ0ElMjAwMSUyMC0lMjB4c2lnbi5j"
|
||||
"cnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2Nz"
|
||||
"cDAdBgNVHQ4EFgQUiiks5RXI6IIQccflfDtgAHndN7owDgYDVR0PAQH/BAQDAgSw"
|
||||
"MHwGA1UdEQR1MHOCEyouYXp1cmV3ZWJzaXRlcy5uZXSCFyouc2NtLmF6dXJld2Vi"
|
||||
"c2l0ZXMubmV0ghIqLmF6dXJlLW1vYmlsZS5uZXSCFiouc2NtLmF6dXJlLW1vYmls"
|
||||
"ZS5uZXSCFyouc3NvLmF6dXJld2Vic2l0ZXMubmV0MAwGA1UdEwEB/wQCMAAwZAYD"
|
||||
"VR0fBF0wWzBZoFegVYZTaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j"
|
||||
"cmwvTWljcm9zb2Z0JTIwQXp1cmUlMjBUTFMlMjBJc3N1aW5nJTIwQ0ElMjAwMS5j"
|
||||
"cmwwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0"
|
||||
"cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt"
|
||||
"MAgGBmeBDAECAjAfBgNVHSMEGDAWgBQPIF3XoVeV25LPK9DHwncEznKAdjAdBgNV"
|
||||
"HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEMBQADggIBAKtk"
|
||||
"4nEDfqxbP80uaoBoPaeeX4G/tBNcfpR2sf6soW8atAqGOohdLPcE0n5/KJn+H4u7"
|
||||
"CsZdTJyUVxBxAlpqAc9JABl4urWNbhv4pueGBZXOn5K5Lpup/gp1HhCx4XKFno/7"
|
||||
"T22NVDol4LRLUTeTkrpNyYLU5QYBQpqlFMAcvem/2seiPPYghFtLr5VWVEikUvnf"
|
||||
"wSlECNk84PT7mOdbrX7T3CbG9WEZVmSYxMCS4pwcW3caXoSzUzZ0H1sJndCJW8La"
|
||||
"9tekRKkMVkN558S+FFwaY1yARNqCFeK+yiwvkkkojqHbgwFJgCFWYy37kFR9uPiv"
|
||||
"3sTHvs8IZ5K8TY7rHk3pSMYqoBTODCs7wKGiByWSDMcfAgGBzjt95SKfq0p6sj0C"
|
||||
"+HWFiyKR+PTi2esFP9Vr9sC9jfRM6zwa7KnONqLefHauJPdNMt5l1FQGWvyco4IN"
|
||||
"lwK3Z9FfEOFZA4YcjsqnkNacKZqLjgis3FvD8VPXETgRuffVc75lJxH6WmkwqdXj"
|
||||
"BlU8wOcJyXTmM1ehYpziCpWvGBSEIsFuK6BC/iBnQEuWKdctAdbHIDlLctGgDWjx"
|
||||
"xYDPZ/TtORGL8YaDnj6QHeOURIAHCtt6NCWKV6OR2HtMx+tCEvfi5ION1dyJ9hAX"
|
||||
"+4K9FXc71ab7tdV/GLPkWc8Q0x1nk7ogDYcqKbiF";
|
||||
|
||||
class TestProxy {
|
||||
// cspell:enable
|
||||
|
||||
std::unique_ptr<HttpPipeline> m_pipeline;
|
||||
std::string TestProxyUrl()
|
||||
{
|
||||
std::string proxyUrl{Azure::Core::_internal::Environment::GetVariable("PROXY_URL")};
|
||||
if (proxyUrl.empty())
|
||||
{
|
||||
proxyUrl = "https://localhost:5001";
|
||||
Azure::Core::Http::Policies::TransportOptions transportOptions;
|
||||
|
||||
// Note that the default is to *disable* CRL checks, because they are disabled
|
||||
// by default. So we test *enabling* CRL validation checks.
|
||||
transportOptions.ExpectedTlsRootCertificate = azurewebsitesCertificate;
|
||||
HttpPipeline pipeline(CreateHttpPipeline(transportOptions));
|
||||
|
||||
Azure::Core::Url url(AzureSdkHttpbinServer::Get());
|
||||
auto request = Azure::Core::Http::Request(Azure::Core::Http::HttpMethod::Get, url);
|
||||
auto response = pipeline.Send(request, Azure::Core::Context::ApplicationContext);
|
||||
EXPECT_EQ(response->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok);
|
||||
}
|
||||
return proxyUrl;
|
||||
#endif
|
||||
}
|
||||
|
||||
public:
|
||||
struct TestProxyOptions : Azure::Core::_internal::ClientOptions
|
||||
{
|
||||
TestProxyOptions() : Azure::Core::_internal::ClientOptions() {}
|
||||
const std::string TestProxyHttpsCertificate =
|
||||
// cspell:disable
|
||||
"MIIDSDCCAjCgAwIBAgIUIoKu8Oao7j10TLNxaUG2Bs0FrRwwDQYJKoZIhvcNAQEL"
|
||||
"BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgwNTIxMTcyM1oXDTIzMDgw"
|
||||
"NTIxMTcyM1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF"
|
||||
"AAOCAQ8AMIIBCgKCAQEA0UPG7ER++5/9D/qa4SCtt7QvdHwcpidbwktPNU8iRW7V"
|
||||
"pIDPWS4goLp/+7+maT0Z/mqwSO3JDtm/dtdlr3F/5EMgyUExnYcvUixZAiyFyEwj"
|
||||
"j6wnAtNvqsg4rDqBlD17fuqTVsZm9Yo7QYub6p5PeznWYucOxRrczqFCiW4uj0Yk"
|
||||
"GgUHPPmCvhSDKowV8CYRHfkD6R8R4SFkoP3/uejXHxeXoYJNMWq5K0GqGaOZtNFB"
|
||||
"F7QWZHoLrRpZcY4h+DxwP3c+/FdlVcs9nstkF+EnTnwx5IRyKsaWb/pUEmYKvNDz"
|
||||
"wi6qnRUdu+DghZuvyZZDgwoYrSZokcbKumk0MsLC3QIDAQABo4GRMIGOMA8GA1Ud"
|
||||
"EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGmMBYGA1UdJQEB/wQMMAoGCCsGAQUF"
|
||||
"BwMBMBcGA1UdEQEB/wQNMAuCCWxvY2FsaG9zdDA6BgorBgEEAYI3VAEBBCwMKkFT"
|
||||
"UC5ORVQgQ29yZSBIVFRQUyBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0ZTANBgkqhkiG"
|
||||
"9w0BAQsFAAOCAQEARX4NxGbycdPVuqvu/CO+/LpWrEm1OcOl7N57/mD5npTIJT78"
|
||||
"TYtXk1J61akumKdf5CaBgCDRcl35LhioFZIMEsiOidffAp6t493xocncFBhIYYrZ"
|
||||
"HS6aKsZKPu8h3wOLpYu+zh7f0Hx6pkHPAfw4+knmQjDYomz/hTwuo/MuT8k6Ee7B"
|
||||
"NGWqxUamLI8bucuf2ZfT1XOq83uWaFF5KwAuVLhpzo39/TmPyYGnaoKRYf9QjabS"
|
||||
"LUjecMNLJFWHUSD4cKHvXJjDYZEiCiy+MdUDytWIsfw0fzAUjz9Qaz8YpZ+fXufM"
|
||||
"MNMNfyJHSMEMFIT2D1UaQiwryXWQWJ93OiSdjA==";
|
||||
|
||||
const std::string InvalidTestProxyHttpsCertificate
|
||||
= "MIIIujCCBqKgAwIBAgITMwAxS6DhmVCLBf6MWwAAADFLoDANBgkqhkiG9w0BAQwF"
|
||||
"ADBZMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u"
|
||||
"MSowKAYDVQQDEyFNaWNyb3NvZnQgQXp1cmUgVExTIElzc3VpbmcgQ0EgMDEwHhcN"
|
||||
"MjIwMzE0MTgzOTU1WhcNMjMwMzA5MTgzOTU1WjBqMQswCQYDVQQGEwJVUzELMAkG"
|
||||
"A1UECBMCV0ExEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD"
|
||||
"b3Jwb3JhdGlvbjEcMBoGA1UEAwwTKi5henVyZXdlYnNpdGVzLm5ldDCCASIwDQYJ"
|
||||
"KoZIhvcNAQEBBQADggEPADCCAQoCggEBAM3heDMqn7v8cmh4A9vECuEfuiUnKBIw"
|
||||
"7y0Sf499Z7WW92HDkIvV3eJ6jcyq41f2UJcG8ivCu30eMnYyyI+aRHIedkvOBA2i"
|
||||
"PqG78e99qGTuKCj9lrJGVfeTBJ1VIlPvfuHFv/3JaKIBpRtuqxCdlgsGAJQmvHEn"
|
||||
"vIHUV2jgj4iWNBDoC83ShtWg6qV2ol7yiaClB20Af5byo36jVdMN6vS+/othn3jG"
|
||||
"pn+NP00DWYbP5y4qhs5XLH9wQZaTUPKIaUxmHewErcM0rMAaWl8wMqQTeNYf3l5D"
|
||||
"ax50yuEg9VVjtbDdSmvOkslGpVqsOl1NrmyN7gCvcvcRUQcxIiXJQc0CAwEAAaOC"
|
||||
"BGgwggRkMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgCt9776fP8QyIudPZwe"
|
||||
"PhhqtGcpXc+xDCTKhYY069yCigAAAX+Jw/reAAAEAwBHMEUCIE8AAjvwO4AffPn7"
|
||||
"un67WykJ2hGB4n8qJE7pk4QYjWW+AiEA/pio1E9ALt30Kh/Ga4gRefH1ILbQ8n4h"
|
||||
"bHFatezIcvYAdwB6MoxU2LcttiDqOOBSHumEFnAyE4VNO9IrwTpXo1LrUgAAAX+J"
|
||||
"w/qlAAAEAwBIMEYCIQCdbj6FOX6wK+dLoqjWKuCgkKSsZsJKpVik6HjlRgomzQIh"
|
||||
"AM7mYp5dBFmNLas3fFcP0rMMK+17n8u0GhFH2KpkPr1SAHYA6D7Q2j71BjUy51co"
|
||||
"vIlryQPTy9ERa+zraeF3fW0GvW4AAAF/icP6jgAABAMARzBFAiAhjTz3PBjqRrpY"
|
||||
"eH7us44lESC7c0dzdTcehTeAwmEyrgIhAOCaqmqA+ercv+39jzFWkctG36bazRFX"
|
||||
"4gGNiKU0bctcMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwIwCgYIKwYBBQUH"
|
||||
"AwEwPAYJKwYBBAGCNxUHBC8wLQYlKwYBBAGCNxUIh73XG4Hn60aCgZ0ujtAMh/Da"
|
||||
"HV2ChOVpgvOnPgIBZAIBJTCBrgYIKwYBBQUHAQEEgaEwgZ4wbQYIKwYBBQUHMAKG"
|
||||
"YWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0"
|
||||
"JTIwQXp1cmUlMjBUTFMlMjBJc3N1aW5nJTIwQ0ElMjAwMSUyMC0lMjB4c2lnbi5j"
|
||||
"cnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2Nz"
|
||||
"cDAdBgNVHQ4EFgQUiiks5RXI6IIQccflfDtgAHndN7owDgYDVR0PAQH/BAQDAgSw"
|
||||
"MHwGA1UdEQR1MHOCEyouYXp1cmV3ZWJzaXRlcy5uZXSCFyouc2NtLmF6dXJld2Vi"
|
||||
"c2l0ZXMubmV0ghIqLmF6dXJlLW1vYmlsZS5uZXSCFiouc2NtLmF6dXJlLW1vYmls"
|
||||
"ZS5uZXSCFyouc3NvLmF6dXJld2Vic2l0ZXMubmV0MAwGA1UdEwEB/wQCMAAwZAYD"
|
||||
"VR0fBF0wWzBZoFegVYZTaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j"
|
||||
"cmwvTWljcm9zb2Z0JTIwQXp1cmUlMjBUTFMlMjBJc3N1aW5nJTIwQ0ElMjAwMS5j"
|
||||
"cmwwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0"
|
||||
"cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt"
|
||||
"MAgGBmeBDAECAjAfBgNVHSMEGDAWgBQPIF3XoVeV25LPK9DHwncEznKAdjAdBgNV"
|
||||
"HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEMBQADggIBAKtk"
|
||||
"4nEDfqxbP80uaoBoPaeeX4G/tBNcfpR2sf6soW8atAqGOohdLPcE0n5/KJn+H4u7"
|
||||
"CsZdTJyUVxBxAlpqAc9JABl4urWNbhv4pueGBZXOn5K5Lpup/gp1HhCx4XKFno/7"
|
||||
"T22NVDol4LRLUTeTkrpNyYLU5QYBQpqlFMAcvem/2seiPPYghFtLr5VWVEikUvnf"
|
||||
"wSlECNk84PT7mOdbrX7T3CbG9WEZVmSYxMCS4pwcW3caXoSzUzZ0H1sJndCJW8La"
|
||||
"9tekRKkMVkN558S+FFwaY1yARNqCFeK+yiwvkkkojqHbgwFJgCFWYy37kFR9uPiv"
|
||||
"3sTHvs8IZ5K8TY7rHk3pSMYqoBTODCs7wKGiByWSDMcfAgGBzjt95SKfq0p6sj0C"
|
||||
"+HWFiyKR+PTi2esFP9Vr9sC9jfRM6zwa7KnONqLefHauJPdNMt5l1FQGWvyco4IN"
|
||||
"lwK3Z9FfEOFZA4YcjsqnkNacKZqLjgis3FvD8VPXETgRuffVc75lJxH6WmkwqdXj"
|
||||
"BlU8wOcJyXTmM1ehYpziCpWvGBSEIsFuK6BC/iBnQEuWKdctAdbHIDlLctGgDWjx"
|
||||
"xYDPZ/TtORGL8YaDnj6QHeOURIAHCtt6NCWKV6OR2HtMx+tCEvfi5ION1dyJ9hAX"
|
||||
"+4K9FXc71ab7tdV/GLPkWc8Q0x1nk7ogDYcqKbiF";
|
||||
|
||||
class TestProxy {
|
||||
// cspell:enable
|
||||
|
||||
std::unique_ptr<HttpPipeline> m_pipeline;
|
||||
std::string TestProxyUrl()
|
||||
{
|
||||
std::string proxyUrl{Azure::Core::_internal::Environment::GetVariable("PROXY_URL")};
|
||||
if (proxyUrl.empty())
|
||||
{
|
||||
proxyUrl = "https://localhost:5001";
|
||||
}
|
||||
return proxyUrl;
|
||||
}
|
||||
|
||||
public:
|
||||
struct TestProxyOptions : Azure::Core::_internal::ClientOptions
|
||||
{
|
||||
TestProxyOptions() : Azure::Core::_internal::ClientOptions() {}
|
||||
};
|
||||
TestProxy(TestProxyOptions options = TestProxyOptions())
|
||||
{
|
||||
if (options.Transport.ExpectedTlsRootCertificate.empty())
|
||||
{
|
||||
options.Transport.ExpectedTlsRootCertificate = TestProxyHttpsCertificate;
|
||||
}
|
||||
std::vector<std::unique_ptr<Azure::Core::Http::Policies::HttpPolicy>> perRetryPolicies;
|
||||
std::vector<std::unique_ptr<Azure::Core::Http::Policies::HttpPolicy>> perCallPolicies;
|
||||
m_pipeline = std::make_unique<Azure::Core::Http::_internal::HttpPipeline>(
|
||||
options,
|
||||
"Test Proxy",
|
||||
"2021-11",
|
||||
std::move(perRetryPolicies),
|
||||
std::move(perCallPolicies));
|
||||
}
|
||||
|
||||
Azure::Response<std::string> PostStartRecording(std::string const& recordingFile)
|
||||
{
|
||||
std::string proxyServerRequest;
|
||||
proxyServerRequest = "{ \"x-recording-file\": \"";
|
||||
proxyServerRequest += Azure::Core::Url::Encode(recordingFile);
|
||||
proxyServerRequest += "\"}";
|
||||
std::vector<uint8_t> bodyVector{proxyServerRequest.begin(), proxyServerRequest.end()};
|
||||
Azure::Core::IO::MemoryBodyStream postBody(bodyVector);
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post,
|
||||
Azure::Core::Url(TestProxyUrl() + "/record/start"),
|
||||
&postBody);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto& responseHeaders = response->GetHeaders();
|
||||
auto responseId = responseHeaders.find("x-recording-id");
|
||||
return Azure::Response<std::string>(responseId->second, std::move(response));
|
||||
}
|
||||
Azure::Response<Azure::Core::Http::HttpStatusCode> PostStopRecording(
|
||||
std::string const& recordingId)
|
||||
{
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post, Azure::Core::Url(TestProxyUrl() + "/record/stop"));
|
||||
request.SetHeader("x-recording-id", recordingId);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto responseCode = response->GetStatusCode();
|
||||
return Azure::Response<Azure::Core::Http::HttpStatusCode>(
|
||||
responseCode, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<std::string> PostStartPlayback(std::string const& recordingFile)
|
||||
{
|
||||
std::string proxyServerRequest;
|
||||
proxyServerRequest = "{ \"x-recording-file\": \"";
|
||||
proxyServerRequest += Azure::Core::Url::Encode(recordingFile);
|
||||
proxyServerRequest += "\"}";
|
||||
std::vector<uint8_t> bodyVector{proxyServerRequest.begin(), proxyServerRequest.end()};
|
||||
Azure::Core::IO::MemoryBodyStream postBody(bodyVector);
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post,
|
||||
Azure::Core::Url(TestProxyUrl() + "/playback/start"),
|
||||
&postBody);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto& responseHeaders = response->GetHeaders();
|
||||
auto responseId = responseHeaders.find("x-recording-id");
|
||||
return Azure::Response<std::string>(responseId->second, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<Azure::Core::Http::HttpStatusCode> PostStopPlayback(
|
||||
std::string const& recordingId)
|
||||
{
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post,
|
||||
Azure::Core::Url(TestProxyUrl() + "/playback/stop"));
|
||||
request.SetHeader("x-recording-id", recordingId);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto responseCode = response->GetStatusCode();
|
||||
return Azure::Response<Azure::Core::Http::HttpStatusCode>(
|
||||
responseCode, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<std::string> ProxyServerGetUrl(
|
||||
std::string const& recordingId,
|
||||
bool isRecording,
|
||||
std::string const& urlToRecord)
|
||||
{
|
||||
Azure::Core::Url targetUrl{urlToRecord};
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Get,
|
||||
Azure::Core::Url(TestProxyUrl() + "/" + targetUrl.GetRelativeUrl()));
|
||||
request.SetHeader(
|
||||
"x-recording-upstream-base-uri", targetUrl.GetScheme() + "://" + targetUrl.GetHost());
|
||||
request.SetHeader("x-recording-id", recordingId);
|
||||
request.SetHeader("x-recording-mode", (isRecording ? "record" : "playback"));
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
std::string responseBody(response->GetBody().begin(), response->GetBody().end());
|
||||
return Azure::Response<std::string>(responseBody, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<Azure::Core::Http::HttpStatusCode> IsAlive()
|
||||
{
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Get,
|
||||
Azure::Core::Url(TestProxyUrl() + "/Admin/IsAlive"));
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto statusCode = response->GetStatusCode();
|
||||
return Azure::Response<Azure::Core::Http::HttpStatusCode>(statusCode, std::move(response));
|
||||
}
|
||||
|
||||
~TestProxy() {}
|
||||
};
|
||||
TestProxy(TestProxyOptions options = TestProxyOptions())
|
||||
|
||||
TEST_F(TransportAdapterOptions, AccessTestProxyServer)
|
||||
{
|
||||
if (options.Transport.ExpectedTlsRootCertificate.empty())
|
||||
if (!IsTestProxyRunning)
|
||||
{
|
||||
options.Transport.ExpectedTlsRootCertificate = TestProxyHttpsCertificate;
|
||||
GTEST_SKIP_("Skipping TestProxy tests because TestProxy is not running.");
|
||||
}
|
||||
std::vector<std::unique_ptr<Azure::Core::Http::Policies::HttpPolicy>> perRetryPolicies;
|
||||
std::vector<std::unique_ptr<Azure::Core::Http::Policies::HttpPolicy>> perCallPolicies;
|
||||
m_pipeline = std::make_unique<Azure::Core::Http::_internal::HttpPipeline>(
|
||||
options,
|
||||
"Test Proxy",
|
||||
"2021-11",
|
||||
std::move(perRetryPolicies),
|
||||
std::move(perCallPolicies));
|
||||
|
||||
TestProxy proxyServer;
|
||||
|
||||
EXPECT_EQ(Azure::Core::Http::HttpStatusCode::Ok, proxyServer.IsAlive().Value);
|
||||
|
||||
std::string recordingId;
|
||||
EXPECT_NO_THROW(recordingId = proxyServer.PostStartRecording("testRecording.json").Value);
|
||||
|
||||
GTEST_LOG_(INFO) << "Started recording with ID " << recordingId;
|
||||
|
||||
std::string response;
|
||||
EXPECT_NO_THROW(
|
||||
response
|
||||
= proxyServer.ProxyServerGetUrl(recordingId, true, AzureSdkHttpbinServer::Get()).Value);
|
||||
|
||||
GTEST_LOG_(INFO) << "Response for recording " << recordingId << "is: " << response;
|
||||
|
||||
EXPECT_NO_THROW(proxyServer.PostStopRecording(recordingId));
|
||||
|
||||
EXPECT_NO_THROW(recordingId = proxyServer.PostStartPlayback("testRecording.json").Value);
|
||||
GTEST_LOG_(INFO) << "Started playback with ID " << recordingId;
|
||||
|
||||
EXPECT_NO_THROW(
|
||||
response
|
||||
= proxyServer.ProxyServerGetUrl(recordingId, false, AzureSdkHttpbinServer::Get()).Value);
|
||||
|
||||
GTEST_LOG_(INFO) << "Recorded Response for " << recordingId << "is: " << response;
|
||||
|
||||
EXPECT_NO_THROW(proxyServer.PostStopPlayback(recordingId));
|
||||
}
|
||||
|
||||
Azure::Response<std::string> PostStartRecording(std::string const& recordingFile)
|
||||
TEST_F(TransportAdapterOptions, TestProxyServerWithInvalidCertificate)
|
||||
{
|
||||
std::string proxyServerRequest;
|
||||
proxyServerRequest = "{ \"x-recording-file\": \"";
|
||||
proxyServerRequest += Azure::Core::Url::Encode(recordingFile);
|
||||
proxyServerRequest += "\"}";
|
||||
std::vector<uint8_t> bodyVector{proxyServerRequest.begin(), proxyServerRequest.end()};
|
||||
Azure::Core::IO::MemoryBodyStream postBody(bodyVector);
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post,
|
||||
Azure::Core::Url(TestProxyUrl() + "/record/start"),
|
||||
&postBody);
|
||||
if (!IsTestProxyRunning)
|
||||
{
|
||||
GTEST_SKIP_("Skipping TestProxy tests because TestProxy is not running.");
|
||||
}
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto& responseHeaders = response->GetHeaders();
|
||||
auto responseId = responseHeaders.find("x-recording-id");
|
||||
return Azure::Response<std::string>(responseId->second, std::move(response));
|
||||
TestProxy::TestProxyOptions options;
|
||||
options.Transport.ExpectedTlsRootCertificate = InvalidTestProxyHttpsCertificate;
|
||||
TestProxy proxyServer(options);
|
||||
|
||||
EXPECT_THROW(proxyServer.IsAlive(), Azure::Core::Http::TransportException);
|
||||
}
|
||||
Azure::Response<Azure::Core::Http::HttpStatusCode> PostStopRecording(
|
||||
std::string const& recordingId)
|
||||
{
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post, Azure::Core::Url(TestProxyUrl() + "/record/stop"));
|
||||
request.SetHeader("x-recording-id", recordingId);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto responseCode = response->GetStatusCode();
|
||||
return Azure::Response<Azure::Core::Http::HttpStatusCode>(responseCode, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<std::string> PostStartPlayback(std::string const& recordingFile)
|
||||
{
|
||||
std::string proxyServerRequest;
|
||||
proxyServerRequest = "{ \"x-recording-file\": \"";
|
||||
proxyServerRequest += Azure::Core::Url::Encode(recordingFile);
|
||||
proxyServerRequest += "\"}";
|
||||
std::vector<uint8_t> bodyVector{proxyServerRequest.begin(), proxyServerRequest.end()};
|
||||
Azure::Core::IO::MemoryBodyStream postBody(bodyVector);
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post,
|
||||
Azure::Core::Url(TestProxyUrl() + "/playback/start"),
|
||||
&postBody);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto& responseHeaders = response->GetHeaders();
|
||||
auto responseId = responseHeaders.find("x-recording-id");
|
||||
return Azure::Response<std::string>(responseId->second, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<Azure::Core::Http::HttpStatusCode> PostStopPlayback(
|
||||
std::string const& recordingId)
|
||||
{
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Post, Azure::Core::Url(TestProxyUrl() + "/playback/stop"));
|
||||
request.SetHeader("x-recording-id", recordingId);
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto responseCode = response->GetStatusCode();
|
||||
return Azure::Response<Azure::Core::Http::HttpStatusCode>(responseCode, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<std::string> ProxyServerGetUrl(
|
||||
std::string const& recordingId,
|
||||
bool isRecording,
|
||||
std::string const& urlToRecord)
|
||||
{
|
||||
Azure::Core::Url targetUrl{urlToRecord};
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Get,
|
||||
Azure::Core::Url(TestProxyUrl() + "/" + targetUrl.GetRelativeUrl()));
|
||||
request.SetHeader(
|
||||
"x-recording-upstream-base-uri", targetUrl.GetScheme() + "://" + targetUrl.GetHost());
|
||||
request.SetHeader("x-recording-id", recordingId);
|
||||
request.SetHeader("x-recording-mode", (isRecording ? "record" : "playback"));
|
||||
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
std::string responseBody(response->GetBody().begin(), response->GetBody().end());
|
||||
return Azure::Response<std::string>(responseBody, std::move(response));
|
||||
}
|
||||
|
||||
Azure::Response<Azure::Core::Http::HttpStatusCode> IsAlive()
|
||||
{
|
||||
auto request = Azure::Core::Http::Request(
|
||||
Azure::Core::Http::HttpMethod::Get, Azure::Core::Url(TestProxyUrl() + "/Admin/IsAlive"));
|
||||
auto response = m_pipeline->Send(request, Azure::Core::Context::ApplicationContext);
|
||||
auto statusCode = response->GetStatusCode();
|
||||
return Azure::Response<Azure::Core::Http::HttpStatusCode>(statusCode, std::move(response));
|
||||
}
|
||||
|
||||
~TestProxy() {}
|
||||
};
|
||||
|
||||
TEST_F(TransportAdapterOptions, AccessTestProxyServer)
|
||||
{
|
||||
if (!IsTestProxyRunning)
|
||||
{
|
||||
GTEST_SKIP_("Skipping TestProxy tests because TestProxy is not running.");
|
||||
}
|
||||
|
||||
TestProxy proxyServer;
|
||||
|
||||
EXPECT_EQ(Azure::Core::Http::HttpStatusCode::Ok, proxyServer.IsAlive().Value);
|
||||
|
||||
std::string recordingId;
|
||||
EXPECT_NO_THROW(recordingId = proxyServer.PostStartRecording("testRecording.json").Value);
|
||||
|
||||
GTEST_LOG_(INFO) << "Started recording with ID " << recordingId;
|
||||
|
||||
std::string response;
|
||||
EXPECT_NO_THROW(
|
||||
response
|
||||
= proxyServer.ProxyServerGetUrl(recordingId, true, AzureSdkHttpbinServer::Get()).Value);
|
||||
|
||||
GTEST_LOG_(INFO) << "Response for recording " << recordingId << "is: " << response;
|
||||
|
||||
EXPECT_NO_THROW(proxyServer.PostStopRecording(recordingId));
|
||||
|
||||
EXPECT_NO_THROW(recordingId = proxyServer.PostStartPlayback("testRecording.json").Value);
|
||||
GTEST_LOG_(INFO) << "Started playback with ID " << recordingId;
|
||||
|
||||
EXPECT_NO_THROW(
|
||||
response
|
||||
= proxyServer.ProxyServerGetUrl(recordingId, false, AzureSdkHttpbinServer::Get()).Value);
|
||||
|
||||
GTEST_LOG_(INFO) << "Recorded Response for " << recordingId << "is: " << response;
|
||||
|
||||
EXPECT_NO_THROW(proxyServer.PostStopPlayback(recordingId));
|
||||
}
|
||||
|
||||
TEST_F(TransportAdapterOptions, TestProxyServerWithInvalidCertificate)
|
||||
{
|
||||
if (!IsTestProxyRunning)
|
||||
{
|
||||
GTEST_SKIP_("Skipping TestProxy tests because TestProxy is not running.");
|
||||
}
|
||||
|
||||
TestProxy::TestProxyOptions options;
|
||||
options.Transport.ExpectedTlsRootCertificate = InvalidTestProxyHttpsCertificate;
|
||||
TestProxy proxyServer(options);
|
||||
|
||||
EXPECT_THROW(proxyServer.IsAlive(), Azure::Core::Http::TransportException);
|
||||
}
|
||||
|
||||
}}} // namespace Azure::Core::Test
|
||||
|
||||
@ -44,39 +44,39 @@ stages:
|
||||
CtestRegex: azure-core.|json-test
|
||||
LiveTestCtestRegex: azure-core.|json-test
|
||||
LiveTestTimeoutInMinutes: 90 # default is 60 min. We need a little longer on worst case for Win+jsonTests
|
||||
LineCoverageTarget: 93
|
||||
LineCoverageTarget: 92
|
||||
BranchCoverageTarget: 50
|
||||
PreTestSteps:
|
||||
- pwsh: |
|
||||
docker build -t squid-local $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests/localproxy
|
||||
docker build -t squid-local.passwd $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests/localproxy.passwd
|
||||
$(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests/runproxy.ps1
|
||||
displayName: Launch Linux Docker container proxy
|
||||
# If we're on Ubuntu and running proxy tests, build and launch a local squid proxy
|
||||
condition: and(succeeded(), contains(variables['Agent.OS'], 'linux'), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
|
||||
- pwsh: eng/scripts/Install-WSL.ps1
|
||||
displayName: Install WSL on Windows hosts when proxy tests are enabled..
|
||||
condition: and(succeeded(), contains(variables['Agent.OS'], 'windows'), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
|
||||
- pwsh: ./run_wsl_proxy.ps1
|
||||
displayName: Launch WSL Proxy Server.
|
||||
workingDirectory: $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests
|
||||
condition: and(succeeded(), contains(variables['Agent.OS'], 'windows'), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
|
||||
# Verify that the proxy servers are running locally whenever we're expected to run proxy tests.
|
||||
- pwsh: ./verify_proxy.ps1
|
||||
workingDirectory: $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests
|
||||
displayName: Verify Proxy Server Working Correctly.
|
||||
condition: and(succeeded(), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
# PreTestSteps:
|
||||
# - pwsh: |
|
||||
# docker build -t squid-local $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests/localproxy
|
||||
# docker build -t squid-local.passwd $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests/localproxy.passwd
|
||||
# $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests/runproxy.ps1
|
||||
# displayName: Launch Linux Docker container proxy
|
||||
# # If we're on Ubuntu and running proxy tests, build and launch a local squid proxy
|
||||
# condition: and(succeeded(), contains(variables['Agent.OS'], 'linux'), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
#
|
||||
# - pwsh: eng/scripts/Install-WSL.ps1
|
||||
# displayName: Install WSL on Windows hosts when proxy tests are enabled..
|
||||
# condition: and(succeeded(), contains(variables['Agent.OS'], 'windows'), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
#
|
||||
# - pwsh: ./run_wsl_proxy.ps1
|
||||
# displayName: Launch WSL Proxy Server.
|
||||
# workingDirectory: $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests
|
||||
# condition: and(succeeded(), contains(variables['Agent.OS'], 'windows'), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
#
|
||||
# # Verify that the proxy servers are running locally whenever we're expected to run proxy tests.
|
||||
# - pwsh: ./verify_proxy.ps1
|
||||
# workingDirectory: $(Build.SourcesDirectory)/sdk/core/azure-core/test/ut/proxy_tests
|
||||
# displayName: Verify Proxy Server Working Correctly.
|
||||
# condition: and(succeeded(), variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'))
|
||||
|
||||
PostTestSteps:
|
||||
- pwsh: |
|
||||
docker ps -q -f ancestor=ubuntu/squid | ForEach-Object { `
|
||||
docker stop $_ `
|
||||
}
|
||||
displayName: Shutdown Squid Proxy.
|
||||
condition: and(variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'), contains(variables['OSVmImage'], 'linux'))
|
||||
# PostTestSteps:
|
||||
# - pwsh: |
|
||||
# docker ps -q -f ancestor=ubuntu/squid | ForEach-Object { `
|
||||
# docker stop $_ `
|
||||
# }
|
||||
# displayName: Shutdown Squid Proxy.
|
||||
# condition: and(variables.RunProxyTests, contains(variables.CmakeArgs, 'BUILD_TESTING=ON'), contains(variables['OSVmImage'], 'linux'))
|
||||
|
||||
Artifacts:
|
||||
- Name: azure-core
|
||||
|
||||
Loading…
Reference in New Issue
Block a user