• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 #ifndef CHROMEOS_NETWORK_PORTAL_DETECTOR_NETWORK_PORTAL_DETECTOR_STRATEGY_H_
6 #define CHROMEOS_NETWORK_PORTAL_DETECTOR_NETWORK_PORTAL_DETECTOR_STRATEGY_H_
7 
8 #include "base/basictypes.h"
9 #include "base/compiler_specific.h"
10 #include "base/macros.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/time/time.h"
13 #include "chromeos/chromeos_export.h"
14 #include "net/base/backoff_entry.h"
15 
16 namespace chromeos {
17 
18 class CHROMEOS_EXPORT PortalDetectorStrategy {
19  public:
20   enum StrategyId {
21     STRATEGY_ID_LOGIN_SCREEN,
22     STRATEGY_ID_ERROR_SCREEN,
23     STRATEGY_ID_SESSION
24   };
25 
26   class Delegate {
27    public:
~Delegate()28     virtual ~Delegate() {}
29 
30     // Returns number of attempts in a row with NO RESPONSE result.
31     // If last detection attempt has different result, returns 0.
32     virtual int NoResponseResultCount() = 0;
33 
34     // Returns time when current attempt was started.
35     virtual base::TimeTicks AttemptStartTime() = 0;
36 
37     // Returns current TimeTicks.
38     virtual base::TimeTicks GetCurrentTimeTicks() = 0;
39   };
40 
41   virtual ~PortalDetectorStrategy();
42 
43   static scoped_ptr<PortalDetectorStrategy> CreateById(StrategyId id,
44                                                        Delegate* delegate);
45 
46   // Returns delay before next detection attempt. This delay is needed
47   // to separate detection attempts in time.
48   base::TimeDelta GetDelayTillNextAttempt();
49 
50   // Returns timeout for the next detection attempt.
51   base::TimeDelta GetNextAttemptTimeout();
52 
53   virtual StrategyId Id() const = 0;
54 
55   // Resets strategy to the initial state.
56   void Reset();
57 
policy()58   const net::BackoffEntry::Policy& policy() const { return policy_; }
59 
60   // Resets strategy to the initial stater and sets custom policy.
61   void SetPolicyAndReset(const net::BackoffEntry::Policy& policy);
62 
63   // Should be called when portal detection is completed and timeout before next
64   // attempt should be adjusted.
65   void OnDetectionCompleted();
66 
67  protected:
68   class BackoffEntryImpl;
69 
70   explicit PortalDetectorStrategy(Delegate* delegate);
71 
72   // Interface for subclasses:
73   virtual base::TimeDelta GetNextAttemptTimeoutImpl();
74 
75   Delegate* delegate_;
76   net::BackoffEntry::Policy policy_;
77   scoped_ptr<BackoffEntryImpl> backoff_entry_;
78 
79  private:
80   friend class NetworkPortalDetectorImplTest;
81   friend class NetworkPortalDetectorImplBrowserTest;
82 
set_delay_till_next_attempt_for_testing(const base::TimeDelta & timeout)83   static void set_delay_till_next_attempt_for_testing(
84       const base::TimeDelta& timeout) {
85     delay_till_next_attempt_for_testing_ = timeout;
86     delay_till_next_attempt_for_testing_initialized_ = true;
87   }
88 
set_next_attempt_timeout_for_testing(const base::TimeDelta & timeout)89   static void set_next_attempt_timeout_for_testing(
90       const base::TimeDelta& timeout) {
91     next_attempt_timeout_for_testing_ = timeout;
92     next_attempt_timeout_for_testing_initialized_ = true;
93   }
94 
reset_fields_for_testing()95   static void reset_fields_for_testing() {
96     delay_till_next_attempt_for_testing_initialized_ = false;
97     next_attempt_timeout_for_testing_initialized_ = false;
98   }
99 
100   // Test delay before detection attempt, used by unit tests.
101   static base::TimeDelta delay_till_next_attempt_for_testing_;
102 
103   // True when |min_time_between_attempts_for_testing_| is initialized.
104   static bool delay_till_next_attempt_for_testing_initialized_;
105 
106   // Test timeout for a detection attempt, used by unit tests.
107   static base::TimeDelta next_attempt_timeout_for_testing_;
108 
109   // True when |next_attempt_timeout_for_testing_| is initialized.
110   static bool next_attempt_timeout_for_testing_initialized_;
111 
112   DISALLOW_COPY_AND_ASSIGN(PortalDetectorStrategy);
113 };
114 
115 }  // namespace chromeos
116 
117 #endif  // CHROMEOS_NETWORK_PORTAL_DETECTOR_NETWORK_PORTAL_DETECTOR_STRATEGY_H_
118