15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/data_buffer.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Constructor_ZeroSize) { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Zero-sized buffers are valid. In practice they aren't used very much but it 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // eliminates clients from worrying about null data pointers. 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = new DataBuffer(0); 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->data()); 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->writable_data()); 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer->data_size()); 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(buffer->end_of_stream()); 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Constructor_NonZeroSize) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Buffer size should be set. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = new DataBuffer(10); 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->data()); 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->writable_data()); 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, buffer->data_size()); 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(buffer->end_of_stream()); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Constructor_ScopedArray) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Data should be passed and both data and buffer size should be set. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kSize = 8; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> data(new uint8[kSize]); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8* kData = data.get(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = new DataBuffer(data.Pass(), kSize); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->data()); 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->writable_data()); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(kData, buffer->data()); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(kSize, buffer->data_size()); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(buffer->end_of_stream()); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, CopyFrom) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8 kTestData[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTestDataSize = arraysize(kTestData); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DataBuffer::CopyFrom(kTestData, kTestDataSize); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(kTestDataSize, buffer->data_size()); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(buffer->end_of_stream()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we are copying the data, not just pointing to the original data. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0, memcmp(buffer->data(), kTestData, kTestDataSize)); 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->writable_data()[0] = 0xFF; 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE(0, memcmp(buffer->data(), kTestData, kTestDataSize)); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, CreateEOSBuffer) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = DataBuffer::CreateEOSBuffer(); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->end_of_stream()); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Timestamp) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta kZero; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta kTimestampA = base::TimeDelta::FromMicroseconds(1337); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta kTimestampB = base::TimeDelta::FromMicroseconds(1234); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = new DataBuffer(0); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->timestamp() == kZero); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_timestamp(kTimestampA); 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->timestamp() == kTimestampA); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_timestamp(kTimestampB); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->timestamp() == kTimestampB); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Duration) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta kZero; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta kDurationA = base::TimeDelta::FromMicroseconds(1337); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta kDurationB = base::TimeDelta::FromMicroseconds(1234); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = new DataBuffer(0); 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->duration() == kZero); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_duration(kDurationA); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->duration() == kDurationA); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_duration(kDurationB); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(buffer->duration() == kDurationB); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DataBufferTest, ReadingWriting) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kDataSize = arraysize(kData); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kNewData[] = "chromium"; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNewDataSize = arraysize(kNewData); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a DataBuffer. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DataBuffer> buffer(new DataBuffer(kDataSize)); 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(buffer.get()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint8* data = buffer->writable_data(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(data, kData, kDataSize); 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_data_size(kDataSize); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint8* read_only_data = buffer->data(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(data, read_only_data); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, memcmp(read_only_data, kData, kDataSize)); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(buffer->end_of_stream()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DataBuffer> buffer2(new DataBuffer(kNewDataSize + 10)); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch data = buffer2->writable_data(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(data, kNewData, kNewDataSize); 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer2->set_data_size(kNewDataSize); 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch read_only_data = buffer2->data(); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(kNewDataSize, buffer2->data_size()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(data, read_only_data); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(read_only_data, kNewData, kNewDataSize)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 125