Home | History | Annotate | Download | only in ipc
      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
    147