blob: 47969cbb33cf197316d17f19499806f768228116 [file] [log] [blame] [edit]
#include "redfish_passthrough_plugin.h"
#include <memory>
#include <utility>
#include "gmock.h"
#include "gunit.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "redfish_query_engine/http/client.h"
#include "mock_redfish_plugin.h"
#include "request_response.h"
#include "sse/sse_parser.h"
#include "util/task/status_macros.h"
namespace {
using ::testing::A;
using ::testing::DoAll;
using ::testing::Invoke;
using ::testing::Not;
using ::testing::Return;
using ::testing::SaveArg;
using ::testing::status::IsOk;
using ProxyRequest = milotic::ProxyRequest;
using ProxyResponse = milotic::ProxyResponse;
using HttpResponse = ecclesia::HttpClient::HttpResponse;
using HttpRequest = ecclesia::HttpClient::HttpRequest;
using ::milotic::ServerSentEvent;
class MockHttpClient : public ecclesia::HttpClient {
public:
MOCK_METHOD(absl::StatusOr<HttpResponse>, Get,
(std::unique_ptr<HttpRequest> request), (override));
MOCK_METHOD(absl::StatusOr<HttpResponse>, Post,
(std::unique_ptr<HttpRequest> request), (override));
MOCK_METHOD(absl::StatusOr<HttpResponse>, Delete,
(std::unique_ptr<HttpRequest> request), (override));
MOCK_METHOD(absl::StatusOr<HttpResponse>, Patch,
(std::unique_ptr<HttpRequest> request), (override));
MOCK_METHOD(absl::Status, GetIncremental,
(std::unique_ptr<HttpRequest> request,
IncrementalResponseHandler* handler),
(override));
MOCK_METHOD(absl::Status, PostIncremental,
(std::unique_ptr<HttpRequest> request,
IncrementalResponseHandler* handler),
(override));
MOCK_METHOD(absl::Status, DeleteIncremental,
(std::unique_ptr<HttpRequest> request,
IncrementalResponseHandler* handler),
(override));
MOCK_METHOD(absl::Status, PatchIncremental,
(std::unique_ptr<HttpRequest> request,
IncrementalResponseHandler* handler),
(override));
};
class RedfishPassthroughPluginWithMocks
: public milotic::RedfishPassthroughPluginBase {
public:
RedfishPassthroughPluginWithMocks()
: RedfishPassthroughPluginBase(&mock_http_client,
&subscribe_mock_http_client) {}
MockHttpClient mock_http_client;
MockHttpClient subscribe_mock_http_client;
};
TEST(RedfishPassthroughPluginTest, SubscribeWithCorrectContentTypeSucceeds) {
RedfishPassthroughPluginWithMocks plugin;
milotic::MockEventHandler mock_event_handler;
ON_CALL(mock_event_handler, IsCancelled).WillByDefault(Return(false));
EXPECT_CALL(plugin.subscribe_mock_http_client, GetIncremental)
.WillOnce(Invoke([](std::unique_ptr<HttpRequest> request,
ecclesia::HttpClient::IncrementalResponseHandler*
handler) -> absl::Status {
RETURN_IF_ERROR(handler->OnResponseHeaders(HttpResponse{
.code = 200, .headers = {{"CoNtEnT-TyPe", "tExT/EvEnT-StReAm"}}}));
RETURN_IF_ERROR(handler->OnBodyData("event: test\r\n\r\n"));
return absl::OkStatus();
}));
EXPECT_CALL(mock_event_handler, OnResponse)
.WillOnce(Return(absl::OkStatus()));
ServerSentEvent event;
EXPECT_CALL(mock_event_handler, OnEvent(A<const ServerSentEvent&>()))
.WillOnce(DoAll(SaveArg<0>(&event), Return(absl::OkStatus())));
auto request = std::make_unique<ProxyRequest>();
EXPECT_OK(plugin.Subscribe(std::move(request), &mock_event_handler));
EXPECT_EQ(event, ServerSentEvent{.event = "test"});
}
TEST(RedfishPassthroughPluginTest, SubscribeWithWrongContentTypeFails) {
RedfishPassthroughPluginWithMocks plugin;
milotic::MockEventHandler mock_event_handler;
ON_CALL(mock_event_handler, IsCancelled).WillByDefault(Return(false));
EXPECT_CALL(plugin.subscribe_mock_http_client, GetIncremental)
.WillOnce(Invoke([](std::unique_ptr<HttpRequest> request,
ecclesia::HttpClient::IncrementalResponseHandler*
handler) -> absl::Status {
RETURN_IF_ERROR(handler->OnResponseHeaders(HttpResponse{
.code = 200, .headers = {{"CoNtEnT-TyPe", "application/json"}}}));
RETURN_IF_ERROR(handler->OnBodyData("event: test\r\n\r\n"));
return absl::OkStatus();
}));
EXPECT_CALL(mock_event_handler, OnResponse)
.WillOnce(Return(absl::OkStatus()));
EXPECT_CALL(mock_event_handler, OnEvent(A<const ServerSentEvent&>()))
.Times(0);
auto request = std::make_unique<ProxyRequest>();
EXPECT_THAT(plugin.Subscribe(std::move(request), &mock_event_handler),
Not(IsOk()));
}
TEST(RedfishPassthroughPluginTest, SubscribeWithNoContentTypeFails) {
RedfishPassthroughPluginWithMocks plugin;
milotic::MockEventHandler mock_event_handler;
ON_CALL(mock_event_handler, IsCancelled).WillByDefault(Return(false));
EXPECT_CALL(plugin.subscribe_mock_http_client, GetIncremental)
.WillOnce(Invoke([](std::unique_ptr<HttpRequest> request,
ecclesia::HttpClient::IncrementalResponseHandler*
handler) -> absl::Status {
RETURN_IF_ERROR(handler->OnResponseHeaders(HttpResponse{.code = 200}));
RETURN_IF_ERROR(handler->OnBodyData("event: test\r\n\r\n"));
return absl::OkStatus();
}));
EXPECT_CALL(mock_event_handler, OnResponse)
.WillOnce(Return(absl::OkStatus()));
EXPECT_CALL(mock_event_handler, OnEvent(A<const ServerSentEvent&>()))
.Times(0);
auto request = std::make_unique<ProxyRequest>();
EXPECT_THAT(plugin.Subscribe(std::move(request), &mock_event_handler),
Not(IsOk()));
}
} // namespace