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