Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure request body is correctly propagated in Nighthawk Request Source. #1289

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/nighthawk/common/request.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Request {
* @return HeaderMapPtr shared pointer to a request header specification.
*/
virtual HeaderMapPtr header() const PURE;
virtual const std::string& body() const PURE;
// TODO(oschaaf): expectations
};

Expand Down
9 changes: 7 additions & 2 deletions source/common/request_impl.h
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
#pragma once

#include <string>
Pelinthecoder marked this conversation as resolved.
Show resolved Hide resolved
#include <utility>
#include "envoy/http/header_map.h"

#include "nighthawk/common/request.h"

namespace Nighthawk {

Pelinthecoder marked this conversation as resolved.
Show resolved Hide resolved
class RequestImpl : public Request {
public:
RequestImpl(HeaderMapPtr header) : header_(std::move(header)) {}
RequestImpl(HeaderMapPtr header, std::string json_body = "")
: header_(std::move(header)), json_body_(std::move(json_body)) {}
Pelinthecoder marked this conversation as resolved.
Show resolved Hide resolved

HeaderMapPtr header() const override { return header_; }
const std::string& body() const override { return json_body_; }

private:
HeaderMapPtr header_;
std::string json_body_;
};

} // namespace Nighthawk
14 changes: 13 additions & 1 deletion source/common/request_source_impl.cc
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#include "source/common/request_source_impl.h"

#include <chrono>
#include <memory>

#include "envoy/common/exception.h"

#include "external/envoy/source/common/common/assert.h"

#include "source/common/request.h"
Pelinthecoder marked this conversation as resolved.
Show resolved Hide resolved
#include "source/common/request_impl.h"

namespace Nighthawk {
Expand Down Expand Up @@ -80,7 +82,17 @@ void RemoteRequestSourceImpl::destroyOnThread() {
}

RequestGenerator RemoteRequestSourceImpl::get() {
return [this]() -> RequestPtr { return grpc_client_->maybeDequeue(); };
return [this]() -> RequestPtr {
Pelinthecoder marked this conversation as resolved.
Show resolved Hide resolved
// Retrieve the request from grpc_client_
std::unique_ptr<Nighthawk::Request> request = grpc_client_->maybeDequeue();

// Ensure request is valid before processing
if (request) {
return std::make_unique<RequestImpl>(request->header(), request->body());
}

return nullptr;
};
}

} // namespace Nighthawk
21 changes: 20 additions & 1 deletion test/request_source/request_source_plugin_test.cc
Original file line number Diff line number Diff line change
@@ -1,12 +1,27 @@
#include <cstdint>
#include <string>
#include <utility>

#include "envoy/common/exception.h"


#include "external/envoy/source/common/config/utility.h"
#include "external/envoy/test/mocks/api/mocks.h"
#include "external/envoy/test/mocks/stats/mocks.h"
#include "external/envoy/test/test_common/file_system_for_test.h"
#include "external/envoy/test/test_common/utility.h"
#include "external/envoy/src/envoy/api/api.h"
#include "external/envoy/http/header_map.h"
#include "external/envoy/src/source/common/http/header_map_impl.h"
#include "external/envoy/src/source/common/protobuf/message_validator_impl.h"
#include "external/envoy/src/source/common/protobuf/protobuf.h"
#include "external/envoy/src/source/common/protobuf/utility.h"

#include "source/request_source/request_options_list_plugin_impl.h"
#include "source/common/exception.h"
#include "source/common/request.h"
#include "source/common/request_source.h"
#include "request_source/request_source_plugin_config_factory.h"

#include "test/request_source/stub_plugin_impl.h"
#include "test/test_common/environment.h"
Expand Down Expand Up @@ -150,7 +165,7 @@ TEST_F(FileBasedRequestSourcePluginTest,
nighthawk::request_source::FileBasedOptionsListRequestSourceConfig config =
MakeFileBasedPluginConfigWithTestYaml(Nighthawk::TestEnvironment::runfilesPath(
"test/request_source/test_data/test-config-ab.yaml"));
config.set_num_requests(2);
config.set_num_requests(3)
Envoy::ProtobufWkt::Any config_any;
config_any.PackFrom(config);
auto& config_factory =
Expand All @@ -164,14 +179,18 @@ TEST_F(FileBasedRequestSourcePluginTest,
Nighthawk::RequestPtr request1 = generator();
Nighthawk::RequestPtr request2 = generator();
Nighthawk::RequestPtr request3 = generator();
Nighthawk::RequestPtr request4 = generator();
ASSERT_NE(request1, nullptr);
ASSERT_NE(request2, nullptr);
ASSERT_NE(request3, nullptr);

Nighthawk::HeaderMapPtr header1 = request1->header();
Nighthawk::HeaderMapPtr header2 = request2->header();
EXPECT_EQ(header1->getPathValue(), "/a");
EXPECT_EQ(header2->getPathValue(), "/b");
EXPECT_EQ(request3, nullptr);
EXPECT_EQ(request3->body(), R"({"message": "hello"})");
EXPECT_EQ(request4, nullptr);
}

TEST_F(FileBasedRequestSourcePluginTest, CreateRequestSourcePluginWithTooLargeAFileThrowsAnError) {
Expand Down
2 changes: 2 additions & 0 deletions test/request_source/test_data/test-config-ab.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
options:
- request_method: 1
request_body_size: 10
json_body: '{"message": "hello"}'
Pelinthecoder marked this conversation as resolved.
Show resolved Hide resolved
request_headers:
- { header: { key: ":path", value: "/a" } }
- { header: { key: "x-nighthawk-test-server-config", value: "{response_body_size:13}" } }
- request_method: 1
request_body_size: 10
json_body: '{"message": "hello"}'
request_headers:
- { header: { key: ":path", value: "/b" } }
- { header: { key: "x-nighthawk-test-server-config", value: "{response_body_size:17}" } }
Loading