blob: 1b6d0712b636c8670a8e31a309293c1942003e55 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include "base/test/task_environment.h"
#include "components/media_router/browser/issue_manager.h"
#include "components/media_router/browser/test/test_helper.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
using testing::_;
using testing::SaveArg;
namespace media_router {
namespace {
IssueInfo CreateTestIssue(IssueInfo::Severity severity) {
IssueInfo issue("title", severity);
issue.message = "message";
return issue;
}
} // namespace
class IssueManagerTest : public ::testing::Test {
protected:
IssueManagerTest()
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
manager_.set_task_runner_for_test(
task_environment_.GetMainThreadTaskRunner());
}
~IssueManagerTest() override {}
content::BrowserTaskEnvironment task_environment_;
IssueManager manager_;
};
TEST_F(IssueManagerTest, AddAndClearIssue) {
IssueInfo issue_info1 = CreateTestIssue(IssueInfo::Severity::WARNING);
// Add initial issue.
manager_.AddIssue(issue_info1);
Issue issue1((IssueInfo()));
MockIssuesObserver observer(&manager_);
EXPECT_CALL(observer, OnIssue(_)).WillOnce(SaveArg<0>(&issue1));
observer.Init();
ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&observer));
EXPECT_EQ(issue_info1, issue1.info());
IssueInfo issue_info2 = CreateTestIssue(IssueInfo::Severity::NOTIFICATION);
Issue issue2((IssueInfo()));
manager_.AddIssue(issue_info2);
// Clear |issue1|. Observer will be notified with |issue2|.
EXPECT_CALL(observer, OnIssue(_)).WillOnce(SaveArg<0>(&issue2));
manager_.ClearIssue(issue1.id());
ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&observer));
EXPECT_EQ(issue_info2, issue2.info());
// All issues cleared. Observer will be notified with |nullptr| that there are
// no more issues.
EXPECT_CALL(observer, OnIssuesCleared());
manager_.ClearIssue(issue2.id());
}
TEST_F(IssueManagerTest, IssuesDeletionShouldNotAffectOrder) {
MockIssuesObserver observer(&manager_);
observer.Init();
Issue issue1((IssueInfo()));
EXPECT_CALL(observer, OnIssue(_)).WillOnce(SaveArg<0>(&issue1));
IssueInfo issue_info1 = CreateTestIssue(IssueInfo::Severity::NOTIFICATION);
manager_.AddIssue(issue_info1);
IssueInfo issue_info2 = CreateTestIssue(IssueInfo::Severity::WARNING);
manager_.AddIssue(issue_info2);
IssueInfo issue_info3 = CreateTestIssue(IssueInfo::Severity::NOTIFICATION);
manager_.AddIssue(issue_info3);
ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&observer));
EXPECT_EQ(issue_info1, issue1.info());
Issue issue2((IssueInfo()));
EXPECT_CALL(observer, OnIssue(_)).WillOnce(SaveArg<0>(&issue2));
manager_.ClearIssue(issue1.id());
EXPECT_EQ(issue_info2, issue2.info());
manager_.ClearAllIssues();
}
TEST_F(IssueManagerTest, AddSameIssueInfoHasNoEffect) {
IssueInfo issue_info = CreateTestIssue(IssueInfo::Severity::WARNING);
MockIssuesObserver observer(&manager_);
observer.Init();
Issue issue((IssueInfo()));
EXPECT_CALL(observer, OnIssue(_)).WillOnce(SaveArg<0>(&issue));
manager_.AddIssue(issue_info);
ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&observer));
EXPECT_EQ(issue_info, issue.info());
// Adding the same IssueInfo has no effect.
manager_.AddIssue(issue_info);
EXPECT_CALL(observer, OnIssuesCleared());
manager_.ClearIssue(issue.id());
}
TEST_F(IssueManagerTest, IssuesGetAutoDismissed) {
MockIssuesObserver observer(&manager_);
observer.Init();
EXPECT_CALL(observer, OnIssue(_)).Times(1);
IssueInfo issue_info1 = CreateTestIssue(IssueInfo::Severity::NOTIFICATION);
manager_.AddIssue(issue_info1);
EXPECT_CALL(observer, OnIssuesCleared()).Times(1);
base::TimeDelta timeout = IssueManager::GetAutoDismissTimeout(issue_info1);
EXPECT_FALSE(timeout.is_zero());
EXPECT_TRUE(task_environment_.MainThreadIsIdle());
task_environment_.FastForwardBy(timeout);
EXPECT_CALL(observer, OnIssue(_)).Times(1);
IssueInfo issue_info2 = CreateTestIssue(IssueInfo::Severity::WARNING);
manager_.AddIssue(issue_info2);
EXPECT_CALL(observer, OnIssuesCleared()).Times(1);
timeout = IssueManager::GetAutoDismissTimeout(issue_info2);
EXPECT_FALSE(timeout.is_zero());
EXPECT_GT(task_environment_.GetPendingMainThreadTaskCount(), 0u);
task_environment_.FastForwardBy(timeout);
EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0u);
}
TEST_F(IssueManagerTest, IssueAutoDismissNoopsIfAlreadyCleared) {
MockIssuesObserver observer(&manager_);
observer.Init();
Issue issue1((IssueInfo()));
EXPECT_CALL(observer, OnIssue(_)).Times(1).WillOnce(SaveArg<0>(&issue1));
IssueInfo issue_info1 = CreateTestIssue(IssueInfo::Severity::NOTIFICATION);
manager_.AddIssue(issue_info1);
ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(&observer));
EXPECT_CALL(observer, OnIssuesCleared()).Times(1);
EXPECT_GT(task_environment_.GetPendingMainThreadTaskCount(), 0u);
manager_.ClearIssue(issue1.id());
EXPECT_CALL(observer, OnIssuesCleared()).Times(0);
base::TimeDelta timeout = IssueManager::GetAutoDismissTimeout(issue_info1);
EXPECT_FALSE(timeout.is_zero());
EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0u);
}
TEST_F(IssueManagerTest, ClearAllIssues) {
MockIssuesObserver observer(&manager_);
observer.Init();
EXPECT_CALL(observer, OnIssue(_)).Times(1);
manager_.AddIssue(CreateTestIssue(IssueInfo::Severity::NOTIFICATION));
manager_.AddIssue(CreateTestIssue(IssueInfo::Severity::WARNING));
EXPECT_CALL(observer, OnIssuesCleared()).Times(1);
manager_.ClearAllIssues();
}
} // namespace media_router