blob: 5386b2a97a1594e2536b93593d573e9ead8cbe78 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/download/download_ui_context_menu.h"
#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_stats.h"
#include "components/download/public/common/mock_download_item.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::NiceMock;
using testing::Return;
class DownloadUiContextMenuTest : public testing::Test {
public:
DownloadUiContextMenuTest() = default;
DownloadUiContextMenu* menu() { return context_menu_.get(); }
void MakeContextMenu(DownloadUIModel* download) {
// Don't use std::make_unique because it needs friend.
context_menu_ =
base::WrapUnique(new DownloadUiContextMenu(download->GetWeakPtr()));
}
void RunUntilIdle() { task_environment_.RunUntilIdle(); }
private:
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<DownloadUiContextMenu> context_menu_;
};
TEST_F(DownloadUiContextMenuTest, InvalidDownloadWontCrashContextMenu) {
std::unique_ptr<download::MockDownloadItem> item =
std::make_unique<NiceMock<download::MockDownloadItem>>();
auto download_ui_model = DownloadItemModel::Wrap(item.get());
auto download_weak_ptr = download_ui_model->GetWeakPtr();
EXPECT_CALL(*item, IsInsecure()).WillRepeatedly(Return(true));
EXPECT_CALL(*item, IsPaused()).WillRepeatedly(Return(true));
// 1 out of 2 commands should be executed.
EXPECT_CALL(*item, OpenDownload()).Times(1);
MakeContextMenu(download_ui_model.get());
EXPECT_NE(menu()->GetMenuModel(), nullptr);
EXPECT_TRUE(menu()->IsCommandIdEnabled(DownloadCommands::KEEP));
EXPECT_TRUE(menu()->IsCommandIdChecked(DownloadCommands::PAUSE));
EXPECT_TRUE(menu()->IsCommandIdVisible(DownloadCommands::PAUSE));
menu()->ExecuteCommand(DownloadCommands::OPEN_WHEN_COMPLETE, 0);
// Weakptr should be invalidated when `download_ui_model` is released.
download_ui_model.reset();
EXPECT_EQ(menu()->GetMenuModel(), nullptr);
EXPECT_FALSE(menu()->IsCommandIdEnabled(DownloadCommands::KEEP));
EXPECT_FALSE(menu()->IsCommandIdChecked(DownloadCommands::PAUSE));
EXPECT_FALSE(menu()->IsCommandIdVisible(DownloadCommands::PAUSE));
menu()->ExecuteCommand(DownloadCommands::OPEN_WHEN_COMPLETE, 0);
}
TEST_F(DownloadUiContextMenuTest, RecordCommandsEnabled) {
base::HistogramTester histogram_tester;
std::unique_ptr<download::MockDownloadItem> item =
std::make_unique<NiceMock<download::MockDownloadItem>>();
auto download_ui_model = DownloadItemModel::Wrap(item.get());
auto download_weak_ptr = download_ui_model->GetWeakPtr();
EXPECT_CALL(*item, IsInsecure()).WillRepeatedly(Return(true));
EXPECT_CALL(*item, IsPaused()).WillRepeatedly(Return(true));
MakeContextMenu(download_ui_model.get());
EXPECT_NE(menu()->GetMenuModel(), nullptr);
EXPECT_TRUE(menu()->IsCommandIdEnabled(DownloadCommands::KEEP));
menu()->RecordCommandsEnabled(menu()->GetMenuModel());
histogram_tester.ExpectBucketCount("Download.ContextMenuAction",
DownloadUiContextMenuAction::kKeepEnabled,
1);
histogram_tester.ExpectBucketCount(
"Download.ContextMenuAction",
DownloadUiContextMenuAction::kLearnMoreInsecureDownloadEnabled, 1);
histogram_tester.ExpectTotalCount("Download.ContextMenuAction", 2);
}