blob: 8c1a3617a11edf1fa197ff5e1c59061ac6ef42bb [file]
// 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 "components/on_device_translation/component_manager.h"
#include <string_view>
#include "base/command_line.h"
#include "base/files/scoped_temp_dir.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/strcat.h"
#include "base/test/scoped_command_line.h"
#include "base/test/scoped_path_override.h"
#include "base/test/task_environment.h"
#include "components/component_updater/component_updater_paths.h"
#include "components/on_device_translation/installer.h"
#include "components/on_device_translation/public/language_pack.h"
#include "components/on_device_translation/public/paths.h"
#include "components/on_device_translation/public/pref_names.h"
#include "components/on_device_translation/test/fake_installer.h"
#include "components/prefs/pref_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace on_device_translation {
// Tests for ComponentManager.
class ComponentManagerTest : public ::testing::Test {
public:
ComponentManagerTest() = default;
~ComponentManagerTest() override = default;
// Disallow copy and assign.
ComponentManagerTest(const ComponentManagerTest&) = delete;
ComponentManagerTest& operator=(const ComponentManagerTest&) = delete;
void SetUp() override {
CHECK(fake_dir_.CreateUniqueTempDir());
scoped_path_override_ = std::make_unique<base::ScopedPathOverride>(
component_updater::DIR_COMPONENT_USER, fake_dir_.GetPath());
}
void InitFakeInstaller() {
installer_ =
std::make_unique<FakeOnDeviceTranslationInstaller>(fake_dir_.GetPath());
}
std::unique_ptr<base::ScopedPathOverride> scoped_path_override_;
base::ScopedTempDir fake_dir_;
std::unique_ptr<FakeOnDeviceTranslationInstaller> installer_;
base::test::TaskEnvironment task_environment_;
};
// Tests that the translate kit component can be registered only once.
TEST_F(ComponentManagerTest, RegisterTranslateKitComponent) {
InitFakeInstaller();
EXPECT_TRUE(ComponentManager::GetInstance().RegisterTranslateKitComponent());
// Wait for the update check is requested.
EXPECT_FALSE(ComponentManager::GetInstance().RegisterTranslateKitComponent());
}
class TestObserver : public OnDeviceTranslationInstaller::Observer {
public:
// We pass a callback (the QuitClosure) to the observer.
explicit TestObserver(base::OnceClosure quit_closure)
: quit_closure_(std::move(quit_closure)) {}
void OnLanguagePackInstalled(const LanguagePackKey lang_pack) override {
if (quit_closure_) {
std::move(quit_closure_).Run();
}
}
void OnLanguagePackInstallationChanged(
const LanguagePackKey lang_pack) override {}
void OnInstallationChanged() override {}
private:
base::OnceClosure quit_closure_;
};
// Tests that the translate kit language pack component can be registered and
// unregistered.
TEST_F(ComponentManagerTest, RegisterAndUnregisterTranslateKit) {
InitFakeInstaller();
ComponentManager::GetInstance().RegisterTranslateKitComponent();
base::RunLoop lpack_run_loop;
TestObserver observer(lpack_run_loop.QuitClosure());
OnDeviceTranslationInstaller::GetInstance()->AddObserver(&observer);
ComponentManager::GetInstance().RegisterTranslateKitLanguagePackComponent(
LanguagePackKey::kEn_Ja);
lpack_run_loop.Run();
EXPECT_THAT(ComponentManager::GetInstance().GetRegisteredLanguagePacks(),
::testing::UnorderedElementsAre(LanguagePackKey::kEn_Ja));
ComponentManager::GetInstance().UninstallTranslateKitLanguagePackComponent(
LanguagePackKey::kEn_Ja);
EXPECT_THAT(ComponentManager::GetInstance().GetRegisteredLanguagePacks(),
::testing::IsEmpty());
}
// Tests that the translate kit component path is returned correctly.
TEST_F(ComponentManagerTest, GetTranslateKitComponentPath) {
base::FilePath components_dir;
base::PathService::Get(component_updater::DIR_COMPONENT_USER,
&components_dir);
EXPECT_EQ(ComponentManager::GetInstance().GetTranslateKitComponentPath(),
components_dir.Append(GetBinaryRelativeInstallDir()));
}
} // namespace on_device_translation