1// Copyright (c) 2012 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 "chrome/browser/ui/webui/signin/login_ui_service.h"
6
7#include "base/compiler_specific.h"
8#include "base/logging.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11class TestLoginUI : public LoginUIService::LoginUI {
12 public:
13  TestLoginUI() { }
14  virtual ~TestLoginUI() { }
15  virtual void FocusUI() OVERRIDE { }
16  virtual void CloseUI() OVERRIDE { }
17
18 private:
19  DISALLOW_COPY_AND_ASSIGN(TestLoginUI);
20};
21
22class TestObserver : public LoginUIService::Observer {
23 public:
24  TestObserver() : ui_shown_count_(0),
25                   ui_closed_count_(0) {
26  }
27
28  int ui_shown_count() const { return ui_shown_count_; }
29  int ui_closed_count() const { return ui_closed_count_; }
30
31 private:
32  virtual void OnLoginUIShown(LoginUIService::LoginUI* ui) OVERRIDE {
33    ++ui_shown_count_;
34  }
35
36  virtual void OnLoginUIClosed(LoginUIService::LoginUI* ui) OVERRIDE {
37    ++ui_closed_count_;
38  }
39
40  int ui_shown_count_;
41  int ui_closed_count_;
42
43  DISALLOW_COPY_AND_ASSIGN(TestObserver);
44};
45
46class LoginUIServiceTest : public testing::Test {
47 public:
48  LoginUIServiceTest() : service_(NULL) { }
49  virtual ~LoginUIServiceTest() { }
50
51 protected:
52  LoginUIService service_;
53  TestObserver observer_;
54
55  DISALLOW_COPY_AND_ASSIGN(LoginUIServiceTest);
56};
57
58// Test that the observer is called back when login UI is shown
59// or closed.
60TEST_F(LoginUIServiceTest, LoginUIServiceObserver) {
61  service_.AddObserver(&observer_);
62  EXPECT_EQ(NULL, service_.current_login_ui());
63  TestLoginUI ui;
64  service_.SetLoginUI(&ui);
65  EXPECT_EQ(1, observer_.ui_shown_count());
66
67  // If a different UI is closed than the one that was shown, no
68  // notification should be fired.
69  TestLoginUI other_ui;
70  service_.LoginUIClosed(&other_ui);
71  EXPECT_EQ(1, observer_.ui_shown_count());
72
73  // If the right UI is closed, notification should be fired.
74  service_.LoginUIClosed(&ui);
75  EXPECT_EQ(1, observer_.ui_closed_count());
76  service_.RemoveObserver(&observer_);
77}
78