#ifndef CHROME_TEST_BASE_MIXIN_BASED_IN_PROCESS_BROWSER_TEST_H_
#define CHROME_TEST_BASE_MIXIN_BASED_IN_PROCESS_BROWSER_TEST_H_
#include <concepts>
#include <memory>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/test/base/android/android_browser_test.h"
#else
#include "chrome/test/base/in_process_browser_test.h"
#endif
class InProcessBrowserTestMixinHost;
class PrefService;
class InProcessBrowserTestMixin {
public:
explicit InProcessBrowserTestMixin(InProcessBrowserTestMixinHost* host);
InProcessBrowserTestMixin(const InProcessBrowserTestMixin&) = delete;
InProcessBrowserTestMixin& operator=(const InProcessBrowserTestMixin&) =
delete;
virtual ~InProcessBrowserTestMixin() = default;
virtual void SetUp();
virtual void SetUpCommandLine(base::CommandLine* command_line);
virtual void SetUpDefaultCommandLine(base::CommandLine* command_line);
virtual bool SetUpUserDataDirectory();
virtual void SetUpInProcessBrowserTestFixture();
virtual void SetUpLocalStatePrefService(PrefService* local_state);
virtual void CreatedBrowserMainParts(
content::BrowserMainParts* browser_main_parts);
virtual void SetUpOnMainThread();
virtual void TearDownOnMainThread();
virtual void PostRunTestOnMainThread();
virtual void TearDownInProcessBrowserTestFixture();
virtual void TearDown();
};
class InProcessBrowserTestMixinHost final {
public:
InProcessBrowserTestMixinHost();
InProcessBrowserTestMixinHost(const InProcessBrowserTestMixinHost&) = delete;
InProcessBrowserTestMixinHost& operator=(
const InProcessBrowserTestMixinHost&) = delete;
~InProcessBrowserTestMixinHost();
void SetUp();
void SetUpCommandLine(base::CommandLine* command_line);
void SetUpDefaultCommandLine(base::CommandLine* command_line);
bool SetUpUserDataDirectory();
void SetUpInProcessBrowserTestFixture();
void SetUpLocalStatePrefService(PrefService* local_state);
void CreatedBrowserMainParts(content::BrowserMainParts* browser_main_parts);
void SetUpOnMainThread();
void TearDownOnMainThread();
void PostRunTestOnMainThread();
void TearDownInProcessBrowserTestFixture();
void TearDown();
private:
friend class InProcessBrowserTestMixin;
std::vector<raw_ptr<InProcessBrowserTestMixin, VectorExperimental>> mixins_;
};
template <typename Fixture>
#if BUILDFLAG(IS_ANDROID)
requires std::derived_from<Fixture, AndroidBrowserTest>
#else
requires std::derived_from<Fixture, InProcessBrowserTest>
#endif
class InProcessBrowserTestMixinHostSupport : public Fixture {
public:
using Fixture::Fixture;
void SetUp() override {
mixin_host_.SetUp();
Fixture::SetUp();
}
void SetUpCommandLine(base::CommandLine* command_line) override {
mixin_host_.SetUpCommandLine(command_line);
Fixture::SetUpCommandLine(command_line);
}
void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
mixin_host_.SetUpDefaultCommandLine(command_line);
Fixture::SetUpDefaultCommandLine(command_line);
}
bool SetUpUserDataDirectory() override {
return mixin_host_.SetUpUserDataDirectory() &&
Fixture::SetUpUserDataDirectory();
}
void SetUpInProcessBrowserTestFixture() override {
mixin_host_.SetUpInProcessBrowserTestFixture();
Fixture::SetUpInProcessBrowserTestFixture();
}
void SetUpLocalStatePrefService(PrefService* local_state) override {
mixin_host_.SetUpLocalStatePrefService(local_state);
Fixture::SetUpLocalStatePrefService(local_state);
}
void CreatedBrowserMainParts(
content::BrowserMainParts* browser_main_parts) override {
mixin_host_.CreatedBrowserMainParts(browser_main_parts);
Fixture::CreatedBrowserMainParts(browser_main_parts);
}
void SetUpOnMainThread() override {
mixin_host_.SetUpOnMainThread();
Fixture::SetUpOnMainThread();
}
void TearDownOnMainThread() override {
mixin_host_.TearDownOnMainThread();
Fixture::TearDownOnMainThread();
}
void PostRunTestOnMainThread() override {
mixin_host_.PostRunTestOnMainThread();
Fixture::PostRunTestOnMainThread();
}
void TearDownInProcessBrowserTestFixture() override {
mixin_host_.TearDownInProcessBrowserTestFixture();
Fixture::TearDownInProcessBrowserTestFixture();
}
void TearDown() override {
mixin_host_.TearDown();
Fixture::TearDown();
}
protected:
InProcessBrowserTestMixinHost mixin_host_;
};
#if BUILDFLAG(IS_ANDROID)
using MixinBasedAndroidBrowserTest =
InProcessBrowserTestMixinHostSupport<AndroidBrowserTest>;
extern template class InProcessBrowserTestMixinHostSupport<AndroidBrowserTest>;
#else
using MixinBasedInProcessBrowserTest =
InProcessBrowserTestMixinHostSupport<InProcessBrowserTest>;
extern template class InProcessBrowserTestMixinHostSupport<
InProcessBrowserTest>;
#endif
#if BUILDFLAG(IS_ANDROID)
using MixinBasedPlatformBrowserTest = MixinBasedAndroidBrowserTest;
#else
using MixinBasedPlatformBrowserTest = MixinBasedInProcessBrowserTest;
#endif
#endif