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