1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_STRATEGY_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_STRATEGY_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/compiler_specific.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/macros.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/time/time.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace chromeos {
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PortalDetectorStrategy {
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum StrategyId {
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    STRATEGY_ID_LOGIN_SCREEN,
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    STRATEGY_ID_ERROR_SCREEN,
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    STRATEGY_ID_SESSION
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  class Delegate {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   public:
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Delegate() {}
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Returns number of performed attempts.
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual int AttemptCount() = 0;
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Returns time when current attempt was started.
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual base::TimeTicks AttemptStartTime() = 0;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Returns current TimeTicks.
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual base::TimeTicks GetCurrentTimeTicks() = 0;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~PortalDetectorStrategy();
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static scoped_ptr<PortalDetectorStrategy> CreateById(StrategyId id);
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true when detection attempt can be performed according to
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // current strategy.
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool CanPerformAttempt();
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if additional attempt could be scheduled after
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // detection.
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool CanPerformAttemptAfterDetection();
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns delay before next detection attempt. This delay is needed
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // to separate detection attempts in time.
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta GetDelayTillNextAttempt();
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns timeout for the next detection attempt.
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta GetNextAttemptTimeout();
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual StrategyId Id() const = 0;
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PortalDetectorStrategy();
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Interface for subclasses:
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool CanPerformAttemptImpl();
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool CanPerformAttemptAfterDetectionImpl();
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::TimeDelta GetDelayTillNextAttemptImpl();
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::TimeDelta GetNextAttemptTimeoutImpl();
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Adjusts |delay| according to current attempt count and elapsed time
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // since previous attempt.
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta AdjustDelay(const base::TimeDelta& delay);
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Delegate* delegate_;
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class NetworkPortalDetectorImplTest;
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class NetworkPortalDetectorImplBrowserTest;
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void set_delay_till_next_attempt_for_testing(
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::TimeDelta& timeout) {
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    delay_till_next_attempt_for_testing_ = timeout;
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    delay_till_next_attempt_for_testing_initialized_ = true;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void set_next_attempt_timeout_for_testing(
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::TimeDelta& timeout) {
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    next_attempt_timeout_for_testing_ = timeout;
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    next_attempt_timeout_for_testing_initialized_ = true;
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void reset_fields_for_testing() {
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    delay_till_next_attempt_for_testing_initialized_ = false;
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    next_attempt_timeout_for_testing_initialized_ = false;
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Test delay before detection attempt, used by unit tests.
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static base::TimeDelta delay_till_next_attempt_for_testing_;
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // True when |min_time_between_attempts_for_testing_| is initialized.
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static bool delay_till_next_attempt_for_testing_initialized_;
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Test timeout for a detection attempt, used by unit tests.
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static base::TimeDelta next_attempt_timeout_for_testing_;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // True when |next_attempt_timeout_for_testing_| is initialized.
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static bool next_attempt_timeout_for_testing_initialized_;
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PortalDetectorStrategy);
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace chromeos
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_STRATEGY_H_
114