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 |