| // 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/logging.h" |
| #include "base/macros.h" |
| #include "base/memory/shared_memory.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace media { |
| |
| namespace { |
| |
| const uint8_t kUnalignedData[] = "XXXhello"; |
| const size_t kUnalignedDataSize = arraysize(kUnalignedData); |
| const off_t kUnalignedOffset = 3; |
| |
| const uint8_t kData[] = "hello"; |
| const size_t kDataSize = arraysize(kData); |
| |
| base::SharedMemoryHandle CreateHandle(const uint8_t* data, size_t size) { |
| base::SharedMemory shm; |
| DCHECK(shm.CreateAndMapAnonymous(size)); |
| memcpy(shm.memory(), data, size); |
| return shm.TakeHandle(); |
| } |
| |
| } // namespace |
| |
| TEST(UnalignedSharedMemoryTest, CreateAndDestroy) { |
| auto handle = CreateHandle(kData, kDataSize); |
| UnalignedSharedMemory shm(handle, true); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, CreateAndDestroy_InvalidHandle) { |
| base::SharedMemoryHandle handle; |
| UnalignedSharedMemory shm(handle, true); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map) { |
| auto handle = CreateHandle(kData, kDataSize); |
| UnalignedSharedMemory shm(handle, true); |
| ASSERT_TRUE(shm.MapAt(0, kDataSize)); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_Unaligned) { |
| auto handle = CreateHandle(kUnalignedData, kUnalignedDataSize); |
| UnalignedSharedMemory shm(handle, true); |
| ASSERT_TRUE(shm.MapAt(kUnalignedOffset, kDataSize)); |
| EXPECT_EQ(0, memcmp(shm.memory(), kData, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_InvalidHandle) { |
| base::SharedMemoryHandle handle; |
| UnalignedSharedMemory shm(handle, true); |
| ASSERT_FALSE(shm.MapAt(1, kDataSize)); |
| EXPECT_EQ(shm.memory(), nullptr); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_NegativeOffset) { |
| auto handle = CreateHandle(kData, kDataSize); |
| UnalignedSharedMemory shm(handle, true); |
| ASSERT_FALSE(shm.MapAt(-1, kDataSize)); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, Map_SizeOverflow) { |
| auto handle = CreateHandle(kData, kDataSize); |
| UnalignedSharedMemory shm(handle, true); |
| ASSERT_FALSE(shm.MapAt(1, std::numeric_limits<size_t>::max())); |
| } |
| |
| TEST(UnalignedSharedMemoryTest, UnmappedIsNullptr) { |
| auto handle = CreateHandle(kData, kDataSize); |
| UnalignedSharedMemory shm(handle, true); |
| ASSERT_EQ(shm.memory(), nullptr); |
| } |
| |
| } // namespace media |