#include "ash/birch/birch_item.h"
#include <memory>
#include <utility>
#include "ash/birch/birch_icon_cache.h"
#include "ash/birch/birch_model.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/public/cpp/test/test_image_downloader.h"
#include "ash/public/cpp/test/test_new_window_delegate.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/system/time/calendar_unittest_utils.h"
#include "ash/test/ash_test_base.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/mock_callback.h"
#include "base/test/scoped_mock_clock_override.h"
#include "base/test/test_future.h"
#include "base/time/time.h"
#include "chromeos/ash/components/settings/scoped_timezone_settings.h"
#include "components/prefs/pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/models/image_model.h"
#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
#include "ui/color/color_provider.h"
#include "ui/color/color_provider_manager.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/native_theme/native_theme.h"
namespace ash {
namespace {
PrefService* GetPrefService() {
return Shell::Get()->session_controller()->GetPrimaryUserPrefService();
}
class TestNewWindowDelegateImpl : public TestNewWindowDelegate {
public:
void OpenUrl(const GURL& url,
OpenUrlFrom from,
Disposition disposition) override {
last_opened_url_ = url;
}
void OpenFile(const base::FilePath& file_path) override {
last_opened_file_path_ = file_path;
}
GURL last_opened_url_;
base::FilePath last_opened_file_path_;
};
class StubBirchClient : public BirchClient {
public:
StubBirchClient() = default;
~StubBirchClient() override = default;
BirchDataProvider* GetCalendarProvider() override { return nullptr; }
BirchDataProvider* GetFileSuggestProvider() override { return nullptr; }
BirchDataProvider* GetRecentTabsProvider() override { return nullptr; }
BirchDataProvider* GetLastActiveProvider() override { return nullptr; }
BirchDataProvider* GetMostVisitedProvider() override { return nullptr; }
BirchDataProvider* GetSelfShareProvider() override { return nullptr; }
BirchDataProvider* GetLostMediaProvider() override { return nullptr; }
BirchDataProvider* GetReleaseNotesProvider() override { return nullptr; }
void WaitForRefreshTokens(base::OnceClosure callback) override {}
base::FilePath GetRemovedItemsFilePath() override { return base::FilePath(); }
void RemoveFileItemFromLauncher(const base::FilePath& path) override {}
void GetFaviconImage(
const GURL& url,
const bool is_page_url,
base::OnceCallback<void(const ui::ImageModel&)> callback) override {
did_get_favicon_image_ = true;
std::move(callback).Run(ui::ImageModel());
}
ui::ImageModel GetChromeBackupIcon() override { return ui::ImageModel(); }
bool did_get_favicon_image_ = false;
};
class BirchItemTest : public testing::Test {
public:
BirchItemTest()
: ash_timezone_(u"America/Los_Angeles"),
scoped_libc_timezone_("America/Los_Angeles") {
BirchItem::set_action_count_for_test(0);
mock_clock_override_.Advance(base::Minutes(53));
}
~BirchItemTest() override { BirchItem::set_action_count_for_test(0); }
TestNewWindowDelegateImpl& new_window_delegate() {
return new_window_delegate_;
}
private:
TestNewWindowDelegateImpl new_window_delegate_;
base::ScopedMockClockOverride mock_clock_override_;
ash::system::ScopedTimezoneSettings ash_timezone_;
calendar_test_utils::ScopedLibcTimeZone scoped_libc_timezone_;
};
TEST_F(BirchItemTest, RecordActionMetrics_Basics) {
base::HistogramTester histograms;
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
item.set_ranking(5.f);
item.RecordActionMetrics();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate",
BirchItemType::kWeather, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivatedRanking", 5, 1);
}
TEST_F(BirchItemTest, RecordActionMetrics_FirstSecondThird) {
base::HistogramTester histograms;
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
item.RecordActionMetrics();
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateFirst",
BirchItemType::kWeather, 1);
histograms.ExpectTotalCount("Ash.Birch.Chip.ActivateSecond", 0);
histograms.ExpectTotalCount("Ash.Birch.Chip.ActivateThird", 0);
item.RecordActionMetrics();
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateFirst",
BirchItemType::kWeather, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateSecond",
BirchItemType::kWeather, 1);
histograms.ExpectTotalCount("Ash.Birch.Chip.ActivateThird", 0);
item.RecordActionMetrics();
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateFirst",
BirchItemType::kWeather, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateSecond",
BirchItemType::kWeather, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateThird",
BirchItemType::kWeather, 1);
item.RecordActionMetrics();
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateFirst",
BirchItemType::kWeather, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateSecond",
BirchItemType::kWeather, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.ActivateThird",
BirchItemType::kWeather, 1);
}
TEST_F(BirchItemTest, Calendar_PerformAction_BothConferenceAndCalendar) {
base::Time now = base::Time::Now();
BirchCalendarItem item(u"item", now - base::Minutes(30),
now + base::Minutes(30),
GURL("http://calendar.com"),
GURL("http://meet.com"),
"000",
false);
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("http://calendar.com/"));
EXPECT_TRUE(item.addon_label());
item.PerformAddonAction();
EXPECT_EQ(new_window_delegate().last_opened_url_, GURL("http://meet.com/"));
}
TEST_F(BirchItemTest, Calendar_PerformAction_Histograms) {
base::HistogramTester histograms;
BirchCalendarItem item(u"item", base::Time(),
base::Time(),
GURL("http://calendar.com"),
GURL("http://meet.com"),
"000",
false);
item.PerformAction();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate",
BirchItemType::kCalendar, 1);
item.PerformAddonAction();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 2);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate",
BirchItemType::kCalendar, 2);
}
TEST_F(BirchItemTest, Calendar_PerformAction_CalendarOnly) {
BirchCalendarItem item(u"item", base::Time(),
base::Time(),
GURL("http://calendar.com"),
GURL(),
"000",
false);
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("http://calendar.com/"));
EXPECT_FALSE(item.addon_label());
item.PerformAddonAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("http://calendar.com/"));
}
TEST_F(BirchItemTest, Calendar_PerformAction_NoURL) {
BirchCalendarItem item(u"item", base::Time(),
base::Time(),
GURL(),
GURL(),
"000",
false);
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_, GURL());
}
TEST_F(BirchItemTest, Calendar_ShouldShowAddonAction) {
base::Time now = base::Time::Now();
BirchCalendarItem item0(u"item0", now + base::Hours(1),
now + base::Hours(2),
GURL("http://calendar.com"),
GURL("http://meet.com"),
"000",
false);
EXPECT_FALSE(item0.addon_label().has_value());
BirchCalendarItem item1(u"item1",
now - base::Minutes(30),
now + base::Minutes(30),
GURL("http://calendar.com"),
GURL("http://meet.com"),
"001",
false);
EXPECT_TRUE(item1.addon_label().has_value());
BirchCalendarItem item2(u"item2", now + base::Minutes(3),
now + base::Minutes(33),
GURL("http://calendar.com"),
GURL("http://meet.com"),
"002",
false);
EXPECT_TRUE(item2.addon_label().has_value());
}
TEST_F(BirchItemTest, Calendar_Subtitle_Ongoing) {
BirchCalendarItem item(u"item",
base::Time::Now() - base::Minutes(30),
base::Time::Now() + base::Minutes(30),
GURL("http://calendar.com"),
GURL(),
"000",
false);
EXPECT_EQ(item.subtitle(), u"Now · Ends 5:30 PM");
}
TEST_F(BirchItemTest, Calendar_Subtitle_Soon) {
BirchCalendarItem item(u"item",
base::Time::Now() + base::Minutes(15),
base::Time::Now() + base::Hours(1),
GURL("http://calendar.com"),
GURL(),
"000",
false);
EXPECT_EQ(item.subtitle(), u"In 15 mins · 5:15 PM - 6:00 PM");
}
TEST_F(BirchItemTest, Calendar_Subtitle_NotSoon) {
BirchCalendarItem item(u"item",
base::Time::Now() + base::Hours(1),
base::Time::Now() + base::Hours(2),
GURL("http://calendar.com"),
GURL(),
"000",
false);
EXPECT_EQ(item.subtitle(), u"6:00 PM - 7:00 PM");
}
TEST_F(BirchItemTest, Calendar_Subtitle_Tomorrow) {
base::Time next_midnight = base::Time::Now().LocalMidnight() + base::Days(1);
BirchCalendarItem item(u"item",
next_midnight + base::Hours(1),
next_midnight + base::Hours(2),
GURL("http://calendar.com"),
GURL(),
"000",
false);
EXPECT_EQ(item.subtitle(), u"Tomorrow · 1:00 AM - 2:00 AM");
}
TEST_F(BirchItemTest, Calendar_Subtitle_AllDay) {
base::Time next_midnight = base::Time::Now().LocalMidnight() + base::Days(1);
BirchCalendarItem item(u"item",
next_midnight - base::Days(1),
next_midnight,
GURL("http://calendar.com"),
GURL(),
"000",
true);
EXPECT_EQ(item.subtitle(), u"All Day");
}
TEST_F(BirchItemTest, Attachment_PerformAction_ValidUrl) {
BirchAttachmentItem item(u"item",
GURL("http://file.com/"),
GURL("http://attachment.icon"),
base::Time(),
base::Time(),
"");
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_, GURL("http://file.com/"));
}
TEST_F(BirchItemTest, Attachment_PerformAction_Histograms) {
base::HistogramTester histograms;
BirchAttachmentItem item(u"item",
GURL("http://file.com/"),
GURL("http://attachment.icon"),
base::Time(),
base::Time(),
"");
item.PerformAction();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate",
BirchItemType::kAttachment, 1);
}
TEST_F(BirchItemTest, Attachment_PerformAction_EmptyUrl) {
BirchAttachmentItem item(u"item",
GURL(),
GURL("http://attachment.icon"),
base::Time(),
base::Time(),
"");
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_, GURL());
}
TEST_F(BirchItemTest, Attachment_Subtitle_Now) {
base::Time now = base::Time::Now();
BirchAttachmentItem item(u"item",
GURL("http://file.com/"),
GURL("http://attachment.icon"),
now - base::Minutes(30),
now + base::Minutes(30),
"");
EXPECT_EQ(item.subtitle(), u"From event happening now");
}
TEST_F(BirchItemTest, Attachment_Subtitle_Upcoming) {
base::Time now = base::Time::Now();
BirchAttachmentItem item(u"item",
GURL("http://file.com/"),
GURL("http://attachment.icon"),
now + base::Hours(1),
now + base::Hours(2),
"");
EXPECT_EQ(item.subtitle(), u"From upcoming calendar event");
}
TEST_F(BirchItemTest, File_TitleDoesNotShowFileExtension) {
BirchFileItem item(base::FilePath("/path/to/file.gdoc"), std::nullopt,
u"suggested", base::Time(), "id_1", "icon_url");
EXPECT_EQ(u"file", item.title());
}
TEST_F(BirchItemTest, File_Title) {
BirchFileItem item(base::FilePath("/path/to/file.gdoc"), "file_title",
u"suggested", base::Time(), "id_1", "icon_url");
EXPECT_EQ(u"file_title", item.title());
}
TEST_F(BirchItemTest, File_PerformAction) {
BirchFileItem item(base::FilePath("file_path"), "title", u"suggested",
base::Time(), "id_1", "icon_url");
EXPECT_EQ(u"title", item.title());
EXPECT_EQ(u"suggested", item.subtitle());
EXPECT_EQ("id_1", item.file_id());
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_file_path_,
base::FilePath("file_path"));
}
TEST_F(BirchItemTest, File_PerformAction_Histograms) {
base::HistogramTester histograms;
BirchFileItem item(base::FilePath("file_path"), "title", u"suggested",
base::Time(), "id_1", "icon_url");
item.PerformAction();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate", BirchItemType::kFile,
1);
}
TEST_F(BirchItemTest, Weather_PerformAction) {
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("https://google.com/search?q=weather"));
}
TEST_F(BirchItemTest, Weather_PerformAction_Histograms) {
base::HistogramTester histograms;
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
item.PerformAction();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate",
BirchItemType::kWeather, 1);
}
using BirchWeatherItemTest = AshTestBase;
TEST_F(BirchWeatherItemTest, AddonLabelInFahrenheit) {
GetPrefService()->SetBoolean(prefs::kBirchUseCelsius, false);
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
EXPECT_EQ(item.addon_label(), u"72");
}
TEST_F(BirchWeatherItemTest, AddonLabelInCelsius) {
GetPrefService()->SetBoolean(prefs::kBirchUseCelsius, true);
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
EXPECT_EQ(item.addon_label(), u"22");
}
TEST_F(BirchItemTest, Tab_Subtitle_Recent) {
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time::Now() - base::Minutes(5),
GURL(), "Chromebook",
BirchTabItem::DeviceFormFactor::kDesktop);
EXPECT_EQ(item.subtitle(), u"Within 1 hr · From Chromebook");
}
TEST_F(BirchItemTest, Tab_Subtitle_OneHour) {
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time::Now() - base::Minutes(65),
GURL(), "Chromebook",
BirchTabItem::DeviceFormFactor::kDesktop);
EXPECT_EQ(item.subtitle(), u"1 hr ago · From Chromebook");
}
TEST_F(BirchItemTest, Tab_Subtitle_TwoHours) {
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time::Now() - base::Minutes(125),
GURL(), "Chromebook",
BirchTabItem::DeviceFormFactor::kDesktop);
EXPECT_EQ(item.subtitle(), u"2 hr ago · From Chromebook");
}
TEST_F(BirchItemTest, Tab_Subtitle_Yesterday) {
BirchTabItem item(
u"item", GURL("http://example.com/"),
base::Time::Now().LocalMidnight() - base::Minutes(5),
GURL(), "Chromebook",
BirchTabItem::DeviceFormFactor::kDesktop);
EXPECT_EQ(item.subtitle(), u"Yesterday · From Chromebook");
}
TEST_F(BirchItemTest, Tab_PerformAction_ValidUrl) {
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time(),
GURL(), "",
BirchTabItem::DeviceFormFactor::kDesktop);
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("http://example.com/"));
}
TEST_F(BirchItemTest, Tab_PerformAction_EmptyUrl) {
BirchTabItem item(u"item", GURL(),
base::Time(),
GURL(), "",
BirchTabItem::DeviceFormFactor::kDesktop);
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_, GURL());
}
TEST_F(BirchItemTest, Tab_PerformAction_Histograms) {
base::HistogramTester histograms;
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time(),
GURL(), "",
BirchTabItem::DeviceFormFactor::kDesktop);
item.PerformAction();
histograms.ExpectBucketCount("Ash.Birch.Bar.Activate", true, 1);
histograms.ExpectBucketCount("Ash.Birch.Chip.Activate", BirchItemType::kTab,
1);
}
TEST_F(BirchItemTest, LastActive_Subtitle_TwoDaysAgo) {
BirchLastActiveItem item(u"item", GURL("http://example.com/"),
base::Time::Now() - base::Days(2));
EXPECT_EQ(item.subtitle(), u"2 days ago · Continue browsing");
}
TEST_F(BirchItemTest, LastActive_Subtitle_Yesterday) {
BirchLastActiveItem item(u"item", GURL("http://example.com/"),
base::Time::Now() - base::Days(1));
EXPECT_EQ(item.subtitle(), u"Yesterday · Continue browsing");
}
TEST_F(BirchItemTest, LastActive_Subtitle_OneHourAgo) {
BirchLastActiveItem item(u"item", GURL("http://example.com/"),
base::Time::Now() - base::Hours(1));
EXPECT_EQ(item.subtitle(), u"1 hr ago · Continue browsing");
}
TEST_F(BirchItemTest, LastActive_PerformAction) {
BirchLastActiveItem item(u"item", GURL("http://example.com/"), base::Time());
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("http://example.com/"));
}
TEST_F(BirchItemTest, SelfShare_PerformAction) {
base::MockCallback<base::RepeatingClosure> activation_callback;
BirchSelfShareItem item(
u"self share guid", u"self share tab",
GURL("https://www.example.com/"),
base::Time(), u"my device",
SecondaryIconType::kTabFromDesktop,
activation_callback.Get());
EXPECT_CALL(activation_callback, Run).Times(1);
item.PerformAction();
EXPECT_EQ(new_window_delegate().last_opened_url_,
GURL("https://www.example.com/"));
}
class BirchItemIconTest : public AshTestBase {
public:
void SetUp() override {
AshTestBase::SetUp();
Shell::Get()->birch_model()->SetClientAndInit(&stub_birch_client_);
}
void TearDown() override {
Shell::Get()->birch_model()->SetClientAndInit(nullptr);
AshTestBase::TearDown();
}
StubBirchClient stub_birch_client_;
TestImageDownloader image_downloader_;
};
TEST_F(BirchItemIconTest, Calendar_LoadIcon) {
BirchCalendarItem item(u"item", base::Time(),
base::Time(),
GURL("http://calendar.com"),
GURL("http://meet.com"),
"000",
false);
item.LoadIcon(base::BindOnce([](PrimaryIconType primary_icon_type,
SecondaryIconType secondary_icon_type,
const ui::ImageModel& icon) {
EXPECT_FALSE(icon.IsEmpty());
EXPECT_EQ(primary_icon_type, PrimaryIconType::kIcon);
EXPECT_EQ(secondary_icon_type, SecondaryIconType::kNoIcon);
}));
}
TEST_F(BirchItemIconTest, Attachment_LoadIcon) {
BirchAttachmentItem item(u"item",
GURL("http://file.com/"),
GURL("http://attachment.icon"),
base::Time(),
base::Time(),
"");
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kNoIcon);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get("http://attachment.icon/").isNull());
}
TEST_F(BirchItemIconTest, Attachment_LoadIcon_InvalidUrl) {
BirchAttachmentItem item(u"item",
GURL("http://file.com/"),
GURL("invalid-url"),
base::Time(),
base::Time(),
"");
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kNoIcon);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 0u);
}
TEST_F(BirchItemIconTest, Tab_LoadIcon) {
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time(),
GURL("http://icon.com/"),
"",
BirchTabItem::DeviceFormFactor::kDesktop);
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_TRUE(stub_birch_client_.did_get_favicon_image_);
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kTabFromDesktop);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get("http://icon.com/").isNull());
}
TEST_F(BirchItemIconTest, Tab_LoadIcon_InvalidUrl) {
BirchTabItem item(u"item", GURL("http://example.com/"),
base::Time(),
GURL("invalid-url"),
"",
BirchTabItem::DeviceFormFactor::kDesktop);
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kTabFromDesktop);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 0u);
}
TEST_F(BirchItemIconTest, Weather_LoadIcon) {
BirchWeatherItem item(u"item", 72.f, GURL("http://icon.com/"));
item.LoadIcon(base::BindOnce([](PrimaryIconType primary_icon_type,
SecondaryIconType secondary_icon_type,
const ui::ImageModel& icon) {
EXPECT_FALSE(icon.IsEmpty());
EXPECT_EQ(primary_icon_type, PrimaryIconType::kWeatherImage);
EXPECT_EQ(secondary_icon_type, SecondaryIconType::kNoIcon);
}));
}
TEST_F(BirchItemIconTest, Weather_LoadIcon_NoIcon) {
BirchWeatherItem item(u"Sunny", 72.f, GURL());
item.LoadIcon(base::BindOnce([](PrimaryIconType primary_icon_type,
SecondaryIconType secondary_icon_type,
const ui::ImageModel& icon) {
EXPECT_FALSE(icon.IsEmpty());
EXPECT_EQ(primary_icon_type, PrimaryIconType::kWeatherImage);
EXPECT_EQ(secondary_icon_type, SecondaryIconType::kNoIcon);
}));
}
TEST_F(BirchItemIconTest, File_LoadIcon) {
const std::string icon_url =
"https://drive-thirdparty.googleusercontent.com/32/type/application/"
"vnd.google-apps.document";
BirchFileItem item(base::FilePath("/path/to/file.gdoc"), "title",
u"suggested", base::Time(), "id_1", icon_url);
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kNoIcon);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get(icon_url).isNull());
}
TEST_F(BirchItemIconTest, SelfShare_LoadIcon) {
const GURL page_url = GURL("https://www.example.com/");
BirchSelfShareItem item(
u"self share guid", u"self share tab", page_url, base::Time(),
u"my device", SecondaryIconType::kTabFromDesktop, base::DoNothing());
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_TRUE(stub_birch_client_.did_get_favicon_image_);
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kTabFromDesktop);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get(page_url.spec()).isNull());
}
TEST_F(BirchItemTest, LostMedia_VideoConference_Subtitle) {
BirchLostMediaItem item(GURL(), u"test_title", std::nullopt,
SecondaryIconType::kLostMediaVideoConference,
base::DoNothing());
EXPECT_EQ(item.subtitle(), u"Ongoing · Switch to tab");
}
TEST_F(BirchItemTest, LostMedia_MediaTab_Subtitle) {
BirchLostMediaItem item(GURL(), u"test_title", std::nullopt,
SecondaryIconType::kLostMediaVideo,
base::DoNothing());
EXPECT_EQ(item.subtitle(), u"Playing · Switch to tab");
}
TEST_F(BirchItemIconTest, LostMedia_LoadIcon) {
const GURL page_url = GURL("https://www.example.com/");
BirchLostMediaItem item(page_url, u"test_title", std::nullopt,
SecondaryIconType::kLostMediaVideoConference,
base::DoNothing());
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_TRUE(stub_birch_client_.did_get_favicon_image_);
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kLostMediaVideoConference);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get(page_url.spec()).isNull());
}
TEST_F(BirchItemIconTest, LastActive_LoadIcon) {
const GURL page_url = GURL("https://www.example.com/");
BirchLastActiveItem item(u"item", page_url, base::Time());
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_TRUE(stub_birch_client_.did_get_favicon_image_);
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kNoIcon);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get(page_url.spec()).isNull());
}
TEST_F(BirchItemIconTest, MostVisited_LoadIcon) {
const GURL page_url = GURL("https://www.example.com/");
BirchMostVisitedItem item(u"item", page_url);
base::test::TestFuture<PrimaryIconType, SecondaryIconType,
const ui::ImageModel&>
future;
item.LoadIcon(future.GetCallback());
EXPECT_TRUE(stub_birch_client_.did_get_favicon_image_);
EXPECT_FALSE(future.Get<2>().IsEmpty());
EXPECT_EQ(future.Get<0>(), PrimaryIconType::kIcon);
EXPECT_EQ(future.Get<1>(), SecondaryIconType::kNoIcon);
auto* icon_cache = Shell::Get()->birch_model()->icon_cache();
EXPECT_EQ(icon_cache->size_for_test(), 1u);
EXPECT_FALSE(icon_cache->Get(page_url.spec()).isNull());
}
}
}