blob: bbe9e8982f635823b966be13ee1e7cc882c0c98e [file] [log] [blame]
// Copyright (c) 2013 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 "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
#include "base/containers/span.h"
#include "components/viz/common/resources/bitmap_allocation.h"
#include "components/viz/common/resources/resource_sizes.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace viz {
namespace {
class ServerSharedBitmapManagerTest : public testing::Test {
protected:
void SetUp() override {
manager_ = std::make_unique<ServerSharedBitmapManager>();
}
void TearDown() override { manager_.reset(); }
ServerSharedBitmapManager* manager() const { return manager_.get(); }
private:
std::unique_ptr<ServerSharedBitmapManager> manager_;
};
TEST_F(ServerSharedBitmapManagerTest, TestCreate) {
gfx::Size bitmap_size(1, 1);
base::MappedReadOnlyRegion shm =
bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
EXPECT_TRUE(shm.IsValid());
base::span<uint8_t> span = shm.mapping.GetMemoryAsSpan<uint8_t>();
std::fill(span.begin(), span.end(), 0xff);
SharedBitmapId id = SharedBitmap::GenerateId();
manager()->ChildAllocatedSharedBitmap(shm.region.Map(), id);
std::unique_ptr<SharedBitmap> large_bitmap;
large_bitmap =
manager()->GetSharedBitmapFromId(gfx::Size(1024, 1024), RGBA_8888, id);
EXPECT_FALSE(large_bitmap);
std::unique_ptr<SharedBitmap> very_large_bitmap;
very_large_bitmap = manager()->GetSharedBitmapFromId(
gfx::Size(1, (1 << 30) | 1), RGBA_8888, id);
EXPECT_FALSE(very_large_bitmap);
std::unique_ptr<SharedBitmap> negative_size_bitmap;
negative_size_bitmap =
manager()->GetSharedBitmapFromId(gfx::Size(-1, 1024), RGBA_8888, id);
EXPECT_FALSE(negative_size_bitmap);
SharedBitmapId id2 = SharedBitmap::GenerateId();
std::unique_ptr<SharedBitmap> invalid_bitmap;
invalid_bitmap =
manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id2);
EXPECT_FALSE(invalid_bitmap);
std::unique_ptr<SharedBitmap> shared_bitmap;
shared_bitmap = manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id);
ASSERT_TRUE(shared_bitmap);
EXPECT_TRUE(
std::equal(span.begin(), span.begin() + 4, shared_bitmap->pixels()));
std::unique_ptr<SharedBitmap> large_bitmap2;
large_bitmap2 =
manager()->GetSharedBitmapFromId(gfx::Size(1024, 1024), RGBA_8888, id);
EXPECT_FALSE(large_bitmap2);
std::unique_ptr<SharedBitmap> shared_bitmap2;
shared_bitmap2 = manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id);
EXPECT_TRUE(shared_bitmap2->pixels() == shared_bitmap->pixels());
shared_bitmap2.reset();
EXPECT_TRUE(std::equal(span.begin(), span.end(), shared_bitmap->pixels()));
manager()->ChildDeletedSharedBitmap(id);
std::fill(span.begin(), span.end(), 0);
EXPECT_TRUE(std::equal(span.begin(), span.end(), shared_bitmap->pixels()));
shared_bitmap.reset();
}
TEST_F(ServerSharedBitmapManagerTest, AddDuplicate) {
gfx::Size bitmap_size(1, 1);
base::MappedReadOnlyRegion shm =
bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
EXPECT_TRUE(shm.IsValid());
base::span<uint8_t> span = shm.mapping.GetMemoryAsSpan<uint8_t>();
std::fill(span.begin(), span.end(), 0xff);
SharedBitmapId id = SharedBitmap::GenerateId();
// NOTE: Duplicate the mapping to compare its content later.
manager()->ChildAllocatedSharedBitmap(shm.region.Map(), id);
base::MappedReadOnlyRegion shm2 =
bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
EXPECT_TRUE(shm2.IsValid());
base::span<uint8_t> span2 = shm.mapping.GetMemoryAsSpan<uint8_t>();
std::fill(span2.begin(), span2.end(), 0x00);
manager()->ChildAllocatedSharedBitmap(shm2.region.Map(), id);
std::unique_ptr<SharedBitmap> shared_bitmap;
shared_bitmap = manager()->GetSharedBitmapFromId(bitmap_size, RGBA_8888, id);
ASSERT_TRUE(shared_bitmap);
EXPECT_TRUE(std::equal(span.begin(), span.end(), shared_bitmap->pixels()));
manager()->ChildDeletedSharedBitmap(id);
}
TEST_F(ServerSharedBitmapManagerTest, SharedMemoryHandle) {
gfx::Size bitmap_size(1, 1);
base::MappedReadOnlyRegion shm =
bitmap_allocation::AllocateSharedBitmap(bitmap_size, RGBA_8888);
EXPECT_TRUE(shm.IsValid());
base::span<uint8_t> span = shm.mapping.GetMemoryAsSpan<uint8_t>();
std::fill(span.begin(), span.end(), 0xff);
base::UnguessableToken shared_memory_guid = shm.mapping.guid();
EXPECT_FALSE(shared_memory_guid.is_empty());
SharedBitmapId id = SharedBitmap::GenerateId();
manager()->ChildAllocatedSharedBitmap(shm.region.Map(), id);
base::UnguessableToken tracing_guid =
manager()->GetSharedBitmapTracingGUIDFromId(id);
EXPECT_EQ(tracing_guid, shared_memory_guid);
manager()->ChildDeletedSharedBitmap(id);
}
TEST_F(ServerSharedBitmapManagerTest, InvalidScopedSharedBufferHandle) {
SharedBitmapId id = SharedBitmap::GenerateId();
base::ReadOnlySharedMemoryMapping invalid_mapping;
EXPECT_FALSE(invalid_mapping.IsValid());
EXPECT_FALSE(
manager()->ChildAllocatedSharedBitmap(std::move(invalid_mapping), id));
// The client could still send an IPC to say it deleted the shared bitmap,
// even though it wasn't valid, which should be ignored.
manager()->ChildDeletedSharedBitmap(id);
}
} // namespace
} // namespace viz