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