1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// Copyright 2018 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/viz/service/frame_sinks/external_begin_frame_source_android.h"
#include "base/android/java_handler_thread.h"
#include "base/functional/bind.h"
#include "base/synchronization/waitable_event.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace viz {
class ExternalBeginFrameSourceAndroidTest : public ::testing::Test,
public BeginFrameObserverBase {
public:
~ExternalBeginFrameSourceAndroidTest() override {
thread_->task_runner()->PostTask(
FROM_HERE,
base::BindOnce(&ExternalBeginFrameSourceAndroidTest::TeardownOnThread,
base::Unretained(this)));
thread_->Stop();
}
void CreateThread() {
thread_ = std::make_unique<base::android::JavaHandlerThread>("TestThread");
thread_->Start();
thread_->task_runner()->PostTask(
FROM_HERE,
base::BindOnce(&ExternalBeginFrameSourceAndroidTest::InitOnThread,
base::Unretained(this)));
}
void WaitForFrames(uint32_t frame_count) {
frames_done_event_.Reset();
thread_->task_runner()->PostTask(
FROM_HERE,
base::BindOnce(
&ExternalBeginFrameSourceAndroidTest::AddObserverOnThread,
base::Unretained(this), frame_count));
frames_done_event_.Wait();
}
ExternalBeginFrameSourceAndroid* begin_frame_source() {
return begin_frame_source_.get();
}
private:
void InitOnThread() {
begin_frame_source_ = std::make_unique<ExternalBeginFrameSourceAndroid>(
BeginFrameSource::kNotRestartableId, 60.f,
/*requires_align_with_java=*/false);
}
void TeardownOnThread() { begin_frame_source_.reset(); }
void AddObserverOnThread(uint32_t frame_count) {
pending_frames_ = frame_count;
begin_frame_source_->AddObserver(this);
}
bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override {
if (pending_frames_ == 0)
return false;
if (--pending_frames_ == 0) {
begin_frame_source_->RemoveObserver(this);
frames_done_event_.Signal();
}
return true;
}
void OnBeginFrameSourcePausedChanged(bool paused) override {}
base::WaitableEvent frames_done_event_;
std::unique_ptr<base::android::JavaHandlerThread> thread_;
// Only accessed from TestThread.
std::unique_ptr<ExternalBeginFrameSourceAndroid> begin_frame_source_;
uint32_t pending_frames_ = 0;
};
TEST_F(ExternalBeginFrameSourceAndroidTest, DeliversFrames) {
CreateThread();
// Ensure we receive frames. When this returns we are no longer observing the
// BeginFrameSource.
WaitForFrames(10);
// Ensure we can re-observe the same BeginFrameSource and get more frames.
WaitForFrames(10);
}
TEST_F(ExternalBeginFrameSourceAndroidTest, DeliversFramesAfterIntervalChange) {
CreateThread();
// Ensure we receive frames. When this returns we are no longer observing the
// BeginFrameSource.
WaitForFrames(10);
begin_frame_source()->UpdateRefreshRate(30.f);
// Ensure we can re-observe the same BeginFrameSource and get more frames.
WaitForFrames(10);
}
} // namespace viz
|