Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2573)

Unified Diff: net/reporting/reporting_uploader_unittest.cc

Issue 2723563002: Reporting: Implement uploader. (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« net/reporting/reporting_uploader.cc ('K') | « net/reporting/reporting_uploader.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/reporting/reporting_uploader_unittest.cc
diff --git a/net/reporting/reporting_uploader_unittest.cc b/net/reporting/reporting_uploader_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9dd50b4bde64cdf652c3edc2df22ead93a9b3656
--- /dev/null
+++ b/net/reporting/reporting_uploader_unittest.cc
@@ -0,0 +1,322 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/reporting/reporting_uploader.h"
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/run_loop.h"
+#include "net/cookies/cookie_store.h"
+#include "net/cookies/cookie_store_test_callbacks.h"
+#include "net/http/http_status_code.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+namespace {
+
+class ReportingUploaderTest : public ::testing::Test {
+ protected:
+ ReportingUploaderTest()
+ : server_(test_server::EmbeddedTestServer::TYPE_HTTPS),
+ uploader_(ReportingUploader::Create(&context_)) {}
+
+ TestURLRequestContext context_;
+ test_server::EmbeddedTestServer server_;
+ std::unique_ptr<ReportingUploader> uploader_;
+};
+
+const char kUploadBody[] = "{}";
+
+void CheckUpload(const test_server::HttpRequest& request) {
+ EXPECT_EQ("POST", request.method_string);
+ auto it = request.headers.find("Content-Type");
+ EXPECT_TRUE(it != request.headers.end());
+ EXPECT_EQ(ReportingUploader::kUploadContentType, it->second);
+ EXPECT_TRUE(request.has_content);
+ EXPECT_EQ(kUploadBody, request.content);
+}
+
+std::unique_ptr<test_server::HttpResponse> ReturnResponse(
+ HttpStatusCode code,
+ const test_server::HttpRequest& request) {
+ auto response = base::MakeUnique<test_server::BasicHttpResponse>();
+ response->set_code(code);
+ response->set_content("");
+ response->set_content_type("text/plain");
+ return std::move(response);
+}
+
+std::unique_ptr<test_server::HttpResponse> ReturnInvalidResponse(
+ const test_server::HttpRequest& request) {
+ return base::MakeUnique<test_server::RawHttpResponse>(
+ "", "Not a valid HTTP response.");
+}
+
+class TestUploadCallback {
+ public:
+ TestUploadCallback() : called_(false), waiting_(false) {}
+
+ ReportingUploader::Callback callback() {
+ return base::Bind(&TestUploadCallback::OnUploadComplete,
+ base::Unretained(this));
+ }
+
+ void WaitForCall() {
+ if (called_)
+ return;
+
+ base::RunLoop run_loop;
+
+ waiting_ = true;
+ closure_ = run_loop.QuitClosure();
+ run_loop.Run();
+ }
+
+ ReportingUploader::Outcome outcome() const { return outcome_; }
+
+ private:
+ void OnUploadComplete(ReportingUploader::Outcome outcome) {
+ EXPECT_FALSE(called_);
+
+ called_ = true;
+ outcome_ = outcome;
+
+ if (waiting_) {
+ waiting_ = false;
+ closure_.Run();
+ }
+ }
+
+ bool called_;
+ ReportingUploader::Outcome outcome_;
+
+ bool waiting_;
+ base::Closure closure_;
+};
+
+TEST_F(ReportingUploaderTest, Upload) {
+ server_.RegisterRequestMonitor(base::Bind(&CheckUpload));
+ server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+}
+
+TEST_F(ReportingUploaderTest, Success) {
+ server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_EQ(ReportingUploader::SUCCESS, callback.outcome());
+}
+
+TEST_F(ReportingUploaderTest, NetworkError1) {
+ ASSERT_TRUE(server_.Start());
+ GURL url = server_.GetURL("/");
+ ASSERT_TRUE(server_.ShutdownAndWaitUntilComplete());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(url, kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
+}
+
+TEST_F(ReportingUploaderTest, NetworkError2) {
+ server_.RegisterRequestHandler(base::Bind(&ReturnInvalidResponse));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
+}
+
+TEST_F(ReportingUploaderTest, ServerError) {
+ server_.RegisterRequestHandler(
+ base::Bind(&ReturnResponse, HTTP_INTERNAL_SERVER_ERROR));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
+}
+
+TEST_F(ReportingUploaderTest, RemoveEndpoint) {
+ server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_GONE));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_EQ(ReportingUploader::REMOVE_ENDPOINT, callback.outcome());
+}
+
+const char kRedirectPath[] = "/redirect";
+
+std::unique_ptr<test_server::HttpResponse> ReturnRedirect(
+ const std::string& location,
+ const test_server::HttpRequest& request) {
+ if (request.relative_url != "/")
+ return std::unique_ptr<test_server::HttpResponse>();
+
+ auto response = base::MakeUnique<test_server::BasicHttpResponse>();
+ response->set_code(HTTP_FOUND);
+ response->AddCustomHeader("Location", location);
+ response->set_content(
+ "Thank you, Mario! But our Princess is in another castle.");
+ response->set_content_type("text/plain");
+ return std::move(response);
+}
+
+std::unique_ptr<test_server::HttpResponse> CheckRedirect(
+ bool* redirect_followed_out,
+ const test_server::HttpRequest& request) {
+ if (request.relative_url != kRedirectPath)
+ return std::unique_ptr<test_server::HttpResponse>();
+
+ *redirect_followed_out = true;
+ return ReturnResponse(HTTP_OK, request);
+}
+
+TEST_F(ReportingUploaderTest, FollowHttpsRedirect) {
+ bool followed = false;
+ server_.RegisterRequestHandler(base::Bind(&ReturnRedirect, kRedirectPath));
+ server_.RegisterRequestHandler(base::Bind(&CheckRedirect, &followed));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_TRUE(followed);
+ EXPECT_EQ(ReportingUploader::SUCCESS, callback.outcome());
+}
+
+TEST_F(ReportingUploaderTest, DontFollowHttpRedirect) {
+ bool followed = false;
+
+ test_server::EmbeddedTestServer http_server_;
+ http_server_.RegisterRequestHandler(base::Bind(&CheckRedirect, &followed));
+ ASSERT_TRUE(http_server_.Start());
+
+ const GURL target = http_server_.GetURL(kRedirectPath);
+ server_.RegisterRequestHandler(base::Bind(&ReturnRedirect, target.spec()));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
+ callback.WaitForCall();
+
+ EXPECT_FALSE(followed);
+ EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
+}
+
+void CheckNoCookie(const test_server::HttpRequest& request) {
+ auto it = request.headers.find("Cookie");
+ EXPECT_TRUE(it == request.headers.end());
+}
+
+TEST_F(ReportingUploaderTest, DontSendCookies) {
+ server_.RegisterRequestMonitor(base::Bind(&CheckNoCookie));
+ server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
+ ASSERT_TRUE(server_.Start());
+
+ ResultSavingCookieCallback<bool> cookie_callback;
+ context_.cookie_store()->SetCookieWithOptionsAsync(
+ server_.GetURL("/"), "foo=bar", CookieOptions(),
+ base::Bind(&ResultSavingCookieCallback<bool>::Run,
+ base::Unretained(&cookie_callback)));
+ cookie_callback.WaitUntilDone();
+ ASSERT_TRUE(cookie_callback.result());
+
+ TestUploadCallback upload_callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+ upload_callback.callback());
+ upload_callback.WaitForCall();
+}
+
+std::unique_ptr<test_server::HttpResponse> SendCookie(
+ const test_server::HttpRequest& request) {
+ auto response = base::MakeUnique<test_server::BasicHttpResponse>();
+ response->set_code(HTTP_OK);
+ response->AddCustomHeader("Set-Cookie", "foo=bar");
+ response->set_content("");
+ response->set_content_type("text/plain");
+ return std::move(response);
+}
+
+TEST_F(ReportingUploaderTest, DontSaveCookies) {
+ server_.RegisterRequestHandler(base::Bind(&SendCookie));
+ ASSERT_TRUE(server_.Start());
+
+ TestUploadCallback upload_callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+ upload_callback.callback());
+ upload_callback.WaitForCall();
+
+ GetCookieListCallback cookie_callback;
+ context_.cookie_store()->GetCookieListWithOptionsAsync(
+ server_.GetURL("/"), CookieOptions(),
+ base::Bind(&GetCookieListCallback::Run,
+ base::Unretained(&cookie_callback)));
+ cookie_callback.WaitUntilDone();
+
+ EXPECT_TRUE(cookie_callback.cookies().empty());
+}
+
+std::unique_ptr<test_server::HttpResponse> ReturnCacheableResponse(
+ int* request_count_out,
+ const test_server::HttpRequest& request) {
+ ++*request_count_out;
+ auto response = base::MakeUnique<test_server::BasicHttpResponse>();
+ response->set_code(HTTP_OK);
+ response->AddCustomHeader("Cache-Control", "max-age=86400");
+ response->set_content("");
+ response->set_content_type("text/plain");
+ return std::move(response);
+}
+
+// TODO(juliatuttle): This passes even if the uploader doesn't set
+// LOAD_DISABLE_CACHE. Maybe that's okay -- Chromium might not cache POST
+// responses ever -- but this test should either not exist or be sure that it is
+// testing actual functionality, not a default.
+TEST_F(ReportingUploaderTest, DontCacheResponse) {
+ int request_count = 0;
+ server_.RegisterRequestHandler(
+ base::Bind(&ReturnCacheableResponse, &request_count));
+ ASSERT_TRUE(server_.Start());
+
+ {
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+ callback.callback());
+ callback.WaitForCall();
+ }
+ EXPECT_EQ(1, request_count);
+
+ {
+ TestUploadCallback callback;
+ uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
+ callback.callback());
+ callback.WaitForCall();
+ }
+ EXPECT_EQ(2, request_count);
+}
+
+} // namespace
+} // namespace net
« net/reporting/reporting_uploader.cc ('K') | « net/reporting/reporting_uploader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698