1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
6
7 #include "base/containers/span.h"
8 #include "components/viz/common/resources/bitmap_allocation.h"
9 #include "components/viz/common/resources/resource_sizes.h"
10 #include "mojo/public/cpp/system/platform_handle.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace viz {
14 namespace {
15
16 class ServerSharedBitmapManagerTest : public testing::Test {
17 protected:
SetUp()18 void SetUp() override {
19 manager_ = std::make_unique<ServerSharedBitmapManager>();
20 }
21
TearDown()22 void TearDown() override { manager_.reset(); }
23
manager() const24 ServerSharedBitmapManager* manager() const { return manager_.get(); }
25
26 private:
27 std::unique_ptr<ServerSharedBitmapManager> manager_;
28 };
29
TEST_F(ServerSharedBitmapManagerTest,TestCreate)30 TEST_F(ServerSharedBitmapManagerTest, TestCreate) {
31 gfx::Size bitmap_size(1, 1);
32 base::MappedReadOnlyRegion shm =
33 bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
34 EXPECT_TRUE(shm.IsValid());
35 base::span<uint8_t> span = shm.mapping.GetMemoryAsSpan<uint8_t>();
36 std::fill(span.begin(), span.end(), 0xff);
37
38 SharedBitmapId id = SharedBitmap::GenerateId();
39 manager()->ChildAllocatedSharedBitmap(shm.region.Map(), id);
40
41 std::unique_ptr<SharedBitmap> large_bitmap;
42 large_bitmap =
43 manager()->GetSharedBitmapFromId(gfx::Size(1024, 1024), RGBA_8888, id);
44 EXPECT_FALSE(large_bitmap);
45
46 std::unique_ptr<SharedBitmap> very_large_bitmap;
47 very_large_bitmap = manager()->GetSharedBitmapFromId(
48 gfx::Size(1, (1 << 30) | 1), RGBA_8888, id);
49 EXPECT_FALSE(very_large_bitmap);
50
51 std::unique_ptr<SharedBitmap> negative_size_bitmap;
52 negative_size_bitmap =
53 manager()->GetSharedBitmapFromId(gfx::Size(-1, 1024), RGBA_8888, id);
54 EXPECT_FALSE(negative_size_bitmap);
55
56 SharedBitmapId id2 = SharedBitmap::GenerateId();
57 std::unique_ptr<SharedBitmap> invalid_bitmap;
58 invalid_bitmap =
59 manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id2);
60 EXPECT_FALSE(invalid_bitmap);
61
62 std::unique_ptr<SharedBitmap> shared_bitmap;
63 shared_bitmap = manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id);
64 ASSERT_TRUE(shared_bitmap);
65 EXPECT_TRUE(
66 std::equal(span.begin(), span.begin() + 4, shared_bitmap->pixels()));
67
68 std::unique_ptr<SharedBitmap> large_bitmap2;
69 large_bitmap2 =
70 manager()->GetSharedBitmapFromId(gfx::Size(1024, 1024), RGBA_8888, id);
71 EXPECT_FALSE(large_bitmap2);
72
73 std::unique_ptr<SharedBitmap> shared_bitmap2;
74 shared_bitmap2 = manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id);
75 EXPECT_TRUE(shared_bitmap2->pixels() == shared_bitmap->pixels());
76 shared_bitmap2.reset();
77 EXPECT_TRUE(std::equal(span.begin(), span.end(), shared_bitmap->pixels()));
78
79 manager()->ChildDeletedSharedBitmap(id);
80
81 std::fill(span.begin(), span.end(), 0);
82
83 EXPECT_TRUE(std::equal(span.begin(), span.end(), shared_bitmap->pixels()));
84 shared_bitmap.reset();
85 }
86
TEST_F(ServerSharedBitmapManagerTest,AddDuplicate)87 TEST_F(ServerSharedBitmapManagerTest, AddDuplicate) {
88 gfx::Size bitmap_size(1, 1);
89 base::MappedReadOnlyRegion shm =
90 bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
91 EXPECT_TRUE(shm.IsValid());
92 base::span<uint8_t> span = shm.mapping.GetMemoryAsSpan<uint8_t>();
93 std::fill(span.begin(), span.end(), 0xff);
94 SharedBitmapId id = SharedBitmap::GenerateId();
95
96 // NOTE: Duplicate the mapping to compare its content later.
97 manager()->ChildAllocatedSharedBitmap(shm.region.Map(), id);
98
99 base::MappedReadOnlyRegion shm2 =
100 bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
101 EXPECT_TRUE(shm2.IsValid());
102 base::span<uint8_t> span2 = shm.mapping.GetMemoryAsSpan<uint8_t>();
103 std::fill(span2.begin(), span2.end(), 0x00);
104
105 manager()->ChildAllocatedSharedBitmap(shm2.region.Map(), id);
106
107 std::unique_ptr<SharedBitmap> shared_bitmap;
108 shared_bitmap = manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id);
109 ASSERT_TRUE(shared_bitmap);
110 EXPECT_TRUE(std::equal(span.begin(), span.end(), shared_bitmap->pixels()));
111 manager()->ChildDeletedSharedBitmap(id);
112 }
113
TEST_F(ServerSharedBitmapManagerTest,SharedMemoryHandle)114 TEST_F(ServerSharedBitmapManagerTest, SharedMemoryHandle) {
115 gfx::Size bitmap_size(1, 1);
116 base::MappedReadOnlyRegion shm =
117 bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
118 EXPECT_TRUE(shm.IsValid());
119 base::span<uint8_t> span = shm.mapping.GetMemoryAsSpan<uint8_t>();
120 std::fill(span.begin(), span.end(), 0xff);
121 base::UnguessableToken shared_memory_guid = shm.mapping.guid();
122 EXPECT_FALSE(shared_memory_guid.is_empty());
123
124 SharedBitmapId id = SharedBitmap::GenerateId();
125 manager()->ChildAllocatedSharedBitmap(shm.region.Map(), id);
126
127 base::UnguessableToken tracing_guid =
128 manager()->GetSharedBitmapTracingGUIDFromId(id);
129 EXPECT_EQ(tracing_guid, shared_memory_guid);
130
131 manager()->ChildDeletedSharedBitmap(id);
132 }
133
TEST_F(ServerSharedBitmapManagerTest,InvalidScopedSharedBufferHandle)134 TEST_F(ServerSharedBitmapManagerTest, InvalidScopedSharedBufferHandle) {
135 SharedBitmapId id = SharedBitmap::GenerateId();
136 base::ReadOnlySharedMemoryMapping invalid_mapping;
137 EXPECT_FALSE(invalid_mapping.IsValid());
138 EXPECT_FALSE(
139 manager()->ChildAllocatedSharedBitmap(std::move(invalid_mapping), id));
140
141 // The client could still send an IPC to say it deleted the shared bitmap,
142 // even though it wasn't valid, which should be ignored.
143 manager()->ChildDeletedSharedBitmap(id);
144 }
145
146 } // namespace
147 } // namespace viz
148