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 103 104 105 106 107 108 109 110 111 112 113 114
|
// 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/common/surfaces/parent_local_surface_id_allocator.h"
#include <memory>
#include "testing/gtest/include/gtest/gtest.h"
// ParentLocalSurfaceIdAllocator has 2 accessors which do not alter state:
// - GetCurrentLocalSurfaceId()
// - is_allocation_suppressed()
//
// For every operation which changes state we can test:
// - the operation completed as expected,
// - the accessors did not change, and/or
// - the accessors changed in the way we expected.
namespace viz {
class ParentLocalSurfaceIdAllocatorTest : public testing::Test {
public:
ParentLocalSurfaceIdAllocatorTest() = default;
ParentLocalSurfaceIdAllocatorTest(const ParentLocalSurfaceIdAllocatorTest&) =
delete;
ParentLocalSurfaceIdAllocatorTest& operator=(
const ParentLocalSurfaceIdAllocatorTest&) = delete;
~ParentLocalSurfaceIdAllocatorTest() override = default;
ParentLocalSurfaceIdAllocator& allocator() { return *allocator_.get(); }
LocalSurfaceId GenerateChildLocalSurfaceId() {
const LocalSurfaceId& current_local_surface_id =
allocator_->GetCurrentLocalSurfaceId();
return LocalSurfaceId(current_local_surface_id.parent_sequence_number(),
current_local_surface_id.child_sequence_number() + 1,
current_local_surface_id.embed_token());
}
// testing::Test:
void SetUp() override {
testing::Test::SetUp();
allocator_ = std::make_unique<ParentLocalSurfaceIdAllocator>();
}
void TearDown() override {
allocator_.reset();
}
private:
std::unique_ptr<ParentLocalSurfaceIdAllocator> allocator_;
};
// UpdateFromChild() on a parent allocator should accept the child's sequence
// number. But it should continue to use its own parent sequence number and
// embed_token.
TEST_F(ParentLocalSurfaceIdAllocatorTest,
UpdateFromChildOnlyUpdatesExpectedLocalSurfaceIdComponents) {
allocator().GenerateId();
LocalSurfaceId preupdate_local_surface_id =
allocator().GetCurrentLocalSurfaceId();
LocalSurfaceId child_local_surface_id = GenerateChildLocalSurfaceId();
const LocalSurfaceId& child_allocated_local_surface_id =
child_local_surface_id;
EXPECT_EQ(preupdate_local_surface_id.parent_sequence_number(),
child_allocated_local_surface_id.parent_sequence_number());
EXPECT_NE(preupdate_local_surface_id.child_sequence_number(),
child_allocated_local_surface_id.child_sequence_number());
EXPECT_EQ(preupdate_local_surface_id.embed_token(),
child_allocated_local_surface_id.embed_token());
bool changed = allocator().UpdateFromChild(child_local_surface_id);
EXPECT_TRUE(changed);
const LocalSurfaceId& postupdate_local_surface_id =
allocator().GetCurrentLocalSurfaceId();
EXPECT_EQ(postupdate_local_surface_id.parent_sequence_number(),
child_allocated_local_surface_id.parent_sequence_number());
EXPECT_EQ(postupdate_local_surface_id.child_sequence_number(),
child_allocated_local_surface_id.child_sequence_number());
EXPECT_EQ(postupdate_local_surface_id.embed_token(),
child_allocated_local_surface_id.embed_token());
EXPECT_FALSE(allocator().is_allocation_suppressed());
}
// GenerateId() on a parent allocator should monotonically increment the parent
// sequence number and use the previous embed_token.
TEST_F(ParentLocalSurfaceIdAllocatorTest,
GenerateIdOnlyUpdatesExpectedLocalSurfaceIdComponents) {
allocator().GenerateId();
LocalSurfaceId pregenerateid_local_surface_id =
allocator().GetCurrentLocalSurfaceId();
allocator().GenerateId();
const LocalSurfaceId& returned_local_surface_id =
allocator().GetCurrentLocalSurfaceId();
const LocalSurfaceId& postgenerateid_local_surface_id =
allocator().GetCurrentLocalSurfaceId();
EXPECT_EQ(pregenerateid_local_surface_id.parent_sequence_number() + 1,
postgenerateid_local_surface_id.parent_sequence_number());
EXPECT_EQ(pregenerateid_local_surface_id.child_sequence_number(),
postgenerateid_local_surface_id.child_sequence_number());
EXPECT_EQ(pregenerateid_local_surface_id.embed_token(),
postgenerateid_local_surface_id.embed_token());
EXPECT_EQ(returned_local_surface_id, allocator().GetCurrentLocalSurfaceId());
EXPECT_FALSE(allocator().is_allocation_suppressed());
}
} // namespace viz
|