172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_request_infobar_delegate.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_request_limiter.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// MockTabDownloadState -------------------------------------------------------
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockTabDownloadState : public DownloadRequestLimiter::TabDownloadState {
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MockTabDownloadState();
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~MockTabDownloadState();
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // DownloadRequestLimiter::TabDownloadState
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Cancel();
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Accept();
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ConfirmInfoBarDelegate* infobar() {
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return infobar_->AsConfirmInfoBarDelegate();
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void close_infobar() {
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // TODO(pkasting): Right now InfoBarDelegates delete themselves via
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // InfoBarClosed(); once InfoBars own their delegates, this can become a
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // simple reset() call and ~MockTabDownloadState() will no longer need to
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // call it.
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (infobar_ != NULL)
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      infobar_.release()->InfoBarClosed();
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool responded() const { return responded_; }
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool accepted() const { return accepted_; }
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The actual infobar delegate we're listening to.
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<InfoBarDelegate> infobar_;
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if we have gotten some sort of response.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool responded_;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if we have gotten a Accept response. Meaningless if |responded_| is
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not true.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool accepted_;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMockTabDownloadState::MockTabDownloadState()
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : responded_(false), accepted_(false) {
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  infobar_.reset(new DownloadRequestInfoBarDelegate(NULL, this));
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMockTabDownloadState::~MockTabDownloadState() {
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  close_infobar();
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(responded_);
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid MockTabDownloadState::Cancel() {
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(responded_);
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  responded_ = true;
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  accepted_ = false;
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid MockTabDownloadState::Accept() {
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(responded_);
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  responded_ = true;
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  accepted_ = true;
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static_cast<DownloadRequestInfoBarDelegate*>(infobar_.get())->set_host(NULL);
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests ----------------------------------------------------------------------
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(DownloadRequestInfobarDelegate, AcceptTest) {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabDownloadState state;
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  state.infobar()->Accept();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(state.accepted());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(DownloadRequestInfobarDelegate, CancelTest) {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabDownloadState state;
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  state.infobar()->Cancel();
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(state.accepted());
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(DownloadRequestInfobarDelegate, CloseTest) {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabDownloadState state;
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  state.close_infobar();
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(state.accepted());
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
89