diff options
Diffstat (limited to 'media/webm/webm_cluster_parser_unittest.cc')
-rw-r--r-- | media/webm/webm_cluster_parser_unittest.cc | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/media/webm/webm_cluster_parser_unittest.cc b/media/webm/webm_cluster_parser_unittest.cc index 07deb05..dc73329 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 |