blob: e51a91fa8328f69f655f1df85b66bd7a34ed0d1a [file] [log] [blame]
Ben Murdocheb525c52013-07-10 11:40:50 +01001// Copyright 2013 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 "ash/system/chromeos/screen_security/screen_tray_item.h"
6
7#include "ash/system/chromeos/screen_security/screen_capture_tray_item.h"
8#include "ash/system/chromeos/screen_security/screen_share_tray_item.h"
9#include "ash/system/tray/tray_item_view.h"
10#include "ash/test/ash_test_base.h"
11#include "base/callback.h"
12#include "base/strings/utf_string_conversions.h"
13#include "ui/base/events/event.h"
14#include "ui/gfx/point.h"
Ben Murdochbb1529c2013-08-08 10:24:53 +010015#include "ui/message_center/message_center.h"
Ben Murdocheb525c52013-07-10 11:40:50 +010016#include "ui/views/view.h"
17
18namespace ash {
19namespace internal {
20
21// Test with unicode strings.
22const char kTestScreenCaptureAppName[] =
23 "\xE0\xB2\xA0\x5F\xE0\xB2\xA0 (Screen Capture Test)";
24const char kTestScreenShareHelperName[] =
25 "\xE5\xAE\x8B\xE8\x85\xBE (Screen Share Test)";
26
27SystemTray* GetSystemTray() {
28 return Shell::GetInstance()->GetPrimarySystemTray();
29}
30
31SystemTrayNotifier* GetSystemTrayNotifier() {
32 return Shell::GetInstance()->system_tray_notifier();
33}
34
35void ClickViewCenter(views::View* view) {
36 gfx::Point click_location_in_local =
37 gfx::Point(view->width() / 2, view->height() / 2);
38 view->OnMousePressed(ui::MouseEvent(ui::ET_MOUSE_PRESSED,
39 click_location_in_local,
40 click_location_in_local,
41 ui::EF_NONE));
42}
43
44class ScreenTrayItemTest : public ash::test::AshTestBase {
45 public:
46 ScreenTrayItemTest()
47 : tray_item_(NULL), stop_callback_hit_count_(0) {}
48 virtual ~ScreenTrayItemTest() {}
49
50 ScreenTrayItem* tray_item() { return tray_item_; }
51 void set_tray_item(ScreenTrayItem* tray_item) { tray_item_ = tray_item; }
52
53 int stop_callback_hit_count() const { return stop_callback_hit_count_; }
54
55 virtual void SetUp() OVERRIDE {
56 test::AshTestBase::SetUp();
57 TrayItemView::DisableAnimationsForTest();
58 }
59
60 void StartSession() {
61 tray_item_->Start(
62 base::Bind(&ScreenTrayItemTest::StopCallback, base::Unretained(this)));
63 }
64
65 void StopSession() {
66 tray_item_->Stop();
67 }
68
69 void StopCallback() {
70 stop_callback_hit_count_++;
71 }
72
73 private:
74 ScreenTrayItem* tray_item_;
75 int stop_callback_hit_count_;
76
77 DISALLOW_COPY_AND_ASSIGN(ScreenTrayItemTest);
78};
79
80class ScreenCaptureTest : public ScreenTrayItemTest {
81 public:
82 ScreenCaptureTest() {}
83 virtual ~ScreenCaptureTest() {}
84
85 virtual void SetUp() OVERRIDE {
86 ScreenTrayItemTest::SetUp();
87 // This tray item is owned by its parent system tray view and will
88 // be deleted automatically when its parent is destroyed in AshTestBase.
89 ScreenTrayItem* tray_item = new ScreenCaptureTrayItem(GetSystemTray());
90 GetSystemTray()->AddTrayItem(tray_item);
91 set_tray_item(tray_item);
92 }
93
94 DISALLOW_COPY_AND_ASSIGN(ScreenCaptureTest);
95};
96
97class ScreenShareTest : public ScreenTrayItemTest {
98 public:
99 ScreenShareTest() {}
100 virtual ~ScreenShareTest() {}
101
102 virtual void SetUp() OVERRIDE {
103 ScreenTrayItemTest::SetUp();
104 // This tray item is owned by its parent system tray view and will
105 // be deleted automatically when its parent is destroyed in AshTestBase.
106 ScreenTrayItem* tray_item = new ScreenShareTrayItem(GetSystemTray());
107 GetSystemTray()->AddTrayItem(tray_item);
108 set_tray_item(tray_item);
109 }
110
111 DISALLOW_COPY_AND_ASSIGN(ScreenShareTest);
112};
113
114void TestStartAndStop(ScreenTrayItemTest* test) {
115 ScreenTrayItem* tray_item = test->tray_item();
116
117 EXPECT_FALSE(tray_item->is_started());
118 EXPECT_EQ(0, test->stop_callback_hit_count());
119
120 test->StartSession();
121 EXPECT_TRUE(tray_item->is_started());
122
123 test->StopSession();
124 EXPECT_FALSE(tray_item->is_started());
125 EXPECT_EQ(1, test->stop_callback_hit_count());
126}
127
128TEST_F(ScreenCaptureTest, StartAndStop) { TestStartAndStop(this); }
129TEST_F(ScreenShareTest, StartAndStop) { TestStartAndStop(this); }
130
131void TestNotificationStartAndStop(ScreenTrayItemTest* test,
132 const base::Closure& start_function,
133 const base::Closure& stop_function) {
134 ScreenTrayItem* tray_item = test->tray_item();
135 EXPECT_FALSE(tray_item->is_started());
136
137 start_function.Run();
138 EXPECT_TRUE(tray_item->is_started());
139
140 // The stop callback shouldn't be called because we stopped
141 // through the notification system.
142 stop_function.Run();
143 EXPECT_FALSE(tray_item->is_started());
144 EXPECT_EQ(0, test->stop_callback_hit_count());
145}
146
147TEST_F(ScreenCaptureTest, NotificationStartAndStop) {
148 base::Closure start_function =
149 base::Bind(&SystemTrayNotifier::NotifyScreenCaptureStart,
150 base::Unretained(GetSystemTrayNotifier()),
151 base::Bind(&ScreenTrayItemTest::StopCallback,
152 base::Unretained(this)),
153 base::UTF8ToUTF16(kTestScreenCaptureAppName));
154
155 base::Closure stop_function =
156 base::Bind(&SystemTrayNotifier::NotifyScreenCaptureStop,
157 base::Unretained(GetSystemTrayNotifier()));
158
159 TestNotificationStartAndStop(this, start_function, stop_function);
160}
161
162TEST_F(ScreenShareTest, NotificationStartAndStop) {
163 base::Closure start_func =
164 base::Bind(&SystemTrayNotifier::NotifyScreenShareStart,
165 base::Unretained(GetSystemTrayNotifier()),
166 base::Bind(&ScreenTrayItemTest::StopCallback,
167 base::Unretained(this)),
168 base::UTF8ToUTF16(kTestScreenShareHelperName));
169
170 base::Closure stop_func =
171 base::Bind(&SystemTrayNotifier::NotifyScreenShareStop,
172 base::Unretained(GetSystemTrayNotifier()));
173
174 TestNotificationStartAndStop(this, start_func, stop_func);
175}
176
177void TestNotificationView(ScreenTrayItemTest* test) {
178 ScreenTrayItem* tray_item = test->tray_item();
179
180 test->StartSession();
Ben Murdochbb1529c2013-08-08 10:24:53 +0100181 message_center::MessageCenter* message_center =
182 message_center::MessageCenter::Get();
183 EXPECT_TRUE(message_center->HasNotification(tray_item->GetNotificationId()));
Ben Murdocheb525c52013-07-10 11:40:50 +0100184 test->StopSession();
185}
186
187TEST_F(ScreenCaptureTest, NotificationView) { TestNotificationView(this); }
188TEST_F(ScreenShareTest, NotificationView) { TestNotificationView(this); }
189
190void TestSystemTrayInteraction(ScreenTrayItemTest* test) {
191 ScreenTrayItem* tray_item = test->tray_item();
192 EXPECT_FALSE(tray_item->tray_view()->visible());
193
194 const std::vector<SystemTrayItem*>& tray_items =
195 GetSystemTray()->GetTrayItems();
196 EXPECT_NE(std::find(tray_items.begin(), tray_items.end(), tray_item),
197 tray_items.end());
198
199 test->StartSession();
200 EXPECT_TRUE(tray_item->tray_view()->visible());
201
202 // The default view should be created in a new bubble.
203 GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW);
204 EXPECT_TRUE(tray_item->default_view());
205 GetSystemTray()->CloseSystemBubble();
206 EXPECT_FALSE(tray_item->default_view());
207
208 test->StopSession();
209 EXPECT_FALSE(tray_item->tray_view()->visible());
210
211 // The default view should not be visible because session is stopped.
212 GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW);
213 EXPECT_FALSE(tray_item->default_view()->visible());
214}
215
216TEST_F(ScreenCaptureTest, SystemTrayInteraction) {
217 TestSystemTrayInteraction(this);
218}
219
220TEST_F(ScreenShareTest, SystemTrayInteraction) {
221 TestSystemTrayInteraction(this);
222}
223
224} // namespace internal
225} // namespace ash