15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_RETRY_VERIFIER_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_RETRY_VERIFIER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sessions {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncSessionSnapshot;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sessions
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The minimum and maximum wait times for a retry. The actual retry would take
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// place somewhere in this range. The algorithm that calculates the retry wait
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// time uses rand functions.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DelayInfo {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 min_delay;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 max_delay;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class to verify retries take place using the exponential backoff algorithm.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RetryVerifier {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kMaxRetry = 3;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryVerifier();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~RetryVerifier();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int retry_count() const { return retry_count_; }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize with the current sync session snapshot. Using the snapshot
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we will figure out when the first retry sync happened.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Initialize(const syncer::sessions::SyncSessionSnapshot& snap);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyRetryInterval(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::sessions::SyncSessionSnapshot& snap);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool done() const { return done_; }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Succeeded() const { return done() && success_; }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int retry_count_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_sync_time_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayInfo delay_table_[kMaxRetry];
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool done_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RetryVerifier);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_RETRY_VERIFIER_H_
50