Chromium Code Reviews| Index: webkit/renderer/media/android/media_info_loader_android_unittest.cc |
| diff --git a/webkit/renderer/media/android/media_info_loader_android_unittest.cc b/webkit/renderer/media/android/media_info_loader_android_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d61f461582a59b6fefcf1b24fa48cb4f684dad01 |
| --- /dev/null |
| +++ b/webkit/renderer/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/WebKit/chromium/public/WebMediaPlayer.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| +#include "third_party/WebKit/public/platform/WebURLError.h" |
| +#include "third_party/WebKit/public/platform/WebURLRequest.h" |
| +#include "third_party/WebKit/public/platform/WebURLResponse.h" |
| +#include "webkit/mocks/mock_webframeclient.h" |
| +#include "webkit/mocks/mock_weburlloader.h" |
| +#include "webkit/renderer/media/android/media_info_loader_android.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); |
|
acolwell GONE FROM CHROMIUM
2013/06/10 19:17:32
nit: s/redirectUrl/redirect_url/
Sami
2013/06/11 13:51:25
Done.
|
| + WebKit::WebURLRequest newRequest(redirectUrl); |
|
acolwell GONE FROM CHROMIUM
2013/06/10 19:17:32
nit: s/newRequest/new_request/
Sami
2013/06/11 13:51:25
Done.
|
| + WebKit::WebURLResponse redirectResponse(gurl_); |
|
acolwell GONE FROM CHROMIUM
2013/06/10 19:17:32
nit: s/redirectResponse/redirect_response/
Sami
2013/06/11 13:51:25
Done.
|
| + |
| + 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); |
|
acolwell GONE FROM CHROMIUM
2013/06/10 19:17:32
nit: split these out into seperate tests so that t
Sami
2013/06/11 13:51:25
Good idea, done.
|
| + 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 |