This is an automated email from the ASF dual-hosted git repository. alexey pushed a commit to branch branch-1.11.x in repository https://gitbox.apache.org/repos/asf/kudu.git
commit 65ff3492cfd2febc5ab37bff06494d144f03a47a Author: Adar Dembo <[email protected]> AuthorDate: Mon Oct 14 18:12:13 2019 -0700 webserver-test: refactoring and simplification Change-Id: I1ba2e1bcc177b7f209562dd6e9c80043ebb9099d Reviewed-on: http://gerrit.cloudera.org:8080/14438 Reviewed-by: Alexey Serbin <[email protected]> Tested-by: Kudu Jenkins (cherry picked from commit 6a0826ae38c86d9075fb4b5f61c4cecf4f1af681) Reviewed-on: http://gerrit.cloudera.org:8080/14466 Reviewed-by: Grant Henke <[email protected]> --- src/kudu/server/webserver-test.cc | 101 +++++++++++++++----------------------- 1 file changed, 39 insertions(+), 62 deletions(-) diff --git a/src/kudu/server/webserver-test.cc b/src/kudu/server/webserver-test.cc index 2581ed0..cb6253f 100644 --- a/src/kudu/server/webserver-test.cc +++ b/src/kudu/server/webserver-test.cc @@ -55,6 +55,7 @@ using std::string; using std::vector; using std::unique_ptr; +using strings::Substitute; DECLARE_int32(webserver_max_post_length_bytes); @@ -70,7 +71,7 @@ void SetSslOptions(WebserverOptions* opts) { &opts->certificate_file, &opts->private_key_file, &password)); - opts->private_key_password_cmd = strings::Substitute("echo $0", password); + opts->private_key_password_cmd = Substitute("echo $0", password); } void SetHTPasswdOptions(WebserverOptions* opts) { @@ -106,6 +107,7 @@ class WebserverTest : public KuduTest { ASSERT_EQ(addrs.size(), 1); ASSERT_TRUE(addrs[0].IsWildcard()); ASSERT_OK(addr_.ParseString("127.0.0.1", addrs[0].port())); + url_ = Substitute("http://$0", addr_.ToString()); } protected: @@ -119,7 +121,7 @@ class WebserverTest : public KuduTest { faststring buf_; unique_ptr<Webserver> server_; Sockaddr addr_; - + string url_; string static_dir_; }; @@ -136,14 +138,13 @@ class PasswdWebserverTest : public WebserverTest { // Send a HTTP request with no username and password. It should reject // the request as the .htpasswd is presented to webserver. TEST_F(PasswdWebserverTest, TestPasswdMissing) { - Status status = curl_.FetchURL(strings::Substitute("http://$0/", addr_.ToString()), - &buf_); + Status status = curl_.FetchURL(url_, &buf_); ASSERT_EQ("Remote error: HTTP 401", status.ToString()); } TEST_F(PasswdWebserverTest, TestPasswdPresent) { - string auth_url = strings::Substitute("http://$0@$1/", security::kTestAuthString, - addr_.ToString()); + string auth_url = Substitute("http://$0@$1/", security::kTestAuthString, + addr_.ToString()); ASSERT_OK(curl_.FetchURL(auth_url, &buf_)); } @@ -166,12 +167,11 @@ class SpnegoWebserverTest : public WebserverTest { } Status DoSpnegoCurl() { - EasyCurl c; - c.set_use_spnego(true); + curl_.set_use_spnego(true); if (VLOG_IS_ON(1)) { - c.set_verbose(true); + curl_.set_verbose(true); } - return c.FetchURL(strings::Substitute("http://$0/", addr_.ToString()), &buf_); + return curl_.FetchURL(url_, &buf_); } unique_ptr<MiniKdc> kdc_; @@ -224,12 +224,10 @@ TEST_F(SpnegoWebserverTest, TestUnauthenticatedNoClientAuth) { // Test some malformed authorization headers. TEST_F(SpnegoWebserverTest, TestInvalidHeaders) { - const string& url = strings::Substitute("http://$0/", addr_.ToString()); - EasyCurl c; - EXPECT_EQ(c.FetchURL(url, &buf_, { "Authorization: blahblah" }).ToString(), + EXPECT_EQ(curl_.FetchURL(url_, &buf_, { "Authorization: blahblah" }).ToString(), "Remote error: HTTP 500"); EXPECT_STR_CONTAINS(buf_.ToString(), "bad Negotiate header"); - EXPECT_EQ(c.FetchURL(url, &buf_, { "Authorization: Negotiate aaa" }).ToString(), + EXPECT_EQ(curl_.FetchURL(url_, &buf_, { "Authorization: Negotiate aaa" }).ToString(), "Remote error: HTTP 401"); EXPECT_STR_CONTAINS(buf_.ToString(), "Invalid token was supplied"); } @@ -237,11 +235,8 @@ TEST_F(SpnegoWebserverTest, TestInvalidHeaders) { // Test that if no authorization header at all is provided, the response // contains an empty "WWW-Authenticate: Negotiate" header. TEST_F(SpnegoWebserverTest, TestNoAuthHeader) { - const string& url = strings::Substitute("http://$0/", addr_.ToString()); - EasyCurl c; - c.set_return_headers(true); - ASSERT_EQ(c.FetchURL(url, &buf_).ToString(), - "Remote error: HTTP 401"); + curl_.set_return_headers(true); + ASSERT_EQ(curl_.FetchURL(url_, &buf_).ToString(), "Remote error: HTTP 401"); ASSERT_STR_CONTAINS(buf_.ToString(), "WWW-Authenticate: Negotiate\r\n"); } @@ -253,8 +248,6 @@ TEST_F(SpnegoWebserverTest, TestNoAuthHeader) { // from some previous run of SPNEGO on a different KDC. This test is primarily concerned // with defending against remote buffer overflows during token parsing, etc. TEST_F(SpnegoWebserverTest, TestBitFlippedTokens) { - const string& url = strings::Substitute("http://$0/", addr_.ToString()); - EasyCurl c; string token; CHECK(strings::Base64Unescape(kWellFormedTokenBase64, &token)); @@ -265,8 +258,8 @@ TEST_F(SpnegoWebserverTest, TestBitFlippedTokens) { token[i] ^= 1 << bit; string b64_token; strings::Base64Escape(token, &b64_token); - string header = strings::Substitute("Authorization: Negotiate $0", b64_token); - Status s = c.FetchURL(url, &buf_, { header }); + string header = Substitute("Authorization: Negotiate $0", b64_token); + Status s = curl_.FetchURL(url_, &buf_, { header }); EXPECT_TRUE(s.IsRemoteError()) << s.ToString(); token[i] ^= 1 << bit; } @@ -278,8 +271,6 @@ TEST_F(SpnegoWebserverTest, TestBitFlippedTokens) { // // NOTE: see above regarding "well-formed" vs "valid". TEST_F(SpnegoWebserverTest, TestTruncatedTokens) { - const string& url = strings::Substitute("http://$0/", addr_.ToString()); - EasyCurl c; string token; CHECK(strings::Base64Unescape(kWellFormedTokenBase64, &token)); @@ -288,16 +279,15 @@ TEST_F(SpnegoWebserverTest, TestTruncatedTokens) { SCOPED_TRACE(token.size()); string b64_token; strings::Base64Escape(token, &b64_token); - string header = strings::Substitute("Authorization: Negotiate $0", b64_token); - Status s = c.FetchURL(url, &buf_, { header }); + string header = Substitute("Authorization: Negotiate $0", b64_token); + Status s = curl_.FetchURL(url_, &buf_, { header }); EXPECT_TRUE(s.IsRemoteError()) << s.ToString(); } while (!token.empty()); } TEST_F(WebserverTest, TestIndexPage) { curl_.set_return_headers(true); - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(url_, &buf_)); // Check expected header. ASSERT_STR_CONTAINS(buf_.ToString(), "X-Frame-Options: DENY"); @@ -309,12 +299,11 @@ TEST_F(WebserverTest, TestIndexPage) { } TEST_F(WebserverTest, TestHttpCompression) { - string url = strings::Substitute("http://$0/", addr_.ToString()); std::ostringstream oss; string decoded_str; // Curl with gzip compression enabled. - ASSERT_OK(curl_.FetchURL(url, &buf_, {"Accept-Encoding: deflate, br, gzip"})); + ASSERT_OK(curl_.FetchURL(url_, &buf_, {"Accept-Encoding: deflate, br, gzip"})); // If compressed successfully, we should be able to uncompress. ASSERT_OK(zlib::Uncompress(Slice(buf_.ToString()), &oss)); @@ -328,14 +317,14 @@ TEST_F(WebserverTest, TestHttpCompression) { // Should have expected header when compressed with headers returned. curl_.set_return_headers(true); - ASSERT_OK(curl_.FetchURL(url, &buf_, + ASSERT_OK(curl_.FetchURL(url_, &buf_, {"Accept-Encoding: deflate, megaturbogzip, gzip , br"})); ASSERT_STR_CONTAINS(buf_.ToString(), "Content-Encoding: gzip"); // Curl with compression disabled. curl_.set_return_headers(true); - ASSERT_OK(curl_.FetchURL(url, &buf_)); + ASSERT_OK(curl_.FetchURL(url_, &buf_)); // Check expected header. ASSERT_STR_CONTAINS(buf_.ToString(), "Content-Type:"); @@ -351,7 +340,7 @@ TEST_F(WebserverTest, TestHttpCompression) { // Curl with compression enabled but not accepted by Kudu. curl_.set_return_headers(true); - ASSERT_OK(curl_.FetchURL(url, &buf_, {"Accept-Encoding: megaturbogzip, deflate, xz"})); + ASSERT_OK(curl_.FetchURL(url_, &buf_, {"Accept-Encoding: megaturbogzip, deflate, xz"})); // Check expected header. ASSERT_STR_CONTAINS(buf_.ToString(), "HTTP/1.1 200 OK"); @@ -369,16 +358,14 @@ TEST_F(SslWebserverTest, TestSSL) { // We use a self-signed cert, so we need to disable cert verification in curl. curl_.set_verify_peer(false); - ASSERT_OK(curl_.FetchURL(strings::Substitute("https://$0/", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(Substitute("https://$0/", addr_.ToString()), &buf_)); // Should have expected title. ASSERT_STR_CONTAINS(buf_.ToString(), "Kudu"); } TEST_F(WebserverTest, TestDefaultPaths) { // Test memz - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/memz?raw=1", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(Substitute("$0/memz?raw=1", url_), &buf_)); #ifdef TCMALLOC_ENABLED ASSERT_STR_CONTAINS(buf_.ToString(), "Bytes in use by application"); #else @@ -386,23 +373,20 @@ TEST_F(WebserverTest, TestDefaultPaths) { #endif // Test varz -- check for one of the built-in gflags flags. - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/varz?raw=1", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(Substitute("$0/varz?raw=1", url_), &buf_)); ASSERT_STR_CONTAINS(buf_.ToString(), "--v="); } TEST_F(WebserverTest, TestRedactFlagsDump) { kudu::g_should_redact = kudu::RedactContext::ALL; // Test varz -- check for the sensitive flag is redacted and HTML-escaped. - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/varz", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(Substitute("$0/varz", url_), &buf_)); ASSERT_STR_CONTAINS(buf_.ToString(), "--test_sensitive_flag=<redacted>"); // Test varz?raw -- check for the sensitive flag is redacted and not HTML-escaped. - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/varz?raw=1", addr_.ToString()), - &buf_)); - ASSERT_STR_CONTAINS(buf_.ToString(), strings::Substitute("--test_sensitive_flag=$0", - kRedactionMessage)); + ASSERT_OK(curl_.FetchURL(Substitute("$0/varz?raw=1", url_), &buf_)); + ASSERT_STR_CONTAINS(buf_.ToString(), Substitute("--test_sensitive_flag=$0", + kRedactionMessage)); } // Used in symbolization test below. @@ -412,15 +396,13 @@ void SomeMethodForSymbolTest2() {} TEST_F(WebserverTest, TestPprofPaths) { // Test /pprof/cmdline GET - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/pprof/cmdline", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(Substitute("$0/pprof/cmdline", url_), &buf_)); ASSERT_STR_CONTAINS(buf_.ToString(), "webserver-test"); ASSERT_TRUE(!HasSuffixString(buf_.ToString(), string("\x00", 1))) << "should not have trailing NULL: " << Slice(buf_).ToDebugString(); // Test /pprof/symbol GET - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/pprof/symbol", addr_.ToString()), - &buf_)); + ASSERT_OK(curl_.FetchURL(Substitute("$0/pprof/symbol", url_), &buf_)); ASSERT_EQ(buf_.ToString(), "num_symbols: 1"); // Test /pprof/symbol POST @@ -430,8 +412,7 @@ TEST_F(WebserverTest, TestPprofPaths) { &SomeMethodForSymbolTest1, &SomeMethodForSymbolTest2); SCOPED_TRACE(req); - ASSERT_OK(curl_.PostToURL(strings::Substitute("http://$0/pprof/symbol", addr_.ToString()), - req, &buf_)); + ASSERT_OK(curl_.PostToURL(Substitute("$0/pprof/symbol", url_), req, &buf_)); ASSERT_EQ(buf_.ToString(), StringPrintf("%p\tkudu::SomeMethodForSymbolTest1()\n" "%p\tkudu::SomeMethodForSymbolTest2()\n", @@ -445,8 +426,7 @@ TEST_F(WebserverTest, TestPprofPaths) { TEST_F(WebserverTest, TestPostTooBig) { FLAGS_webserver_max_post_length_bytes = 10; string req(10000, 'c'); - Status s = curl_.PostToURL(strings::Substitute("http://$0/pprof/symbol", addr_.ToString()), - req, &buf_); + Status s = curl_.PostToURL(Substitute("$0/pprof/symbol", url_), req, &buf_); ASSERT_EQ("Remote error: HTTP 413", s.ToString()); } @@ -454,21 +434,18 @@ TEST_F(WebserverTest, TestPostTooBig) { // disabled. TEST_F(WebserverTest, TestStaticFiles) { // Fetch a non-existent static file. - Status s = curl_.FetchURL(strings::Substitute("http://$0/foo.txt", addr_.ToString()), - &buf_); + Status s = curl_.FetchURL(Substitute("$0/foo.txt", url_), &buf_); ASSERT_EQ("Remote error: HTTP 404", s.ToString()); // Create the file and fetch again. This time it should succeed. ASSERT_OK(WriteStringToFile(env_, "hello world", - strings::Substitute("$0/foo.txt", static_dir_))); - ASSERT_OK(curl_.FetchURL(strings::Substitute("http://$0/foo.txt", addr_.ToString()), - &buf_)); + Substitute("$0/foo.txt", static_dir_))); + ASSERT_OK(curl_.FetchURL(Substitute("$0/foo.txt", url_), &buf_)); ASSERT_EQ("hello world", buf_.ToString()); // Create a directory and ensure that subdirectory listing is disabled. - ASSERT_OK(env_->CreateDir(strings::Substitute("$0/dir", static_dir_))); - s = curl_.FetchURL(strings::Substitute("http://$0/dir/", addr_.ToString()), - &buf_); + ASSERT_OK(env_->CreateDir(Substitute("$0/dir", static_dir_))); + s = curl_.FetchURL(Substitute("$0/dir/", url_), &buf_); ASSERT_EQ("Remote error: HTTP 403", s.ToString()); }
