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