1 // Copyright 2016 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
5 #include "content/test/mock_background_sync_controller.h"
6 #include "base/metrics/field_trial_params.h"
7 #include "base/strings/string_number_conversions.h"
8 #include "base/time/time.h"
9
10 namespace {
11
12 const char kFieldTrialName[] = "BackgroundSync";
13 const char kMaxAttemptsParameterName[] = "max_sync_attempts";
14 const char kMinPeriodicSyncEventsInterval[] =
15 "min_periodic_sync_events_interval_sec";
16
17 } // namespace
18
19 namespace content {
20
21 MockBackgroundSyncController::MockBackgroundSyncController() = default;
22
23 MockBackgroundSyncController::~MockBackgroundSyncController() = default;
24
NotifyOneShotBackgroundSyncRegistered(const url::Origin & origin,bool can_fire,bool is_reregistered)25 void MockBackgroundSyncController::NotifyOneShotBackgroundSyncRegistered(
26 const url::Origin& origin,
27 bool can_fire,
28 bool is_reregistered) {
29 registration_count_ += 1;
30 registration_origin_ = origin;
31 }
32
ScheduleBrowserWakeUpWithDelay(blink::mojom::BackgroundSyncType sync_type,base::TimeDelta delay)33 void MockBackgroundSyncController::ScheduleBrowserWakeUpWithDelay(
34 blink::mojom::BackgroundSyncType sync_type,
35 base::TimeDelta delay) {
36 if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC) {
37 run_in_background_for_periodic_sync_count_ += 1;
38 periodic_sync_browser_wakeup_delay_ = delay;
39 return;
40 }
41 run_in_background_for_one_shot_sync_count_ += 1;
42 one_shot_sync_browser_wakeup_delay_ = delay;
43 }
44
CancelBrowserWakeup(blink::mojom::BackgroundSyncType sync_type)45 void MockBackgroundSyncController::CancelBrowserWakeup(
46 blink::mojom::BackgroundSyncType sync_type) {
47 if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC) {
48 periodic_sync_browser_wakeup_delay_ = base::TimeDelta::Max();
49 } else {
50 one_shot_sync_browser_wakeup_delay_ = base::TimeDelta::Max();
51 }
52 }
53
ApplyFieldTrialParamsOverrides()54 void MockBackgroundSyncController::ApplyFieldTrialParamsOverrides() {
55 std::map<std::string, std::string> field_params;
56 if (!base::GetFieldTrialParams(kFieldTrialName, &field_params))
57 return;
58
59 if (base::Contains(field_params, kMaxAttemptsParameterName)) {
60 int max_attempts;
61 if (base::StringToInt(field_params[kMaxAttemptsParameterName],
62 &max_attempts)) {
63 background_sync_parameters_.max_sync_attempts = max_attempts;
64 }
65 }
66
67 if (base::Contains(field_params, kMinPeriodicSyncEventsInterval)) {
68 int min_periodic_sync_events_interval_sec;
69 if (base::StringToInt(field_params[kMinPeriodicSyncEventsInterval],
70 &min_periodic_sync_events_interval_sec)) {
71 background_sync_parameters_.min_periodic_sync_events_interval =
72 base::TimeDelta::FromSeconds(min_periodic_sync_events_interval_sec);
73 }
74 }
75 }
76
GetParameterOverrides(BackgroundSyncParameters * parameters)77 void MockBackgroundSyncController::GetParameterOverrides(
78 BackgroundSyncParameters* parameters) {
79 ApplyFieldTrialParamsOverrides();
80 *parameters = background_sync_parameters_;
81 }
82
GetNextEventDelay(const BackgroundSyncRegistration & registration,BackgroundSyncParameters * parameters,base::TimeDelta time_till_soonest_scheduled_event_for_origin)83 base::TimeDelta MockBackgroundSyncController::GetNextEventDelay(
84 const BackgroundSyncRegistration& registration,
85 BackgroundSyncParameters* parameters,
86 base::TimeDelta time_till_soonest_scheduled_event_for_origin) {
87 DCHECK(parameters);
88
89 if (suspended_periodic_sync_origins_.count(registration.origin()))
90 return base::TimeDelta::Max();
91
92 int num_attempts = registration.num_attempts();
93
94 if (!num_attempts) {
95 // First attempt.
96 switch (registration.sync_type()) {
97 case blink::mojom::BackgroundSyncType::ONE_SHOT:
98 return base::TimeDelta();
99 case blink::mojom::BackgroundSyncType::PERIODIC:
100 int64_t effective_gap_ms =
101 parameters->min_periodic_sync_events_interval.InMilliseconds();
102 return base::TimeDelta::FromMilliseconds(
103 std::max(registration.options()->min_interval, effective_gap_ms));
104 }
105 }
106
107 // After a sync event has been fired.
108 DCHECK_LT(num_attempts, parameters->max_sync_attempts);
109 return parameters->initial_retry_delay *
110 pow(parameters->retry_delay_factor, num_attempts - 1);
111 }
112
113 std::unique_ptr<BackgroundSyncController::BackgroundSyncEventKeepAlive>
CreateBackgroundSyncEventKeepAlive()114 MockBackgroundSyncController::CreateBackgroundSyncEventKeepAlive() {
115 return nullptr;
116 }
117
NoteSuspendedPeriodicSyncOrigins(std::set<url::Origin> suspended_origins)118 void MockBackgroundSyncController::NoteSuspendedPeriodicSyncOrigins(
119 std::set<url::Origin> suspended_origins) {
120 for (auto& origin : suspended_origins)
121 suspended_periodic_sync_origins_.insert(std::move(origin));
122 }
123
NoteRegisteredPeriodicSyncOrigins(std::set<url::Origin> registered_origins)124 void MockBackgroundSyncController::NoteRegisteredPeriodicSyncOrigins(
125 std::set<url::Origin> registered_origins) {
126 for (auto& origin : registered_origins)
127 suspended_periodic_sync_origins_.insert(std::move(origin));
128 }
129
AddToTrackedOrigins(const url::Origin & origin)130 void MockBackgroundSyncController::AddToTrackedOrigins(
131 const url::Origin& origin) {
132 periodic_sync_origins_.insert(origin);
133 }
134
RemoveFromTrackedOrigins(const url::Origin & origin)135 void MockBackgroundSyncController::RemoveFromTrackedOrigins(
136 const url::Origin& origin) {
137 periodic_sync_origins_.erase(origin);
138 }
139
140 } // namespace content
141