From a4110e44e21371b0696f3bb3894da2997096e11c Mon Sep 17 00:00:00 2001 From: Victor Vazquez Date: Tue, 9 Mar 2021 21:50:08 -0800 Subject: [PATCH] throw when rawResponse was extracted (#1825) * throw when rawResponse was extracted --- .../azure-core/inc/azure/core/response.hpp | 10 +++- sdk/core/azure-core/test/ut/CMakeLists.txt | 1 + sdk/core/azure-core/test/ut/response_t.cpp | 60 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 sdk/core/azure-core/test/ut/response_t.cpp diff --git a/sdk/core/azure-core/inc/azure/core/response.hpp b/sdk/core/azure-core/inc/azure/core/response.hpp index 92aadb50a..abf6396d7 100644 --- a/sdk/core/azure-core/inc/azure/core/response.hpp +++ b/sdk/core/azure-core/inc/azure/core/response.hpp @@ -11,6 +11,7 @@ #include "azure/core/http/http.hpp" #include "azure/core/nullable.hpp" #include // for unique_ptr +#include #include // for move namespace Azure { @@ -50,7 +51,14 @@ public: * @brief Get raw HTTP response. */ // Do not give up raw response ownership. - Azure::Core::Http::RawResponse& GetRawResponse() { return *this->m_rawResponse; } + Azure::Core::Http::RawResponse& GetRawResponse() const + { + if (!m_rawResponse) + { + throw std::runtime_error("The raw response was extracted before."); + } + return *this->m_rawResponse; + } /** * @brief Check whether a value is contained. diff --git a/sdk/core/azure-core/test/ut/CMakeLists.txt b/sdk/core/azure-core/test/ut/CMakeLists.txt index 6b07936ac..276b8a8aa 100644 --- a/sdk/core/azure-core/test/ut/CMakeLists.txt +++ b/sdk/core/azure-core/test/ut/CMakeLists.txt @@ -52,6 +52,7 @@ add_executable ( operation_status.cpp pipeline.cpp policy.cpp + response_t.cpp simplified_header.cpp string.cpp telemetry_policy.cpp diff --git a/sdk/core/azure-core/test/ut/response_t.cpp b/sdk/core/azure-core/test/ut/response_t.cpp new file mode 100644 index 000000000..5912415cb --- /dev/null +++ b/sdk/core/azure-core/test/ut/response_t.cpp @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// SPDX-License-Identifier: MIT + +#include + +#include +#include + +#include +#include +#include + +using namespace Azure::Core; +using namespace Azure::Core::Http; + +TEST(ResponseT, extractAndGet) +{ + // Create Response and extract the rawResponse + auto rawResponse = std::make_unique(1, 1, HttpStatusCode::Accepted, "Something"); + std::string fakeT("pretending this is the T"); + + Azure::Response response(fakeT, std::move(rawResponse)); + + // rawResponse moved to Response + EXPECT_EQ(nullptr, rawResponse); + // This is fine because the rawResponse is still in the Response + EXPECT_NO_THROW(response.GetRawResponse()); + + rawResponse = response.ExtractRawResponse(); + // rawResponse is now valid again + EXPECT_NE(nullptr, rawResponse); + // Can't get a ref from rawResponse since it was extracted + EXPECT_THROW(response.GetRawResponse(), std::runtime_error); + + // This is fine, we can keep extracting the rawReponse, only that the second time the it would be + // a nullptr + EXPECT_NO_THROW(rawResponse = response.ExtractRawResponse()); + EXPECT_EQ(nullptr, rawResponse); +} + +TEST(ResponseT, value) +{ + // Create Response and test API + auto rawResponse = std::make_unique(1, 1, HttpStatusCode::Accepted, "Something"); + std::string fakeT("pretending this is the T"); + + Azure::Response response(fakeT, std::move(rawResponse)); + + EXPECT_EQ(fakeT, *response); + // use the reference to update the T inside the Response. + EXPECT_NO_THROW(response->clear()); + EXPECT_EQ("", *response); + + // const Response + std::string constFakeT("pretending this is the T"); + Azure::Response const constResponse(constFakeT, std::move(rawResponse)); + // Use * and -> on const Response + EXPECT_EQ(constFakeT, *constResponse); + EXPECT_EQ(*constFakeT.data(), *constResponse->data()); +}