blob: 675d3b437e7257c42ef9d80c70d08178b714701b [file] [log] [blame]
maxbogue334611e2015-02-20 04:08:171// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
maxbogue455a57e32016-08-14 00:08:325#include "components/sync/driver/sync_stopped_reporter.h"
maxbogue334611e2015-02-20 04:08:176
Sebastien Marchand53801a32019-01-25 16:26:117#include "base/bind.h"
maxbogue334611e2015-02-20 04:08:178#include "base/run_loop.h"
Mark Pilgrim215ccf92018-06-11 22:32:199#include "base/test/bind_test_util.h"
gaba6f72322017-03-02 00:46:1410#include "base/test/scoped_mock_time_message_loop_task_runner.h"
Gabriel Charettec7108742019-08-23 03:31:4011#include "base/test/task_environment.h"
Max Boguefef332d2016-07-28 22:09:0912#include "components/sync/protocol/sync.pb.h"
maxbogue334611e2015-02-20 04:08:1713#include "net/http/http_status_code.h"
Mark Pilgrim215ccf92018-06-11 22:32:1914#include "net/http/http_util.h"
15#include "services/network/public/cpp/resource_request.h"
16#include "services/network/public/cpp/shared_url_loader_factory.h"
17#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
18#include "services/network/test/test_url_loader_factory.h"
John Abd-El-Malek2c58b142018-06-28 14:40:3019#include "services/network/test/test_utils.h"
maxbogue334611e2015-02-20 04:08:1720#include "testing/gtest/include/gtest/gtest.h"
maxbogue334611e2015-02-20 04:08:1721
maxbogue7e006db2016-10-03 19:48:2822namespace syncer {
maxbogue334611e2015-02-20 04:08:1723
24const char kTestURL[] = "http://chromium.org/test";
25const char kTestURLTrailingSlash[] = "http://chromium.org/test/";
26const char kEventURL[] = "http://chromium.org/test/event";
27
maxbogueb18b9202015-08-11 17:52:1228const char kTestUserAgent[] = "the_fifth_element";
maxbogue334611e2015-02-20 04:08:1729const char kAuthToken[] = "multipass";
30const char kCacheGuid[] = "leeloo";
31const char kBirthday[] = "2263";
32
maxboguec5c836a2015-06-15 22:16:3833const char kAuthHeaderPrefix[] = "Bearer ";
34
maxbogue334611e2015-02-20 04:08:1735class SyncStoppedReporterTest : public testing::Test {
Mark Pilgrim215ccf92018-06-11 22:32:1936 protected:
maxbogue334611e2015-02-20 04:08:1737 SyncStoppedReporterTest() {}
38 ~SyncStoppedReporterTest() override {}
39
40 void SetUp() override {
Mark Pilgrim215ccf92018-06-11 22:32:1941 test_shared_loader_factory_ =
42 base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
43 url_loader_factory());
maxbogue334611e2015-02-20 04:08:1744 }
45
46 void RequestFinishedCallback(const SyncStoppedReporter::Result& result) {
47 request_result_ = result;
48 }
49
Mark Pilgrim215ccf92018-06-11 22:32:1950 GURL interception_url(const GURL& url) {
51 return SyncStoppedReporter::GetSyncEventURL(url);
52 }
53
maxbogue455a57e32016-08-14 00:08:3254 GURL test_url() { return GURL(kTestURL); }
maxbogue334611e2015-02-20 04:08:1755
Mark Pilgrim215ccf92018-06-11 22:32:1956 void call_on_timeout(SyncStoppedReporter* ssr) { ssr->OnTimeout(); }
57
maxbogue455a57e32016-08-14 00:08:3258 std::string user_agent() const { return std::string(kTestUserAgent); }
maxbogueb18b9202015-08-11 17:52:1259
maxbogue334611e2015-02-20 04:08:1760 SyncStoppedReporter::ResultCallback callback() {
61 return base::Bind(&SyncStoppedReporterTest::RequestFinishedCallback,
62 base::Unretained(this));
63 }
64
65 const SyncStoppedReporter::Result& request_result() const {
66 return request_result_;
67 }
68
Mark Pilgrim215ccf92018-06-11 22:32:1969 network::TestURLLoaderFactory* url_loader_factory() {
70 return &test_url_loader_factory_;
71 }
72
73 scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory() {
74 return test_shared_loader_factory_;
maxbogue334611e2015-02-20 04:08:1775 }
76
77 private:
Gabriel Charettedfa36042019-08-19 17:30:1178 base::test::TaskEnvironment task_environment_;
Mark Pilgrim215ccf92018-06-11 22:32:1979 network::TestURLLoaderFactory test_url_loader_factory_;
80 scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
maxbogue334611e2015-02-20 04:08:1781 SyncStoppedReporter::Result request_result_;
82
83 DISALLOW_COPY_AND_ASSIGN(SyncStoppedReporterTest);
84};
85
86// Test that the event URL gets constructed correctly.
87TEST_F(SyncStoppedReporterTest, EventURL) {
Mark Pilgrim215ccf92018-06-11 22:32:1988 GURL intercepted_url;
89 url_loader_factory()->AddResponse(interception_url(GURL(kTestURL)).spec(),
90 "");
91 url_loader_factory()->SetInterceptor(
92 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
93 intercepted_url = request.url;
94 }));
95 SyncStoppedReporter ssr(GURL(kTestURL), user_agent(),
96 shared_url_loader_factory(), callback());
maxbogue334611e2015-02-20 04:08:1797 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
Mark Pilgrim215ccf92018-06-11 22:32:1998 EXPECT_EQ(kEventURL, intercepted_url.spec());
maxbogue334611e2015-02-20 04:08:1799}
100
101// Test that the event URL gets constructed correctly with a trailing slash.
102TEST_F(SyncStoppedReporterTest, EventURLWithSlash) {
Mark Pilgrim215ccf92018-06-11 22:32:19103 GURL intercepted_url;
104 url_loader_factory()->AddResponse(
105 interception_url(GURL(kTestURLTrailingSlash)).spec(), "");
106 url_loader_factory()->SetInterceptor(
107 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
108 intercepted_url = request.url;
109 }));
maxbogueb18b9202015-08-11 17:52:12110 SyncStoppedReporter ssr(GURL(kTestURLTrailingSlash), user_agent(),
Mark Pilgrim215ccf92018-06-11 22:32:19111 shared_url_loader_factory(), callback());
maxbogue334611e2015-02-20 04:08:17112 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
Mark Pilgrim215ccf92018-06-11 22:32:19113 EXPECT_EQ(kEventURL, intercepted_url.spec());
maxbogue334611e2015-02-20 04:08:17114}
115
116// Test that the URLFetcher gets configured correctly.
117TEST_F(SyncStoppedReporterTest, FetcherConfiguration) {
Mark Pilgrim215ccf92018-06-11 22:32:19118 GURL intercepted_url;
119 net::HttpRequestHeaders intercepted_headers;
120 std::string intercepted_body;
121 url_loader_factory()->AddResponse(interception_url(test_url()).spec(), "");
122 url_loader_factory()->SetInterceptor(
123 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
124 intercepted_url = request.url;
125 intercepted_headers = request.headers;
John Abd-El-Malek2c58b142018-06-28 14:40:30126 intercepted_body = network::GetUploadData(request);
Mark Pilgrim215ccf92018-06-11 22:32:19127 }));
128 SyncStoppedReporter ssr(test_url(), user_agent(), shared_url_loader_factory(),
maxbogue455a57e32016-08-14 00:08:32129 callback());
maxbogue334611e2015-02-20 04:08:17130 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
maxbogue334611e2015-02-20 04:08:17131
maxboguec5c836a2015-06-15 22:16:38132 // Ensure the headers are set correctly.
maxboguec5c836a2015-06-15 22:16:38133 std::string header;
Mark Pilgrim215ccf92018-06-11 22:32:19134 intercepted_headers.GetHeader(net::HttpRequestHeaders::kAuthorization,
135 &header);
maxboguec5c836a2015-06-15 22:16:38136 std::string auth_header(kAuthHeaderPrefix);
137 auth_header.append(kAuthToken);
138 EXPECT_EQ(auth_header, header);
Mark Pilgrim215ccf92018-06-11 22:32:19139 intercepted_headers.GetHeader(net::HttpRequestHeaders::kUserAgent, &header);
maxbogueb18b9202015-08-11 17:52:12140 EXPECT_EQ(user_agent(), header);
maxboguec5c836a2015-06-15 22:16:38141
maxbogue334611e2015-02-20 04:08:17142 sync_pb::EventRequest event_request;
Mark Pilgrim215ccf92018-06-11 22:32:19143 event_request.ParseFromString(intercepted_body);
maxbogue334611e2015-02-20 04:08:17144
145 EXPECT_EQ(kCacheGuid, event_request.sync_disabled().cache_guid());
146 EXPECT_EQ(kBirthday, event_request.sync_disabled().store_birthday());
Mark Pilgrim215ccf92018-06-11 22:32:19147 EXPECT_EQ(kEventURL, intercepted_url.spec());
maxbogue334611e2015-02-20 04:08:17148}
149
150TEST_F(SyncStoppedReporterTest, HappyCase) {
Mark Pilgrim215ccf92018-06-11 22:32:19151 url_loader_factory()->AddResponse(interception_url(test_url()).spec(), "");
152 SyncStoppedReporter ssr(test_url(), user_agent(), shared_url_loader_factory(),
maxbogue455a57e32016-08-14 00:08:32153 callback());
maxbogue334611e2015-02-20 04:08:17154 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
maxbogue334611e2015-02-20 04:08:17155 base::RunLoop run_loop;
156 run_loop.RunUntilIdle();
157 EXPECT_EQ(SyncStoppedReporter::RESULT_SUCCESS, request_result());
158}
159
160TEST_F(SyncStoppedReporterTest, ServerNotFound) {
Mark Pilgrim215ccf92018-06-11 22:32:19161 url_loader_factory()->AddResponse(interception_url(test_url()).spec(), "",
162 net::HTTP_NOT_FOUND);
163 SyncStoppedReporter ssr(test_url(), user_agent(), shared_url_loader_factory(),
maxbogue455a57e32016-08-14 00:08:32164 callback());
maxbogue334611e2015-02-20 04:08:17165 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
maxbogue334611e2015-02-20 04:08:17166 base::RunLoop run_loop;
167 run_loop.RunUntilIdle();
168 EXPECT_EQ(SyncStoppedReporter::RESULT_ERROR, request_result());
169}
170
maxbogue334611e2015-02-20 04:08:17171TEST_F(SyncStoppedReporterTest, Timeout) {
Mark Pilgrim215ccf92018-06-11 22:32:19172 url_loader_factory()->AddResponse(interception_url(test_url()).spec(), "");
gaba6f72322017-03-02 00:46:14173 // Mock the underlying loop's clock to trigger the timer at will.
174 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
175
Mark Pilgrim215ccf92018-06-11 22:32:19176 SyncStoppedReporter ssr(test_url(), user_agent(), shared_url_loader_factory(),
maxbogue455a57e32016-08-14 00:08:32177 callback());
maxbogue334611e2015-02-20 04:08:17178
maxbogue334611e2015-02-20 04:08:17179 // Begin request.
180 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
181
182 // Trigger the timeout.
gaba6f72322017-03-02 00:46:14183 ASSERT_TRUE(mock_main_runner->HasPendingTask());
Mark Pilgrim215ccf92018-06-11 22:32:19184 call_on_timeout(&ssr);
gaba6f72322017-03-02 00:46:14185 mock_main_runner->FastForwardUntilNoTasksRemain();
maxbogue334611e2015-02-20 04:08:17186 EXPECT_EQ(SyncStoppedReporter::RESULT_TIMEOUT, request_result());
187}
188
189TEST_F(SyncStoppedReporterTest, NoCallback) {
Mark Pilgrim215ccf92018-06-11 22:32:19190 url_loader_factory()->AddResponse(interception_url(GURL(kTestURL)).spec(),
191 "");
192 SyncStoppedReporter ssr(GURL(kTestURL), user_agent(),
193 shared_url_loader_factory(),
maxbogue334611e2015-02-20 04:08:17194 SyncStoppedReporter::ResultCallback());
195 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
Mark Pilgrim215ccf92018-06-11 22:32:19196 base::RunLoop run_loop;
197 run_loop.RunUntilIdle();
maxbogue334611e2015-02-20 04:08:17198}
199
200TEST_F(SyncStoppedReporterTest, NoCallbackTimeout) {
Mark Pilgrim215ccf92018-06-11 22:32:19201 url_loader_factory()->AddResponse(interception_url(GURL(kTestURL)).spec(),
202 "");
gaba6f72322017-03-02 00:46:14203 // Mock the underlying loop's clock to trigger the timer at will.
204 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
205
Mark Pilgrim215ccf92018-06-11 22:32:19206 SyncStoppedReporter ssr(GURL(kTestURL), user_agent(),
207 shared_url_loader_factory(),
maxbogue334611e2015-02-20 04:08:17208 SyncStoppedReporter::ResultCallback());
209
maxbogue334611e2015-02-20 04:08:17210 // Begin request.
211 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
212
213 // Trigger the timeout.
gaba6f72322017-03-02 00:46:14214 ASSERT_TRUE(mock_main_runner->HasPendingTask());
Mark Pilgrim215ccf92018-06-11 22:32:19215 call_on_timeout(&ssr);
gaba6f72322017-03-02 00:46:14216 mock_main_runner->FastForwardUntilNoTasksRemain();
maxbogue334611e2015-02-20 04:08:17217}
maxbogue7e006db2016-10-03 19:48:28218
219} // namespace syncer