| // Copyright 2018 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 "media/base/unaligned_shared_memory.h" |
| |
| #include <stdint.h> |
| #include <string.h> |
| |
| #include <limits> |
| |
| #include "base/cxx17_backports.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace media { |
| |
| namespace { |
| |
| const uint8_t kUnalignedData[] = "XXXhello"; |
| const size_t kUnalignedDataSize = base::size(kUnalignedData); |
| const off_t kUnalignedOffset = 3; |
| |
| const uint8_t kData[] = "hello"; |
| const size_t kDataSize = base::size(kData); |
| |
| base::UnsafeSharedMemoryRegion CreateRegion(const uint8_t* data, size_t size) { |
| auto region = base::UnsafeSharedMemoryRegion::Create(size); |
| auto mapping = region.Map(); |
| EXPECT_TRUE(mapping.IsValid()); |
| memcpy(mapping.memory(), data, size); |
| return region; |
| } |
| |
| base::ReadOnlySharedMemoryRegion CreateReadOnlyRegion(const uint8_t* data, |
| size_t size) { |
| auto mapped_region = base::ReadOnlySharedMemoryRegion::Create(size); |
| EXPECT_TRUE(mapped_region.IsValid()); |
| memcpy(mapped_region.mapping.memory(), data, size); |
| return std::move(mapped_region.region); |
| } |
| } // namespace |
| |
| TEST(UnalignedSharedMemoryTest, CreateAndDestroyRegion) { |
| auto region = CreateRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, false); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, CreateAndDestroyReadOnlyRegion) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, true); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, CreateAndDestroy_InvalidRegion) { |
| UnalignedSharedMemory shm(base::subtle::PlatformSharedMemoryRegion(), |
| kDataSize, false); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, MapRegion) { |
| auto region = CreateRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, false); |
| ASSERT_TRUE(shm.MapAt(0, kDataSize)); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, MapReadOnlyRegion) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, true); |
| ASSERT_TRUE(shm.MapAt(0, kDataSize)); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_UnalignedRegion) { |
| auto region = CreateRegion(kUnalignedData, kUnalignedDataSize); |
| UnalignedSharedMemory shm( |
| base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kUnalignedDataSize, false); |
| ASSERT_TRUE(shm.MapAt(kUnalignedOffset, kDataSize)); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_UnalignedReadOnlyRegion) { |
| auto region = CreateReadOnlyRegion(kUnalignedData, kUnalignedDataSize); |
| UnalignedSharedMemory shm( |
| base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kUnalignedDataSize, true); |
| ASSERT_TRUE(shm.MapAt(kUnalignedOffset, kDataSize)); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_InvalidRegion) { |
| UnalignedSharedMemory shm(base::subtle::PlatformSharedMemoryRegion(), |
| kDataSize, true); |
| ASSERT_FALSE(shm.MapAt(1, kDataSize)); |
| EXPECT_EQ(shm.memory(), nullptr); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_NegativeOffsetRegion) { |
| auto region = CreateRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, false); |
| ASSERT_FALSE(shm.MapAt(-1, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_NegativeOffsetReadOnlyRegion) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, true); |
| ASSERT_FALSE(shm.MapAt(-1, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_SizeOverflowRegion) { |
| auto region = CreateRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, false); |
| ASSERT_FALSE(shm.MapAt(1, std::numeric_limits<size_t>::max())); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_SizeOverflowReadOnlyRegion) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, true); |
| ASSERT_FALSE(shm.MapAt(1, std::numeric_limits<size_t>::max())); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, UnmappedRegionIsNullptr) { |
| auto region = CreateRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, false); |
| ASSERT_EQ(shm.memory(), nullptr); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, UnmappedReadOnlyRegionIsNullptr) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| UnalignedSharedMemory shm( |
| base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization( |
| std::move(region)), |
| kDataSize, true); |
| ASSERT_EQ(shm.memory(), nullptr); |
| } |
| |
| TEST(WritableUnalignedMappingTest, CreateAndDestroy) { |
| auto region = CreateRegion(kData, kDataSize); |
| WritableUnalignedMapping shm(region, kDataSize, 0); |
| EXPECT_TRUE(shm.IsValid()); |
| } |
| |
| TEST(WritableUnalignedMappingTest, CreateAndDestroy_InvalidRegion) { |
| base::UnsafeSharedMemoryRegion region; |
| WritableUnalignedMapping shm(region, kDataSize, 0); |
| EXPECT_FALSE(shm.IsValid()); |
| } |
| |
| TEST(WritableUnalignedMappingTest, Map) { |
| auto region = CreateRegion(kData, kDataSize); |
| WritableUnalignedMapping shm(region, kDataSize, 0); |
| ASSERT_TRUE(shm.IsValid()); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(WritableUnalignedMappingTest, Map_Unaligned) { |
| auto region = CreateRegion(kUnalignedData, kUnalignedDataSize); |
| WritableUnalignedMapping shm(region, kDataSize, kUnalignedOffset); |
| ASSERT_TRUE(shm.IsValid()); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(WritableUnalignedMappingTest, Map_InvalidRegion) { |
| base::UnsafeSharedMemoryRegion region; |
| WritableUnalignedMapping shm(region, kDataSize, 0); |
| ASSERT_FALSE(shm.IsValid()); |
| EXPECT_EQ(shm.memory(), nullptr); |
| } |
| |
| TEST(WritableUnalignedMappingTest, Map_NegativeOffset) { |
| auto region = CreateRegion(kData, kDataSize); |
| WritableUnalignedMapping shm(region, kDataSize, -1); |
| ASSERT_FALSE(shm.IsValid()); |
| } |
| |
| TEST(WritableUnalignedMappingTest, Map_SizeOverflow) { |
| auto region = CreateRegion(kData, kDataSize); |
| WritableUnalignedMapping shm(region, std::numeric_limits<size_t>::max(), 1); |
| ASSERT_FALSE(shm.IsValid()); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, CreateAndDestroy) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| ReadOnlyUnalignedMapping shm(region, kDataSize, 0); |
| EXPECT_TRUE(shm.IsValid()); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, CreateAndDestroy_InvalidRegion) { |
| base::ReadOnlySharedMemoryRegion region; |
| ReadOnlyUnalignedMapping shm(region, kDataSize, 0); |
| EXPECT_FALSE(shm.IsValid()); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, Map) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| ReadOnlyUnalignedMapping shm(region, kDataSize, 0); |
| ASSERT_TRUE(shm.IsValid()); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, Map_Unaligned) { |
| auto region = CreateReadOnlyRegion(kUnalignedData, kUnalignedDataSize); |
| ReadOnlyUnalignedMapping shm(region, kDataSize, kUnalignedOffset); |
| ASSERT_TRUE(shm.IsValid()); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, Map_InvalidRegion) { |
| base::ReadOnlySharedMemoryRegion region; |
| ReadOnlyUnalignedMapping shm(region, kDataSize, 0); |
| ASSERT_FALSE(shm.IsValid()); |
| EXPECT_EQ(shm.memory(), nullptr); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, Map_NegativeOffset) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| ReadOnlyUnalignedMapping shm(region, kDataSize, -1); |
| ASSERT_FALSE(shm.IsValid()); |
| } |
| |
| TEST(ReadOnlyUnalignedMappingTest, Map_SizeOverflow) { |
| auto region = CreateReadOnlyRegion(kData, kDataSize); |
| ReadOnlyUnalignedMapping shm(region, std::numeric_limits<size_t>::max(), 1); |
| ASSERT_FALSE(shm.IsValid()); |
| } |
| |
| } // namespace media |