Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Unified Diff: media/filters/pipeline_integration_test.cc

Issue 10534096: Generalize AesDecryptor to make it more spec compliant. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compile error on Windows. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/filters/pipeline_integration_test.cc
diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc
index 2ad7b2ab51312910533908216a6f3aace4024c1d..47721385d332f6537e2c31c666f8838d110409c0 100644
--- a/media/filters/pipeline_integration_test.cc
+++ b/media/filters/pipeline_integration_test.cc
@@ -6,16 +6,20 @@
#include "base/bind.h"
#include "media/base/decoder_buffer.h"
+#include "media/base/mock_filters.h"
#include "media/base/test_data_util.h"
+#include "media/crypto/aes_decryptor.h"
+#include "media/crypto/decryptor_client.h"
#include "media/filters/chunk_demuxer_client.h"
+#include "testing/gtest/include/gtest/gtest.h"
-namespace media {
+using ::testing::_;
-// Key ID of the video track in test file "bear-320x240-encrypted.webm".
-static const unsigned char kKeyId[] =
- "\x11\xa5\x18\x37\xc4\x73\x84\x03\xe5\xe6\x57\xed\x8e\x06\xd9\x7c";
+namespace media {
-static const char* kSourceId = "SourceId";
+static const char kSourceId[] = "SourceId";
+static const char kClearKeySystem[] = "org.w3.clearkey";
+static const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 };
// Helper class that emulates calls made on the ChunkDemuxer by the
// Media Source API.
@@ -36,11 +40,8 @@ class MockMediaSource : public ChunkDemuxerClient {
virtual ~MockMediaSource() {}
- void set_decryptor(AesDecryptor* decryptor) {
- decryptor_ = decryptor;
- }
- AesDecryptor* decryptor() const {
- return decryptor_;
+ void set_decryptor_client(DecryptorClient* decryptor_client) {
+ decryptor_client_ = decryptor_client;
}
const std::string& url() const { return url_; }
@@ -95,14 +96,12 @@ class MockMediaSource : public ChunkDemuxerClient {
chunk_demuxer_ = NULL;
}
- virtual void KeyNeeded(scoped_array<uint8> init_data, int init_data_size) {
+ virtual void DemuxerNeedKey(scoped_array<uint8> init_data,
+ int init_data_size) {
DCHECK(init_data.get());
DCHECK_EQ(init_data_size, 16);
- DCHECK(decryptor());
- // In test file bear-320x240-encrypted.webm, the decryption key is equal to
- // |init_data|.
- decryptor()->AddKey(init_data.get(), init_data_size,
- init_data.get(), init_data_size);
+ DCHECK(decryptor_client_);
+ decryptor_client_->NeedKey("", "", init_data.Pass(), init_data_size);
}
private:
@@ -113,22 +112,86 @@ class MockMediaSource : public ChunkDemuxerClient {
bool has_audio_;
bool has_video_;
scoped_refptr<ChunkDemuxer> chunk_demuxer_;
- AesDecryptor* decryptor_;
+ DecryptorClient* decryptor_client_;
+};
+
+class MockEncryptedMedia : public MockDecryptorClient {
ddorwin 2012/06/14 21:00:13 FakeEncryptedMediaApp or MockDecryptorClientImpl w
xhwang 2012/06/15 01:41:04 Done.
+ public:
+ MockEncryptedMedia() : decryptor_(this) {}
+
+ AesDecryptor* decryptor() {
+ return &decryptor_;
+ }
+
+ // DecryptorClient implementation.
+ virtual void KeyMessage(const std::string& key_system,
+ const std::string& session_id,
+ scoped_array<uint8> message,
+ int message_length,
+ const std::string& default_url) {
+ EXPECT_TRUE(key_system == kClearKeySystem);
+ EXPECT_TRUE(!session_id.empty());
ddorwin 2012/06/14 21:00:13 EXPECT_FALSE(session_id.empty());
xhwang 2012/06/15 01:41:04 Done.
+ EXPECT_TRUE(message.get());
+ EXPECT_GT(message_length, 0);
+ key_system_string_ = key_system;
+ session_id_string_ = session_id;
+ }
+
+ virtual void NeedKey(const std::string& key_system,
+ const std::string& session_id,
+ scoped_array<uint8> init_data,
+ int init_data_length) {
+ key_system_string_ = key_system;
+ session_id_string_ = session_id;
+ if (key_system_string_.empty()) {
+ DCHECK(session_id_string_.empty());
ddorwin 2012/06/14 21:00:13 Something like: // First event - initialize a sess
xhwang 2012/06/15 01:41:04 Done.
+ decryptor_.GenerateKeyRequest(kClearKeySystem,
+ kInitData, arraysize(kInitData));
+ }
+
+ EXPECT_FALSE(key_system_string_.empty());
+ EXPECT_FALSE(session_id_string_.empty());
+ // In test file bear-320x240-encrypted.webm, the decryption key is equal to
+ // |init_data|.
+ decryptor_.AddKey(key_system_string_, init_data.get(), init_data_length,
+ init_data.get(), init_data_length, session_id_string_);
+ }
+
+ private:
+ AesDecryptor decryptor_;
+ std::string key_system_string_;
ddorwin 2012/06/14 21:00:13 Both "key_system*" are strings. Maybe "current_key
xhwang 2012/06/15 01:41:04 Done.
+ std::string session_id_string_;
};
class PipelineIntegrationTest
: public testing::Test,
public PipelineIntegrationTestBase {
public:
- void StartPipelineWithMediaSource(MockMediaSource& source) {
+ void StartPipelineWithMediaSource(MockMediaSource* source) {
+ pipeline_->Start(
+ CreateFilterCollection(source),
+ base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)),
+ base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)),
+ QuitOnStatusCB(PIPELINE_OK));
+
+ ASSERT_TRUE(decoder_.get());
+
+ message_loop_.Run();
+ }
+
+ void StartPipelineWithEncryptedMedia(MockMediaSource* source,
+ MockEncryptedMedia* encrypted_media) {
pipeline_->Start(
- CreateFilterCollection(&source),
+ CreateFilterCollection(source),
base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)),
base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)),
QuitOnStatusCB(PIPELINE_OK));
ASSERT_TRUE(decoder_.get());
- source.set_decryptor(decryptor_.get());
+ decoder_->set_decryptor(encrypted_media->decryptor());
+ source->set_decryptor_client(encrypted_media);
+
+ EXPECT_CALL(*encrypted_media, KeyAdded(kClearKeySystem, _));
ddorwin 2012/06/14 21:00:13 NotNull() doesn't work?
xhwang 2012/06/15 01:41:04 Done.
message_loop_.Run();
}
@@ -145,7 +208,7 @@ class PipelineIntegrationTest
bool has_audio,
bool has_video) {
MockMediaSource source(filename, initial_append_size, has_audio, has_video);
- StartPipelineWithMediaSource(source);
+ StartPipelineWithMediaSource(&source);
if (pipeline_status_ != PIPELINE_OK)
return false;
@@ -188,7 +251,8 @@ TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) {
TEST_F(PipelineIntegrationTest, EncryptedPlayback) {
MockMediaSource source("bear-320x240-encrypted.webm", 219726, true, true);
- StartPipelineWithMediaSource(source);
+ MockEncryptedMedia encrypted_media;
+ StartPipelineWithEncryptedMedia(&source, &encrypted_media);
source.EndOfStream();
ASSERT_EQ(PIPELINE_OK, pipeline_status_);

Powered by Google App Engine
This is Rietveld 408576698