blob: fda72fc5530a20cde7cef551b146b7f3d55fe136 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "blimp/engine/renderer/frame_scheduler.h"
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blimp {
namespace engine {
namespace {
class FrameSchedulerTest : public testing::Test, public FrameSchedulerClient {
public:
FrameSchedulerTest() : scheduler_(base::ThreadTaskRunnerHandle::Get(), this) {
scheduler_.set_frame_delay_for_testing(base::TimeDelta::FromSeconds(0));
}
~FrameSchedulerTest() override {}
// FrameSchedulerClient implementation.
void StartFrameUpdate() override {
num_frames_++;
if (send_client_update_during_frame_) {
scheduler_.DidSendFrameUpdateToClient();
send_client_update_during_frame_ = false;
}
}
protected:
base::MessageLoop loop_;
FrameScheduler scheduler_;
int num_frames_ = 0;
bool send_client_update_during_frame_ = false;
};
TEST_F(FrameSchedulerTest, FirstMainFrameRequest) {
// The request for the first main frame should be responded to right away.
scheduler_.ScheduleFrameUpdate();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_frames_);
}
TEST_F(FrameSchedulerTest, MultipleMainFrameRequestsResultInSingleFrame) {
// Multiple main frame requests result in a single callback to the client.
scheduler_.ScheduleFrameUpdate();
scheduler_.ScheduleFrameUpdate();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_frames_);
}
TEST_F(FrameSchedulerTest, MainFrameBlockedOnAckFromClient) {
// Request a main frame, start it and send an update to the client. The second
// frame should remain blocked till an ack is received.
scheduler_.ScheduleFrameUpdate();
send_client_update_during_frame_ = true;
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_frames_);
// Request a frame and ensure that the client is not asked to start it.
scheduler_.ScheduleFrameUpdate();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_frames_);
// Now we have an ack from the client. This should start another frame.
scheduler_.DidReceiveFrameUpdateAck();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(2, num_frames_);
}
} // namespace
} // namespace engine
} // namespace blimp