blob: e36927dbc68d4a8372cdcf2099ce5908a070d1e4 [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2015 The Chromium Authors
maxbogue334611e2015-02-20 04:08:172// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Mikel Astiz91c345c2023-05-16 14:18:565#include "components/sync/service/sync_stopped_reporter.h"
maxbogue334611e2015-02-20 04:08:176
maxbogue334611e2015-02-20 04:08:177#include "base/run_loop.h"
Guido Urdanetaef4e91942020-11-09 15:06:248#include "base/test/bind.h"
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:419#include "base/test/metrics/histogram_tester.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"
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:4112#include "base/time/time.h"
Max Boguefef332d2016-07-28 22:09:0913#include "components/sync/protocol/sync.pb.h"
maxbogue334611e2015-02-20 04:08:1714#include "net/http/http_status_code.h"
Mark Pilgrim215ccf92018-06-11 22:32:1915#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 {
Peter Boström9f667c382021-10-01 20:09:3136 public:
37 SyncStoppedReporterTest(const SyncStoppedReporterTest&) = delete;
38 SyncStoppedReporterTest& operator=(const SyncStoppedReporterTest&) = delete;
39
Mark Pilgrim215ccf92018-06-11 22:32:1940 protected:
Victor Hugo Vianna Silva988fe7322021-09-23 18:16:5641 SyncStoppedReporterTest() = default;
42 ~SyncStoppedReporterTest() override = default;
maxbogue334611e2015-02-20 04:08:1743
44 void SetUp() override {
Mark Pilgrim215ccf92018-06-11 22:32:1945 test_shared_loader_factory_ =
46 base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
47 url_loader_factory());
maxbogue334611e2015-02-20 04:08:1748 }
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
maxbogue455a57e32016-08-14 00:08:3256 std::string user_agent() const { return std::string(kTestUserAgent); }
maxbogueb18b9202015-08-11 17:52:1257
Mark Pilgrim215ccf92018-06-11 22:32:1958 network::TestURLLoaderFactory* url_loader_factory() {
59 return &test_url_loader_factory_;
60 }
61
62 scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory() {
63 return test_shared_loader_factory_;
maxbogue334611e2015-02-20 04:08:1764 }
65
66 private:
Gabriel Charette38720522019-09-10 14:14:1167 base::test::SingleThreadTaskEnvironment task_environment_;
Mark Pilgrim215ccf92018-06-11 22:32:1968 network::TestURLLoaderFactory test_url_loader_factory_;
69 scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
maxbogue334611e2015-02-20 04:08:1770};
71
72// Test that the event URL gets constructed correctly.
73TEST_F(SyncStoppedReporterTest, EventURL) {
Mark Pilgrim215ccf92018-06-11 22:32:1974 GURL intercepted_url;
75 url_loader_factory()->AddResponse(interception_url(GURL(kTestURL)).spec(),
76 "");
77 url_loader_factory()->SetInterceptor(
78 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
79 intercepted_url = request.url;
80 }));
81 SyncStoppedReporter ssr(GURL(kTestURL), user_agent(),
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:4182 shared_url_loader_factory());
maxbogue334611e2015-02-20 04:08:1783 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
Mark Pilgrim215ccf92018-06-11 22:32:1984 EXPECT_EQ(kEventURL, intercepted_url.spec());
maxbogue334611e2015-02-20 04:08:1785}
86
87// Test that the event URL gets constructed correctly with a trailing slash.
88TEST_F(SyncStoppedReporterTest, EventURLWithSlash) {
Mark Pilgrim215ccf92018-06-11 22:32:1989 GURL intercepted_url;
90 url_loader_factory()->AddResponse(
91 interception_url(GURL(kTestURLTrailingSlash)).spec(), "");
92 url_loader_factory()->SetInterceptor(
93 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
94 intercepted_url = request.url;
95 }));
maxbogueb18b9202015-08-11 17:52:1296 SyncStoppedReporter ssr(GURL(kTestURLTrailingSlash), user_agent(),
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:4197 shared_url_loader_factory());
maxbogue334611e2015-02-20 04:08:1798 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
Mark Pilgrim215ccf92018-06-11 22:32:1999 EXPECT_EQ(kEventURL, intercepted_url.spec());
maxbogue334611e2015-02-20 04:08:17100}
101
102// Test that the URLFetcher gets configured correctly.
103TEST_F(SyncStoppedReporterTest, FetcherConfiguration) {
Mark Pilgrim215ccf92018-06-11 22:32:19104 GURL intercepted_url;
105 net::HttpRequestHeaders intercepted_headers;
106 std::string intercepted_body;
107 url_loader_factory()->AddResponse(interception_url(test_url()).spec(), "");
108 url_loader_factory()->SetInterceptor(
109 base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
110 intercepted_url = request.url;
111 intercepted_headers = request.headers;
John Abd-El-Malek2c58b142018-06-28 14:40:30112 intercepted_body = network::GetUploadData(request);
Mark Pilgrim215ccf92018-06-11 22:32:19113 }));
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:41114 SyncStoppedReporter ssr(test_url(), user_agent(),
115 shared_url_loader_factory());
maxbogue334611e2015-02-20 04:08:17116 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
maxbogue334611e2015-02-20 04:08:17117
maxboguec5c836a2015-06-15 22:16:38118 // Ensure the headers are set correctly.
Chris Fredricksonb5b854f2024-07-31 08:11:20119 EXPECT_EQ(
120 base::StrCat({kAuthHeaderPrefix, kAuthToken}),
121 intercepted_headers.GetHeader(net::HttpRequestHeaders::kAuthorization)
122 .value_or(std::string()));
123 EXPECT_EQ(user_agent(),
124 intercepted_headers.GetHeader(net::HttpRequestHeaders::kUserAgent)
125 .value_or(std::string()));
maxboguec5c836a2015-06-15 22:16:38126
maxbogue334611e2015-02-20 04:08:17127 sync_pb::EventRequest event_request;
Mark Pilgrim215ccf92018-06-11 22:32:19128 event_request.ParseFromString(intercepted_body);
maxbogue334611e2015-02-20 04:08:17129
130 EXPECT_EQ(kCacheGuid, event_request.sync_disabled().cache_guid());
131 EXPECT_EQ(kBirthday, event_request.sync_disabled().store_birthday());
Mark Pilgrim215ccf92018-06-11 22:32:19132 EXPECT_EQ(kEventURL, intercepted_url.spec());
maxbogue334611e2015-02-20 04:08:17133}
134
135TEST_F(SyncStoppedReporterTest, HappyCase) {
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:41136 base::HistogramTester histogram_tester;
Mark Pilgrim215ccf92018-06-11 22:32:19137 url_loader_factory()->AddResponse(interception_url(test_url()).spec(), "");
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:41138 SyncStoppedReporter ssr(test_url(), user_agent(),
139 shared_url_loader_factory());
maxbogue334611e2015-02-20 04:08:17140 ssr.ReportSyncStopped(kAuthToken, kCacheGuid, kBirthday);
maxbogue334611e2015-02-20 04:08:17141 base::RunLoop run_loop;
142 run_loop.RunUntilIdle();
Victor Hugo Vianna Silva39fbdac2022-10-05 16:51:41143 histogram_tester.ExpectUniqueSample("Sync.SyncStoppedURLFetchResponse",
144 net::HTTP_OK, 1);
145 histogram_tester.ExpectUniqueSample("Sync.SyncStoppedURLFetchTimedOut", false,
146 1);
maxbogue334611e2015-02-20 04:08:17147}
148