| Index: chromecast/media/cma/ipc/media_message_unittest.cc
|
| diff --git a/chromecast/media/cma/ipc/media_message_unittest.cc b/chromecast/media/cma/ipc/media_message_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..07d9655bfb5f738a8dce3d714b1b716670b2a07c
|
| --- /dev/null
|
| +++ b/chromecast/media/cma/ipc/media_message_unittest.cc
|
| @@ -0,0 +1,146 @@
|
| +// Copyright 2014 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 "base/basictypes.h"
|
| +#include "base/bind.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "chromecast/media/cma/ipc/media_memory_chunk.h"
|
| +#include "chromecast/media/cma/ipc/media_message.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace chromecast {
|
| +namespace media {
|
| +
|
| +namespace {
|
| +
|
| +class ExternalMemoryBlock
|
| + : public MediaMemoryChunk {
|
| + public:
|
| + ExternalMemoryBlock(void* data, size_t size)
|
| + : data_(data), size_(size) {}
|
| + virtual ~ExternalMemoryBlock() {}
|
| +
|
| + // MediaMemoryChunk implementation.
|
| + virtual void* data() const OVERRIDE { return data_; }
|
| + virtual size_t size() const OVERRIDE { return size_; }
|
| + virtual bool valid() const OVERRIDE { return true; }
|
| +
|
| + private:
|
| + void* const data_;
|
| + const size_t size_;
|
| +};
|
| +
|
| +scoped_ptr<MediaMemoryChunk> DummyAllocator(
|
| + void* data, size_t size, size_t alloc_size) {
|
| + CHECK_LE(alloc_size, size);
|
| + return scoped_ptr<MediaMemoryChunk>(
|
| + new ExternalMemoryBlock(data, alloc_size));
|
| +}
|
| +
|
| +}
|
| +
|
| +TEST(MediaMessageTest, WriteRead) {
|
| + int buffer_size = 1024;
|
| + scoped_ptr<uint8[]> buffer(new uint8[buffer_size]);
|
| + MediaMessage::MemoryAllocatorCB mem_alloc_cb(
|
| + base::Bind(&DummyAllocator, buffer.get(), buffer_size));
|
| + uint32 type = 0x1;
|
| + int msg_content_capacity = 512;
|
| +
|
| + // Write a message.
|
| + int count = 64;
|
| + scoped_ptr<MediaMessage> msg1(
|
| + MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity));
|
| + for (int k = 0; k < count; k++) {
|
| + int v1 = 2 * k + 1;
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| + uint8 v2 = k;
|
| + EXPECT_TRUE(msg1->WritePod(v2));
|
| + }
|
| + EXPECT_EQ(msg1->content_size(), count * (sizeof(int) + sizeof(uint8)));
|
| +
|
| + // Verify the integrity of the message.
|
| + scoped_ptr<MediaMessage> msg2(
|
| + MediaMessage::MapMessage(scoped_ptr<MediaMemoryChunk>(
|
| + new ExternalMemoryBlock(&buffer[0], buffer_size))));
|
| + for (int k = 0; k < count; k++) {
|
| + int v1;
|
| + int expected_v1 = 2 * k + 1;
|
| + EXPECT_TRUE(msg2->ReadPod(&v1));
|
| + EXPECT_EQ(v1, expected_v1);
|
| + uint8 v2;
|
| + uint8 expected_v2 = k;
|
| + EXPECT_TRUE(msg2->ReadPod(&v2));
|
| + EXPECT_EQ(v2, expected_v2);
|
| + }
|
| +}
|
| +
|
| +TEST(MediaMessageTest, WriteOverflow) {
|
| + int buffer_size = 1024;
|
| + scoped_ptr<uint8[]> buffer(new uint8[buffer_size]);
|
| + MediaMessage::MemoryAllocatorCB mem_alloc_cb(
|
| + base::Bind(&DummyAllocator, buffer.get(), buffer_size));
|
| + uint32 type = 0x1;
|
| + int msg_content_capacity = 8;
|
| +
|
| + scoped_ptr<MediaMessage> msg1(
|
| + MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity));
|
| + uint32 v1 = 0;
|
| + uint8 v2 = 0;
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| +
|
| + EXPECT_FALSE(msg1->WritePod(v1));
|
| + EXPECT_FALSE(msg1->WritePod(v2));
|
| +}
|
| +
|
| +TEST(MediaMessageTest, ReadOverflow) {
|
| + int buffer_size = 1024;
|
| + scoped_ptr<uint8[]> buffer(new uint8[buffer_size]);
|
| + MediaMessage::MemoryAllocatorCB mem_alloc_cb(
|
| + base::Bind(&DummyAllocator, buffer.get(), buffer_size));
|
| + uint32 type = 0x1;
|
| + int msg_content_capacity = 8;
|
| +
|
| + scoped_ptr<MediaMessage> msg1(
|
| + MediaMessage::CreateMessage(type, mem_alloc_cb, msg_content_capacity));
|
| + uint32 v1 = 0xcd;
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| +
|
| + scoped_ptr<MediaMessage> msg2(
|
| + MediaMessage::MapMessage(scoped_ptr<MediaMemoryChunk>(
|
| + new ExternalMemoryBlock(&buffer[0], buffer_size))));
|
| + uint32 v2;
|
| + EXPECT_TRUE(msg2->ReadPod(&v2));
|
| + EXPECT_EQ(v2, v1);
|
| + EXPECT_TRUE(msg2->ReadPod(&v2));
|
| + EXPECT_EQ(v2, v1);
|
| + EXPECT_FALSE(msg2->ReadPod(&v2));
|
| +}
|
| +
|
| +TEST(MediaMessageTest, DummyMessage) {
|
| + int buffer_size = 1024;
|
| + scoped_ptr<uint8[]> buffer(new uint8[buffer_size]);
|
| + MediaMessage::MemoryAllocatorCB mem_alloc_cb(
|
| + base::Bind(&DummyAllocator, buffer.get(), buffer_size));
|
| + uint32 type = 0x1;
|
| +
|
| + // Create first a dummy message to estimate the content size.
|
| + scoped_ptr<MediaMessage> msg1(
|
| + MediaMessage::CreateDummyMessage(type));
|
| + uint32 v1 = 0xcd;
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| + EXPECT_TRUE(msg1->WritePod(v1));
|
| +
|
| + // Create the real message and write the actual content.
|
| + scoped_ptr<MediaMessage> msg2(
|
| + MediaMessage::CreateMessage(type, mem_alloc_cb, msg1->content_size()));
|
| + EXPECT_TRUE(msg2->WritePod(v1));
|
| + EXPECT_TRUE(msg2->WritePod(v1));
|
| + EXPECT_FALSE(msg2->WritePod(v1));
|
| +}
|
| +
|
| +} // namespace media
|
| +} // namespace chromecast
|
|
|