Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
805f950
Add HttpFilterIntegrationTestBase
oschaaf Sep 9, 2020
0c6f182
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 10, 2020
8d30820
Review feedback
oschaaf Sep 11, 2020
4827909
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 11, 2020
5f18691
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 14, 2020
7eeb7e9
Add setRequestHeader
oschaaf Sep 14, 2020
467e8a7
Add generic c++ integration test for uniform extension behavior.
oschaaf Sep 14, 2020
e4a50bd
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 14, 2020
ca17f41
Review feedback
oschaaf Sep 14, 2020
9a2f69e
Merge branch 'extension-refactor-prelude' into extension-refactor-pre…
oschaaf Sep 15, 2020
97322d8
Review feedback sync
oschaaf Sep 15, 2020
139cfff
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 16, 2020
2aff84a
Review feedback
oschaaf Sep 16, 2020
fa2ff48
Merge branch 'extension-refactor-prelude' into extension-refactor-pre…
oschaaf Sep 16, 2020
f0c8eba
Sync file I forgot
oschaaf Sep 16, 2020
3440fd9
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 17, 2020
0f3110c
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 18, 2020
ab3585b
Merge remote-tracking branch 'upstream/master' into extension-refacto…
oschaaf Sep 22, 2020
5ff6d56
Review feedback
oschaaf Sep 22, 2020
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
16 changes: 13 additions & 3 deletions test/server/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,26 @@ envoy_cc_test_library(
],
)

envoy_cc_test(
name = "http_filter_base_test",
srcs = ["http_filter_base_test.cc"],
repository = "@envoy",
deps = [
":http_filter_integration_test_base_lib",
"//source/server:http_dynamic_delay_filter_config",
"//source/server:http_test_server_filter_config",
"//source/server:http_time_tracking_filter_config",
],
)

envoy_cc_test(
name = "http_test_server_filter_integration_test",
srcs = ["http_test_server_filter_integration_test.cc"],
repository = "@envoy",
deps = [
":http_filter_integration_test_base_lib",
"//source/server:http_test_server_filter_config",
"@envoy//include/envoy/upstream:cluster_manager_interface_with_external_headers",
"@envoy//source/common/api:api_lib_with_external_headers",
"@envoy//test/integration:http_integration_lib",
],
)

Expand All @@ -50,7 +61,6 @@ envoy_cc_test(
deps = [
":http_filter_integration_test_base_lib",
"//source/server:http_time_tracking_filter_config",
"@envoy//include/envoy/upstream:cluster_manager_interface_with_external_headers",
"@envoy//source/common/api:api_lib_with_external_headers",
"@envoy//test/test_common:simulated_time_system_lib",
],
Expand Down
94 changes: 94 additions & 0 deletions test/server/http_filter_base_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#include "server/http_dynamic_delay_filter.h"
#include "server/http_test_server_filter.h"
#include "server/http_time_tracking_filter.h"

#include "test/server/http_filter_integration_test_base.h"

#include "gtest/gtest.h"

namespace Nighthawk {
namespace {

using ::testing::HasSubstr;

enum TestRequestMethod { GET, POST };

const std::string kBadConfigErrorSentinel =
"didn't understand the request: Error merging json config: Unable to parse "
"JSON as proto (INVALID_ARGUMENT:Unexpected";

class HttpFilterBaseIntegrationTest
: public HttpFilterIntegrationTestBase,
public testing::TestWithParam<
std::tuple<Envoy::Network::Address::IpVersion, absl::string_view, TestRequestMethod>> {
public:
HttpFilterBaseIntegrationTest()
: HttpFilterIntegrationTestBase(std::get<0>(GetParam())), config_(std::get<1>(GetParam())) {
initializeFilterConfiguration(config_);
if (std::get<2>(GetParam()) == TestRequestMethod::POST) {
switchToPostWithEntityBody();
}
};

ResponseOrigin getHappyFlowResponseOrigin() {
// Modulo the test-server, extensions are expected to need an upstream to synthesize a reply
// when the effective configuration is valid.
return config_.find_first_of("name: test-server") == 0 ? ResponseOrigin::EXTENSION
: ResponseOrigin::UPSTREAM;
}

protected:
const std::string config_;
};

INSTANTIATE_TEST_SUITE_P(
IpVersions, HttpFilterBaseIntegrationTest,
::testing::Combine(testing::ValuesIn(Envoy::TestEnvironment::getIpVersionsForTest()),
testing::ValuesIn({absl::string_view(R"EOF(
name: time-tracking
typed_config:
"@type": type.googleapis.com/nighthawk.server.ResponseOptions
emit_previous_request_delta_in_response_header: "foo"
)EOF"),
absl::string_view(R"EOF(
name: dynamic-delay
typed_config:
"@type": type.googleapis.com/nighthawk.server.ResponseOptions
static_delay: 0.1s
)EOF"),
absl::string_view("name: test-server")}),
testing::ValuesIn({TestRequestMethod::GET, TestRequestMethod::POST})));

TEST_P(HttpFilterBaseIntegrationTest, NoRequestLevelConfigurationShouldSucceed) {
Envoy::IntegrationStreamDecoderPtr response = getResponse(getHappyFlowResponseOrigin());
ASSERT_TRUE(response->complete());
EXPECT_EQ("200", response->headers().Status()->value().getStringView());
EXPECT_TRUE(response->body().empty());
}

TEST_P(HttpFilterBaseIntegrationTest, EmptyJsonRequestLevelConfigurationShouldSucceed) {
setRequestLevelConfiguration("{}");
Envoy::IntegrationStreamDecoderPtr response = getResponse(getHappyFlowResponseOrigin());
ASSERT_TRUE(response->complete());
EXPECT_EQ("200", response->headers().Status()->value().getStringView());
EXPECT_TRUE(response->body().empty());
}

TEST_P(HttpFilterBaseIntegrationTest, BadJsonAsRequestLevelConfigurationShouldFail) {
// When sending bad request-level configuration, the extension ought to reply directly.
setRequestLevelConfiguration("bad_json");
Envoy::IntegrationStreamDecoderPtr response = getResponse(ResponseOrigin::EXTENSION);
EXPECT_EQ(Envoy::Http::Utility::getResponseStatus(response->headers()), 500);
EXPECT_THAT(response->body(), HasSubstr(kBadConfigErrorSentinel));
}

TEST_P(HttpFilterBaseIntegrationTest, EmptyRequestLevelConfigurationShouldFail) {
// When sending empty request-level configuration, the extension ought to reply directly.
setRequestLevelConfiguration("");
Envoy::IntegrationStreamDecoderPtr response = getResponse(ResponseOrigin::EXTENSION);
EXPECT_EQ(Envoy::Http::Utility::getResponseStatus(response->headers()), 500);
EXPECT_THAT(response->body(), HasSubstr(kBadConfigErrorSentinel));
}

} // namespace
} // namespace Nighthawk