| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromecast/media/cma/ipc/media_message.h" |
| 6 |
| 5 #include <stddef.h> | 7 #include <stddef.h> |
| 6 #include <stdint.h> | 8 #include <stdint.h> |
| 7 | 9 |
| 10 #include <memory> |
| 11 |
| 8 #include "base/bind.h" | 12 #include "base/bind.h" |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "chromecast/media/cma/ipc/media_memory_chunk.h" | 13 #include "chromecast/media/cma/ipc/media_memory_chunk.h" |
| 11 #include "chromecast/media/cma/ipc/media_message.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 15 |
| 14 namespace chromecast { | 16 namespace chromecast { |
| 15 namespace media { | 17 namespace media { |
| 16 | 18 |
| 17 namespace { | 19 namespace { |
| 18 | 20 |
| 19 class ExternalMemoryBlock | 21 class ExternalMemoryBlock |
| 20 : public MediaMemoryChunk { | 22 : public MediaMemoryChunk { |
| 21 public: | 23 public: |
| 22 ExternalMemoryBlock(void* data, size_t size) | 24 ExternalMemoryBlock(void* data, size_t size) |
| 23 : data_(data), size_(size) {} | 25 : data_(data), size_(size) {} |
| 24 ~ExternalMemoryBlock() override {} | 26 ~ExternalMemoryBlock() override {} |
| 25 | 27 |
| 26 // MediaMemoryChunk implementation. | 28 // MediaMemoryChunk implementation. |
| 27 void* data() const override { return data_; } | 29 void* data() const override { return data_; } |
| 28 size_t size() const override { return size_; } | 30 size_t size() const override { return size_; } |
| 29 bool valid() const override { return true; } | 31 bool valid() const override { return true; } |
| 30 | 32 |
| 31 private: | 33 private: |
| 32 void* const data_; | 34 void* const data_; |
| 33 const size_t size_; | 35 const size_t size_; |
| 34 }; | 36 }; |
| 35 | 37 |
| 36 scoped_ptr<MediaMemoryChunk> DummyAllocator( | 38 std::unique_ptr<MediaMemoryChunk> DummyAllocator(void* data, |
| 37 void* data, size_t size, size_t alloc_size) { | 39 size_t size, |
| 40 size_t alloc_size) { |
| 38 CHECK_LE(alloc_size, size); | 41 CHECK_LE(alloc_size, size); |
| 39 return scoped_ptr<MediaMemoryChunk>( | 42 return std::unique_ptr<MediaMemoryChunk>( |
| 40 new ExternalMemoryBlock(data, alloc_size)); | 43 new ExternalMemoryBlock(data, alloc_size)); |
| 41 } | 44 } |
| 42 | 45 |
| 43 } | 46 } |
| 44 | 47 |
| 45 TEST(MediaMessageTest, WriteRead) { | 48 TEST(MediaMessageTest, WriteRead) { |
| 46 int buffer_size = 1024; | 49 int buffer_size = 1024; |
| 47 scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); | 50 std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| 48 MediaMessage::MemoryAllocatorCB mem_alloc_cb( | 51 MediaMessage::MemoryAllocatorCB mem_alloc_cb( |
| 49 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); | 52 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); |
| 50 uint32_t type = 0x1; | 53 uint32_t type = 0x1; |
| 51 int msg_content_capacity = 512; | 54 int msg_content_capacity = 512; |
| 52 | 55 |
| 53 // Write a message. | 56 // Write a message. |
| 54 int count = 64; | 57 int count = 64; |
| 55 scoped_ptr<MediaMessage> msg1( | 58 std::unique_ptr<MediaMessage> msg1( |
| 56 MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity)); | 59 MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity)); |
| 57 for (int k = 0; k < count; k++) { | 60 for (int k = 0; k < count; k++) { |
| 58 int v1 = 2 * k + 1; | 61 int v1 = 2 * k + 1; |
| 59 EXPECT_TRUE(msg1->WritePod(v1)); | 62 EXPECT_TRUE(msg1->WritePod(v1)); |
| 60 uint8_t v2 = k; | 63 uint8_t v2 = k; |
| 61 EXPECT_TRUE(msg1->WritePod(v2)); | 64 EXPECT_TRUE(msg1->WritePod(v2)); |
| 62 } | 65 } |
| 63 EXPECT_EQ(msg1->content_size(), count * (sizeof(int) + sizeof(uint8_t))); | 66 EXPECT_EQ(msg1->content_size(), count * (sizeof(int) + sizeof(uint8_t))); |
| 64 | 67 |
| 65 // Verify the integrity of the message. | 68 // Verify the integrity of the message. |
| 66 scoped_ptr<MediaMessage> msg2( | 69 std::unique_ptr<MediaMessage> msg2( |
| 67 MediaMessage::MapMessage(scoped_ptr<MediaMemoryChunk>( | 70 MediaMessage::MapMessage(std::unique_ptr<MediaMemoryChunk>( |
| 68 new ExternalMemoryBlock(&buffer[0], buffer_size)))); | 71 new ExternalMemoryBlock(&buffer[0], buffer_size)))); |
| 69 for (int k = 0; k < count; k++) { | 72 for (int k = 0; k < count; k++) { |
| 70 int v1; | 73 int v1; |
| 71 int expected_v1 = 2 * k + 1; | 74 int expected_v1 = 2 * k + 1; |
| 72 EXPECT_TRUE(msg2->ReadPod(&v1)); | 75 EXPECT_TRUE(msg2->ReadPod(&v1)); |
| 73 EXPECT_EQ(v1, expected_v1); | 76 EXPECT_EQ(v1, expected_v1); |
| 74 uint8_t v2; | 77 uint8_t v2; |
| 75 uint8_t expected_v2 = k; | 78 uint8_t expected_v2 = k; |
| 76 EXPECT_TRUE(msg2->ReadPod(&v2)); | 79 EXPECT_TRUE(msg2->ReadPod(&v2)); |
| 77 EXPECT_EQ(v2, expected_v2); | 80 EXPECT_EQ(v2, expected_v2); |
| 78 } | 81 } |
| 79 } | 82 } |
| 80 | 83 |
| 81 TEST(MediaMessageTest, WriteOverflow) { | 84 TEST(MediaMessageTest, WriteOverflow) { |
| 82 int buffer_size = 1024; | 85 int buffer_size = 1024; |
| 83 scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); | 86 std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| 84 MediaMessage::MemoryAllocatorCB mem_alloc_cb( | 87 MediaMessage::MemoryAllocatorCB mem_alloc_cb( |
| 85 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); | 88 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); |
| 86 uint32_t type = 0x1; | 89 uint32_t type = 0x1; |
| 87 int msg_content_capacity = 8; | 90 int msg_content_capacity = 8; |
| 88 | 91 |
| 89 scoped_ptr<MediaMessage> msg1( | 92 std::unique_ptr<MediaMessage> msg1( |
| 90 MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity)); | 93 MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity)); |
| 91 uint32_t v1 = 0; | 94 uint32_t v1 = 0; |
| 92 uint8_t v2 = 0; | 95 uint8_t v2 = 0; |
| 93 EXPECT_TRUE(msg1->WritePod(v1)); | 96 EXPECT_TRUE(msg1->WritePod(v1)); |
| 94 EXPECT_TRUE(msg1->WritePod(v1)); | 97 EXPECT_TRUE(msg1->WritePod(v1)); |
| 95 | 98 |
| 96 EXPECT_FALSE(msg1->WritePod(v1)); | 99 EXPECT_FALSE(msg1->WritePod(v1)); |
| 97 EXPECT_FALSE(msg1->WritePod(v2)); | 100 EXPECT_FALSE(msg1->WritePod(v2)); |
| 98 } | 101 } |
| 99 | 102 |
| 100 TEST(MediaMessageTest, ReadOverflow) { | 103 TEST(MediaMessageTest, ReadOverflow) { |
| 101 int buffer_size = 1024; | 104 int buffer_size = 1024; |
| 102 scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); | 105 std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| 103 MediaMessage::MemoryAllocatorCB mem_alloc_cb( | 106 MediaMessage::MemoryAllocatorCB mem_alloc_cb( |
| 104 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); | 107 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); |
| 105 uint32_t type = 0x1; | 108 uint32_t type = 0x1; |
| 106 int msg_content_capacity = 8; | 109 int msg_content_capacity = 8; |
| 107 | 110 |
| 108 scoped_ptr<MediaMessage> msg1( | 111 std::unique_ptr<MediaMessage> msg1( |
| 109 MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity)); | 112 MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity)); |
| 110 uint32_t v1 = 0xcd; | 113 uint32_t v1 = 0xcd; |
| 111 EXPECT_TRUE(msg1->WritePod(v1)); | 114 EXPECT_TRUE(msg1->WritePod(v1)); |
| 112 EXPECT_TRUE(msg1->WritePod(v1)); | 115 EXPECT_TRUE(msg1->WritePod(v1)); |
| 113 | 116 |
| 114 scoped_ptr<MediaMessage> msg2( | 117 std::unique_ptr<MediaMessage> msg2( |
| 115 MediaMessage::MapMessage(scoped_ptr<MediaMemoryChunk>( | 118 MediaMessage::MapMessage(std::unique_ptr<MediaMemoryChunk>( |
| 116 new ExternalMemoryBlock(&buffer[0], buffer_size)))); | 119 new ExternalMemoryBlock(&buffer[0], buffer_size)))); |
| 117 uint32_t v2; | 120 uint32_t v2; |
| 118 EXPECT_TRUE(msg2->ReadPod(&v2)); | 121 EXPECT_TRUE(msg2->ReadPod(&v2)); |
| 119 EXPECT_EQ(v2, v1); | 122 EXPECT_EQ(v2, v1); |
| 120 EXPECT_TRUE(msg2->ReadPod(&v2)); | 123 EXPECT_TRUE(msg2->ReadPod(&v2)); |
| 121 EXPECT_EQ(v2, v1); | 124 EXPECT_EQ(v2, v1); |
| 122 EXPECT_FALSE(msg2->ReadPod(&v2)); | 125 EXPECT_FALSE(msg2->ReadPod(&v2)); |
| 123 } | 126 } |
| 124 | 127 |
| 125 TEST(MediaMessageTest, DummyMessage) { | 128 TEST(MediaMessageTest, DummyMessage) { |
| 126 int buffer_size = 1024; | 129 int buffer_size = 1024; |
| 127 scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); | 130 std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| 128 MediaMessage::MemoryAllocatorCB mem_alloc_cb( | 131 MediaMessage::MemoryAllocatorCB mem_alloc_cb( |
| 129 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); | 132 base::Bind(&DummyAllocator, buffer.get(), buffer_size)); |
| 130 uint32_t type = 0x1; | 133 uint32_t type = 0x1; |
| 131 | 134 |
| 132 // Create first a dummy message to estimate the content size. | 135 // Create first a dummy message to estimate the content size. |
| 133 scoped_ptr<MediaMessage> msg1( | 136 std::unique_ptr<MediaMessage> msg1(MediaMessage::CreateDummyMessage(type)); |
| 134 MediaMessage::CreateDummyMessage(type)); | |
| 135 uint32_t v1 = 0xcd; | 137 uint32_t v1 = 0xcd; |
| 136 EXPECT_TRUE(msg1->WritePod(v1)); | 138 EXPECT_TRUE(msg1->WritePod(v1)); |
| 137 EXPECT_TRUE(msg1->WritePod(v1)); | 139 EXPECT_TRUE(msg1->WritePod(v1)); |
| 138 | 140 |
| 139 // Create the real message and write the actual content. | 141 // Create the real message and write the actual content. |
| 140 scoped_ptr<MediaMessage> msg2( | 142 std::unique_ptr<MediaMessage> msg2( |
| 141 MediaMessage::CreateMessage(type, mem_alloc_cb, msg1->content_size())); | 143 MediaMessage::CreateMessage(type, mem_alloc_cb, msg1->content_size())); |
| 142 EXPECT_TRUE(msg2->WritePod(v1)); | 144 EXPECT_TRUE(msg2->WritePod(v1)); |
| 143 EXPECT_TRUE(msg2->WritePod(v1)); | 145 EXPECT_TRUE(msg2->WritePod(v1)); |
| 144 EXPECT_FALSE(msg2->WritePod(v1)); | 146 EXPECT_FALSE(msg2->WritePod(v1)); |
| 145 } | 147 } |
| 146 | 148 |
| 147 } // namespace media | 149 } // namespace media |
| 148 } // namespace chromecast | 150 } // namespace chromecast |
| OLD | NEW |