// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "build/build_config.h"
#include "base/run_loop.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/browser/renderer_host/compositor_dependencies_android.h"
#include "content/public/browser/gpu_data_manager_observer.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/content_browser_test.h"
#include "content/test/gpu_browsertest_helpers.h"
#include "gpu/ipc/client/gpu_channel_host.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
using base::RepeatingClosure;
using base::RunLoop;
class BackgroundKillGpuManagerObserver : public GpuDataManagerObserver {
public:
explicit BackgroundKillGpuManagerObserver(RepeatingClosure callback)
: callback_(std::move(callback)) {
GpuDataManagerImpl::GetInstance()->AddObserver(this);
}
~BackgroundKillGpuManagerObserver() override {
GpuDataManagerImpl::GetInstance()->RemoveObserver(this);
}
void OnGpuProcessCrashed() override { callback_.Run(); }
private:
RepeatingClosure callback_;
};
class GpuKillBackgroundTest : public ContentBrowserTest {
public:
GpuKillBackgroundTest() = default;
bool IsChannelEstablished() {
return gpu_channel_host_ && !gpu_channel_host_->IsLost();
}
scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_;
};
// TODO(crbug.com/40926381): Flaky.
IN_PROC_BROWSER_TEST_F(GpuKillBackgroundTest, DISABLED_Simple) {
ASSERT_FALSE(IsChannelEstablished());
gpu_channel_host_ = GpuBrowsertestEstablishGpuChannelSyncRunLoop();
ASSERT_TRUE(IsChannelEstablished());
auto& cda = CompositorDependenciesAndroid::Get();
RunLoop run_loop;
BackgroundKillGpuManagerObserver observer(run_loop.QuitClosure());
cda.DoLowEndBackgroundCleanupForTesting();
run_loop.Run();
ASSERT_FALSE(IsChannelEstablished());
}
} // namespace content