// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/test/test_future.h"
#include "chrome/browser/ash/crosapi/browser_util.h"
#include "chrome/browser/ash/crosapi/crosapi_ash.h"
#include "chrome/browser/ash/crosapi/crosapi_manager.h"
#include "chrome/browser/ash/crosapi/suggestion_service_ash.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/crosapi/mojom/suggestion_service.mojom-shared.h"
#include "chromeos/crosapi/mojom/suggestion_service.mojom.h"
#include "content/public/test/browser_test.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote_set.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ash/shell.h"
namespace crosapi {
namespace {
using TabsSggestionItemsCallback =
base::OnceCallback<void(std::vector<mojom::TabSuggestionItemPtr>)>;
crosapi::mojom::TabSuggestionItemPtr MakeMojomTabItem(
std::string title,
GURL url,
base::Time timestamp,
GURL favicon_url,
std::string session_name,
mojom::SuggestionDeviceFormFactor form_factor) {
crosapi::mojom::TabSuggestionItemPtr item =
crosapi::mojom::TabSuggestionItem::New();
item->title = title;
item->url = url;
item->timestamp = timestamp;
item->favicon_url = favicon_url;
item->session_name = session_name;
item->form_factor = form_factor;
return item;
}
class FakeSuggestionServiceProvider : public mojom::SuggestionServiceProvider {
public:
void GetTabSuggestionItems(GetTabSuggestionItemsCallback callback) override {
std::vector<crosapi::mojom::TabSuggestionItemPtr> tab_items;
tab_items.push_back(MakeMojomTabItem(
"Title 1", GURL(), base::Time(), GURL(), "Session Name 1",
mojom::SuggestionDeviceFormFactor::kDesktop));
tab_items.push_back(MakeMojomTabItem(
"Title 2", GURL(), base::Time(), GURL(), "Session Name 1",
mojom::SuggestionDeviceFormFactor::kPhone));
tab_items.push_back(MakeMojomTabItem(
"Title 3", GURL(), base::Time(), GURL(), "Session Name 2",
mojom::SuggestionDeviceFormFactor::kTablet));
std::move(callback).Run(std::move(tab_items));
}
mojo::Receiver<mojom::SuggestionServiceProvider> receiver_{this};
};
class SuggestionServiceAshBrowserTest : public InProcessBrowserTest {
public:
void SetUpOnMainThread() override {
InProcessBrowserTest::SetUpOnMainThread();
SuggestionServiceAsh* service =
CrosapiManager::Get()->crosapi_ash()->suggestion_service_ash();
service->BindReceiver(
suggestion_service_remote_.BindNewPipeAndPassReceiver());
suggestion_service_remote_->AddSuggestionServiceProvider(
fake_suggestion_service_provider_.receiver_.BindNewPipeAndPassRemote());
suggestion_service_remote_.FlushForTesting();
}
private:
FakeSuggestionServiceProvider fake_suggestion_service_provider_;
mojo::Remote<mojom::SuggestionService> suggestion_service_remote_;
};
IN_PROC_BROWSER_TEST_F(SuggestionServiceAshBrowserTest, Basics) {
base::test::TestFuture<std::vector<crosapi::mojom::TabSuggestionItemPtr>>
future;
CrosapiManager::Get()
->crosapi_ash()
->suggestion_service_ash()
->GetTabSuggestionItems(future.GetCallback());
const auto tabs = future.Take();
EXPECT_EQ(tabs.size(), 3u);
EXPECT_EQ(tabs[0]->title, "Title 1");
EXPECT_EQ(tabs[0]->url, GURL());
EXPECT_EQ(tabs[0]->timestamp, base::Time());
EXPECT_EQ(tabs[0]->favicon_url, GURL());
EXPECT_EQ(tabs[0]->session_name, "Session Name 1");
EXPECT_EQ(tabs[0]->form_factor, mojom::SuggestionDeviceFormFactor::kDesktop);
EXPECT_EQ(tabs[1]->title, "Title 2");
EXPECT_EQ(tabs[1]->url, GURL());
EXPECT_EQ(tabs[1]->timestamp, base::Time());
EXPECT_EQ(tabs[1]->favicon_url, GURL());
EXPECT_EQ(tabs[1]->session_name, "Session Name 1");
EXPECT_EQ(tabs[1]->form_factor, mojom::SuggestionDeviceFormFactor::kPhone);
EXPECT_EQ(tabs[2]->title, "Title 3");
EXPECT_EQ(tabs[2]->url, GURL());
EXPECT_EQ(tabs[2]->timestamp, base::Time());
EXPECT_EQ(tabs[2]->favicon_url, GURL());
EXPECT_EQ(tabs[2]->session_name, "Session Name 2");
EXPECT_EQ(tabs[2]->form_factor, mojom::SuggestionDeviceFormFactor::kTablet);
}
} // namespace
} // namespace crosapi