| Index: media/webm/webm_cluster_parser_unittest.cc
|
| diff --git a/media/webm/webm_cluster_parser_unittest.cc b/media/webm/webm_cluster_parser_unittest.cc
|
| index 07deb05515ac7c3256b92a250178ec3c1722d579..dc7332975d4aa455494eda280a69eac10fd694a9 100644
|
| --- a/media/webm/webm_cluster_parser_unittest.cc
|
| +++ b/media/webm/webm_cluster_parser_unittest.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| +#include "media/base/decrypt_config.h"
|
| #include "media/webm/cluster_builder.h"
|
| #include "media/webm/webm_cluster_parser.h"
|
| #include "media/webm/webm_constants.h"
|
| @@ -32,7 +33,7 @@ struct BlockInfo {
|
| bool use_simple_block;
|
| };
|
|
|
| -const BlockInfo kDefaultBlockInfo[] = {
|
| +static const BlockInfo kDefaultBlockInfo[] = {
|
| { kAudioTrackNum, 0, 23, true },
|
| { kAudioTrackNum, 23, 23, true },
|
| { kVideoTrackNum, 33, 34, true },
|
| @@ -42,6 +43,11 @@ const BlockInfo kDefaultBlockInfo[] = {
|
| { kVideoTrackNum, 100, 33, false },
|
| };
|
|
|
| +static const uint8 kEncryptedFrame[] = {
|
| + 0x01, // Block is encrypted
|
| + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 // IV
|
| +};
|
| +
|
| static scoped_ptr<Cluster> CreateCluster(int timecode,
|
| const BlockInfo* block_info,
|
| int block_count) {
|
| @@ -67,6 +73,18 @@ static scoped_ptr<Cluster> CreateCluster(int timecode,
|
| return cb.Finish();
|
| }
|
|
|
| +// Creates a Cluster with one encrypted Block. |bytes_to_write| is number of
|
| +// bytes of the encrypted frame to write.
|
| +static scoped_ptr<Cluster> CreateEncryptedCluster(int bytes_to_write) {
|
| + CHECK_GT(bytes_to_write, 0);
|
| + CHECK_LE(bytes_to_write, static_cast<int>(sizeof(kEncryptedFrame)));
|
| +
|
| + ClusterBuilder cb;
|
| + cb.SetClusterTimecode(0);
|
| + cb.AddSimpleBlock(kVideoTrackNum, 0, 0, kEncryptedFrame, bytes_to_write);
|
| + return cb.Finish();
|
| +}
|
| +
|
| static bool VerifyBuffers(const WebMClusterParser::BufferQueue& audio_buffers,
|
| const WebMClusterParser::BufferQueue& video_buffers,
|
| const WebMClusterParser::BufferQueue& text_buffers,
|
| @@ -165,6 +183,15 @@ static bool VerifyTextBuffers(
|
| return true;
|
| }
|
|
|
| +static bool VerifyEncryptedBuffer(
|
| + scoped_refptr<StreamParserBuffer> buffer) {
|
| + EXPECT_TRUE(buffer->GetDecryptConfig());
|
| + EXPECT_EQ(static_cast<unsigned long>(DecryptConfig::kDecryptionKeySize),
|
| + buffer->GetDecryptConfig()->iv().length());
|
| + const uint8* data = buffer->GetData();
|
| + return data[0] & kWebMFlagEncryptedFrame;
|
| +}
|
| +
|
| static void AppendToEnd(const WebMClusterParser::BufferQueue& src,
|
| WebMClusterParser::BufferQueue* dest) {
|
| for (WebMClusterParser::BufferQueue::const_iterator itr = src.begin();
|
| @@ -440,4 +467,32 @@ TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) {
|
| }
|
| }
|
|
|
| +TEST_F(WebMClusterParserTest, ParseEncryptedBlock) {
|
| + scoped_ptr<Cluster> cluster(CreateEncryptedCluster(sizeof(kEncryptedFrame)));
|
| +
|
| + parser_.reset(new WebMClusterParser(
|
| + kTimecodeScale, kAudioTrackNum, kVideoTrackNum,
|
| + std::set<int>(),
|
| + std::set<int64>(), "", "video_key_id",
|
| + LogCB()));
|
| + int result = parser_->Parse(cluster->data(), cluster->size());
|
| + EXPECT_EQ(cluster->size(), result);
|
| + ASSERT_EQ(1UL, parser_->video_buffers().size());
|
| + scoped_refptr<StreamParserBuffer> buffer = parser_->video_buffers()[0];
|
| + EXPECT_TRUE(VerifyEncryptedBuffer(buffer));
|
| +}
|
| +
|
| +TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) {
|
| + scoped_ptr<Cluster> cluster(
|
| + CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1));
|
| +
|
| + parser_.reset(new WebMClusterParser(
|
| + kTimecodeScale, kAudioTrackNum, kVideoTrackNum,
|
| + std::set<int>(),
|
| + std::set<int64>(), "", "video_key_id",
|
| + LogCB()));
|
| + int result = parser_->Parse(cluster->data(), cluster->size());
|
| + EXPECT_EQ(-1, result);
|
| +}
|
| +
|
| } // namespace media
|
|
|