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

Unified Diff: webkit/media/android/media_info_loader_android_unittest.cc

Issue 16327002: android: Implement single origin and CORS check for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added tests. Created 7 years, 7 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: webkit/media/android/media_info_loader_android_unittest.cc
diff --git a/webkit/media/android/media_info_loader_android_unittest.cc b/webkit/media/android/media_info_loader_android_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2a968ae19ec884c6aa6fc5d6bb0e603771b0d2bb
--- /dev/null
+++ b/webkit/media/android/media_info_loader_android_unittest.cc
@@ -0,0 +1,192 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/message_loop.h"
+#include "third_party/WebKit/Source/Platform/chromium/public/WebURLError.h"
+#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h"
+#include "third_party/WebKit/Source/Platform/chromium/public/WebURLResponse.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayer.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
+#include "webkit/media/android/media_info_loader_android.h"
+#include "webkit/mocks/mock_webframeclient.h"
+#include "webkit/mocks/mock_weburlloader.h"
+
+using ::testing::_;
+using ::testing::InSequence;
+using ::testing::NiceMock;
+
+using WebKit::WebString;
+using WebKit::WebURLError;
+using WebKit::WebURLResponse;
+using WebKit::WebView;
+
+using webkit_glue::MockWebFrameClient;
+using webkit_glue::MockWebURLLoader;
+
+namespace webkit_media {
+
+static const char* kHttpUrl = "http://test";
+static const char kHttpRedirectToSameDomainUrl1[] = "http://test/ing";
+static const char kHttpRedirectToSameDomainUrl2[] = "http://test/ing2";
+static const char kHttpRedirectToDifferentDomainUrl1[] = "http://test2";
+
+static const int kHttpOK = 200;
+static const int kHttpNotFound = 404;
+
+class MediaInfoLoaderAndroidTest : public testing::Test {
+ public:
+ MediaInfoLoaderAndroidTest()
+ : view_(WebView::create(NULL)) {
+ view_->initializeMainFrame(&client_);
+ }
+
+ virtual ~MediaInfoLoaderAndroidTest() {
+ view_->close();
+ }
+
+ void Initialize(
+ const char* url,
+ WebKit::WebMediaPlayer::CORSMode cors_mode) {
+ gurl_ = GURL(url);
+
+ loader_.reset(new MediaInfoLoaderAndroid(
+ gurl_, cors_mode,
+ base::Bind(&MediaInfoLoaderAndroidTest::ReadyCallback,
+ base::Unretained(this))));
+
+ // |test_loader_| will be used when Start() is called.
+ url_loader_ = new NiceMock<MockWebURLLoader>();
+ loader_->test_loader_ = scoped_ptr<WebKit::WebURLLoader>(url_loader_);
+ }
+
+ void Start() {
+ InSequence s;
+ EXPECT_CALL(*url_loader_, loadAsynchronously(_, _));
+ loader_->Start(view_->mainFrame());
+ }
+
+ void Stop() {
+ InSequence s;
+ EXPECT_CALL(*url_loader_, cancel());
+ loader_.reset();
+ }
+
+ void Redirect(const char* url) {
+ GURL redirectUrl(url);
+ WebKit::WebURLRequest newRequest(redirectUrl);
+ WebKit::WebURLResponse redirectResponse(gurl_);
+
+ loader_->willSendRequest(url_loader_, newRequest, redirectResponse);
+
+ base::MessageLoop::current()->RunUntilIdle();
+ }
+
+ void SendResponse(
+ int http_status, MediaInfoLoaderAndroid::Status expected_status) {
+ EXPECT_CALL(*this, ReadyCallback(expected_status));
+
+ WebURLResponse response(gurl_);
+ response.setHTTPHeaderField(WebString::fromUTF8("Content-Length"),
+ WebString::fromUTF8("0"));
+ response.setExpectedContentLength(0);
+ response.setHTTPStatusCode(http_status);
+ loader_->didReceiveResponse(url_loader_, response);
+ }
+
+ void FailLoad() {
+ EXPECT_CALL(*this, ReadyCallback(MediaInfoLoaderAndroid::kFailed));
+ loader_->didFail(url_loader_, WebURLError());
+ }
+
+ MOCK_METHOD1(ReadyCallback, void(MediaInfoLoaderAndroid::Status));
+
+ protected:
+ GURL gurl_;
+
+ scoped_ptr<MediaInfoLoaderAndroid> loader_;
+ NiceMock<MockWebURLLoader>* url_loader_;
+
+ MockWebFrameClient client_;
+ WebView* view_;
+
+ base::MessageLoop message_loop_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MediaInfoLoaderAndroidTest);
+};
+
+TEST_F(MediaInfoLoaderAndroidTest, StartStop) {
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ Stop();
+}
+
+TEST_F(MediaInfoLoaderAndroidTest, LoadFailure) {
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ FailLoad();
+ Stop();
+}
+
+TEST_F(MediaInfoLoaderAndroidTest, HasSingleOrigin) {
+ // Make sure no redirect case works as expected.
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ SendResponse(kHttpOK, MediaInfoLoaderAndroid::kOk);
+ EXPECT_TRUE(loader_->HasSingleOrigin());
+ Stop();
+
+ // Test redirect to the same domain.
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ Redirect(kHttpRedirectToSameDomainUrl1);
+ SendResponse(kHttpOK, MediaInfoLoaderAndroid::kOk);
+ EXPECT_TRUE(loader_->HasSingleOrigin());
+ Stop();
+
+ // Test redirect twice to the same domain.
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ Redirect(kHttpRedirectToSameDomainUrl1);
+ Redirect(kHttpRedirectToSameDomainUrl2);
+ SendResponse(kHttpOK, MediaInfoLoaderAndroid::kOk);
+ EXPECT_TRUE(loader_->HasSingleOrigin());
+ Stop();
+
+ // Test redirect to a different domain.
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ Redirect(kHttpRedirectToDifferentDomainUrl1);
+ SendResponse(kHttpOK, MediaInfoLoaderAndroid::kOk);
+ EXPECT_FALSE(loader_->HasSingleOrigin());
+ Stop();
+
+ // Test redirect to the same domain and then to a different domain.
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUnspecified);
+ Start();
+ Redirect(kHttpRedirectToSameDomainUrl1);
+ Redirect(kHttpRedirectToDifferentDomainUrl1);
+ SendResponse(kHttpOK, MediaInfoLoaderAndroid::kOk);
+ EXPECT_FALSE(loader_->HasSingleOrigin());
+ Stop();
+}
+
+TEST_F(MediaInfoLoaderAndroidTest, CORSAccessCheckPassed) {
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUseCredentials);
+ Start();
+ SendResponse(kHttpOK, MediaInfoLoaderAndroid::kOk);
+ EXPECT_TRUE(loader_->DidPassCORSAccessCheck());
+ Stop();
+}
+
+TEST_F(MediaInfoLoaderAndroidTest, CORSAccessCheckFailed) {
+ Initialize(kHttpUrl, WebKit::WebMediaPlayer::CORSModeUseCredentials);
+ Start();
+ SendResponse(kHttpNotFound, MediaInfoLoaderAndroid::kFailed);
+ EXPECT_FALSE(loader_->DidPassCORSAccessCheck());
+ Stop();
+}
+
+} // namespace webkit_media

Powered by Google App Engine
This is Rietveld 408576698