Index: ash/system/session_length_limit/tray_session_length_limit_unittest.cc |
diff --git a/ash/system/session_length_limit/tray_session_length_limit_unittest.cc b/ash/system/session_length_limit/tray_session_length_limit_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b05de9c381e1923bf3e400536b83f815edff465 |
--- /dev/null |
+++ b/ash/system/session_length_limit/tray_session_length_limit_unittest.cc |
@@ -0,0 +1,195 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ash/system/session_length_limit/tray_session_length_limit.h" |
+ |
+#include "ash/root_window_controller.h" |
+#include "ash/shell.h" |
+#include "ash/system/tray/system_tray.h" |
+#include "ash/test/ash_test_base.h" |
+#include "ash/test/test_system_tray_delegate.h" |
+#include "base/time/time.h" |
+#include "ui/message_center/message_center.h" |
+#include "ui/message_center/notification.h" |
+#include "ui/message_center/notification_types.h" |
+ |
+namespace ash { |
+namespace test { |
+ |
+class TraySessionLengthLimitTest : public AshTestBase { |
+ public: |
+ TraySessionLengthLimitTest() {} |
+ virtual ~TraySessionLengthLimitTest() {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ AshTestBase::SetUp(); |
+ SystemTray* system_tray = |
+ Shell::GetPrimaryRootWindowController()->GetSystemTray(); |
+ tray_session_length_limit_ = new internal::TraySessionLengthLimit( |
+ system_tray); |
+ system_tray->AddTrayItem(tray_session_length_limit_); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ AshTestBase::TearDown(); |
+ } |
+ |
+ protected: |
+ void UpdateSessionLengthLimitInMin(int mins) { |
+ GetSystemTrayDelegate()->SetSessionLengthLimitForTest( |
+ base::TimeDelta::FromMinutes(mins)); |
+ tray_session_length_limit_->OnSessionLengthLimitChanged(); |
+ } |
+ |
+ message_center::Notification* GetNotification() { |
+ const message_center::NotificationList::Notifications& notifications = |
+ message_center::MessageCenter::Get()->GetVisibleNotifications(); |
+ for (message_center::NotificationList::Notifications::const_iterator iter = |
+ notifications.begin(); iter != notifications.end(); ++iter) { |
+ if ((*iter)->id() == internal::TraySessionLengthLimit::kNotificationId) |
+ return *iter; |
+ } |
+ return NULL; |
+ } |
+ |
+ void ClearSessionLengthLimit() { |
+ GetSystemTrayDelegate()->ClearSessionLengthLimit(); |
+ tray_session_length_limit_->OnSessionLengthLimitChanged(); |
+ } |
+ |
+ void RemoveNotification() { |
+ message_center::MessageCenter::Get()->RemoveNotification( |
+ internal::TraySessionLengthLimit::kNotificationId, true /* by_user */); |
+ } |
+ |
+ internal::TraySessionLengthLimit* tray_session_length_limit() { |
+ return tray_session_length_limit_; |
+ } |
+ |
+ bool IsTrayViewVisible() { |
+ return tray_session_length_limit_->IsTrayViewVisibleForTest(); |
+ } |
+ |
+ private: |
+ // Weak reference, owned by the SystemTray. |
+ internal::TraySessionLengthLimit* tray_session_length_limit_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TraySessionLengthLimitTest); |
+}; |
+ |
+TEST_F(TraySessionLengthLimitTest, TrayView) { |
+ // No session limit. |
+ EXPECT_FALSE(IsTrayViewVisible()); |
+ |
+ // Limit is 15 min. |
+ UpdateSessionLengthLimitInMin(15); |
+ EXPECT_EQ(internal::TraySessionLengthLimit::LIMIT_SET, |
+ tray_session_length_limit()->GetLimitState()); |
+ EXPECT_TRUE(IsTrayViewVisible()); |
+ |
+ // Limit is 3 min. |
+ UpdateSessionLengthLimitInMin(3); |
+ EXPECT_EQ(internal::TraySessionLengthLimit::LIMIT_EXPIRING_SOON, |
+ tray_session_length_limit()->GetLimitState()); |
+ EXPECT_TRUE(IsTrayViewVisible()); |
+ |
+ // Nothing left. |
+ UpdateSessionLengthLimitInMin(0); |
+ EXPECT_EQ(internal::TraySessionLengthLimit::LIMIT_EXPIRING_SOON, |
+ tray_session_length_limit()->GetLimitState()); |
+ EXPECT_TRUE(IsTrayViewVisible()); |
+ |
+ // Checks the behavior in case the limit goes negative. |
+ UpdateSessionLengthLimitInMin(-5); |
+ EXPECT_EQ(internal::TraySessionLengthLimit::LIMIT_EXPIRING_SOON, |
+ tray_session_length_limit()->GetLimitState()); |
+ EXPECT_TRUE(IsTrayViewVisible()); |
+ |
+ // Clears the session length limit, the TrayView should get invisible. |
+ ClearSessionLengthLimit(); |
+ ASSERT_EQ(internal::TraySessionLengthLimit::LIMIT_NONE, |
+ tray_session_length_limit()->GetLimitState()); |
+ EXPECT_FALSE(IsTrayViewVisible()); |
+} |
+ |
+TEST_F(TraySessionLengthLimitTest, Notification) { |
+ // No notifications when no session limit. |
+ EXPECT_FALSE(GetNotification()); |
+ |
+ // Limit is 15 min. |
+ UpdateSessionLengthLimitInMin(15); |
+ message_center::Notification* notification = GetNotification(); |
+ EXPECT_TRUE(notification); |
+ EXPECT_EQ(message_center::SYSTEM_PRIORITY, notification->priority()); |
+ base::string16 first_content = notification->title(); |
+ // Should read the content. |
+ EXPECT_TRUE(notification->rich_notification_data(). |
+ should_make_spoken_feedback_for_popup_updates); |
+ |
+ // Limit is 10 min. |
+ UpdateSessionLengthLimitInMin(10); |
+ notification = GetNotification(); |
+ EXPECT_TRUE(notification); |
+ EXPECT_EQ(message_center::SYSTEM_PRIORITY, notification->priority()); |
+ // The content should be updated. |
+ EXPECT_NE(first_content, notification->title()); |
+ // Should NOT read, because just update the remaining time. |
+ EXPECT_FALSE(notification->rich_notification_data(). |
+ should_make_spoken_feedback_for_popup_updates); |
+ |
+ // Limit is 3 min. |
+ UpdateSessionLengthLimitInMin(3); |
+ notification = GetNotification(); |
+ EXPECT_TRUE(notification); |
+ EXPECT_EQ(message_center::SYSTEM_PRIORITY, notification->priority()); |
+ // Should read the content again because the state has changed. |
+ EXPECT_TRUE(notification->rich_notification_data(). |
+ should_make_spoken_feedback_for_popup_updates); |
+ |
+ // Session length limit is updated to longer. This should not read the |
+ // notification content again. |
+ UpdateSessionLengthLimitInMin(15); |
+ notification = GetNotification(); |
+ EXPECT_TRUE(notification); |
+ EXPECT_EQ(message_center::SYSTEM_PRIORITY, notification->priority()); |
+ // Should not read again because the state has changed to longer. |
+ EXPECT_FALSE(notification->rich_notification_data(). |
+ should_make_spoken_feedback_for_popup_updates); |
+ |
+ // Clears the limit: the notification should be gone. |
+ ClearSessionLengthLimit(); |
+ EXPECT_FALSE(GetNotification()); |
+} |
+ |
+TEST_F(TraySessionLengthLimitTest, RemoveNotification) { |
+ // Limit is 15 min. |
+ UpdateSessionLengthLimitInMin(15); |
+ EXPECT_TRUE(GetNotification()); |
+ |
+ // Limit is 14 min. |
+ UpdateSessionLengthLimitInMin(14); |
+ EXPECT_TRUE(GetNotification()); |
+ |
+ // Removes the notification. |
+ RemoveNotification(); |
+ EXPECT_FALSE(GetNotification()); |
+ |
+ // Limit is 13 min. The notification should not re-appear. |
+ UpdateSessionLengthLimitInMin(13); |
+ EXPECT_FALSE(GetNotification()); |
+ |
+ // Limit is 3 min. The notification should re-appear because of state change. |
+ UpdateSessionLengthLimitInMin(3); |
+ EXPECT_TRUE(GetNotification()); |
+ |
+ RemoveNotification(); |
+ |
+ // Session length limit is updated to longer state. This should not re-appear |
+ // the notification. |
+ UpdateSessionLengthLimitInMin(15); |
+ EXPECT_FALSE(GetNotification()); |
+} |
+ |
+} // namespace test |
+} // namespace ash |