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
|
// Copyright 2019 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/begin_frame_tracker.h"
#include <queue>
#include "base/containers/queue.h"
#include "components/viz/test/begin_frame_args_test.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace viz {
namespace {
class BeginFrameTrackerTest : public testing::Test {
public:
void SendNextBeginFrame() {
BeginFrameArgs args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
0, sequence_number_++);
pending_acks_.push(BeginFrameAck(args, true));
tracker_.SentBeginFrame(args);
}
void SendAck() {
tracker_.ReceivedAck(pending_acks_.front());
pending_acks_.pop();
}
void DropAck() { pending_acks_.pop(); }
protected:
BeginFrameTracker tracker_;
uint64_t sequence_number_ = 1;
std::queue<BeginFrameAck> pending_acks_;
};
// Verify that BeginFrameTracker throttles and unthrottles correctly.
TEST_F(BeginFrameTrackerTest, Throttle) {
for (int i = 0; i < BeginFrameTracker::kLimitThrottle; ++i) {
EXPECT_FALSE(tracker_.ShouldThrottleBeginFrame());
EXPECT_FALSE(tracker_.ShouldStopBeginFrame());
SendNextBeginFrame();
}
EXPECT_TRUE(tracker_.ShouldThrottleBeginFrame());
EXPECT_FALSE(tracker_.ShouldStopBeginFrame());
SendAck();
EXPECT_FALSE(tracker_.ShouldThrottleBeginFrame());
EXPECT_FALSE(tracker_.ShouldStopBeginFrame());
}
// Verify that BeginFrameTracker stops sending begin frames after kLimitStop.
TEST_F(BeginFrameTrackerTest, Stop) {
for (int i = 0; i < BeginFrameTracker::kLimitStop; ++i) {
EXPECT_FALSE(tracker_.ShouldStopBeginFrame());
SendNextBeginFrame();
}
EXPECT_FALSE(tracker_.ShouldThrottleBeginFrame());
EXPECT_TRUE(tracker_.ShouldStopBeginFrame());
SendAck();
EXPECT_TRUE(tracker_.ShouldThrottleBeginFrame());
EXPECT_FALSE(tracker_.ShouldStopBeginFrame());
}
// Verify that BeginFrameTracker doesn't throttle a client that only acks half
// the time, as long as they ack the latest BeginFrameArgs.
TEST_F(BeginFrameTrackerTest, AllowDroppedAcks) {
for (int i = 0; i < BeginFrameTracker::kLimitThrottle * 4; ++i) {
EXPECT_FALSE(tracker_.ShouldThrottleBeginFrame());
EXPECT_FALSE(tracker_.ShouldStopBeginFrame());
SendNextBeginFrame();
if (i % 2)
SendAck();
else
DropAck();
}
}
} // namespace
} // namespace viz
|