blob: e2a8a054f593ac1293281a990d89da656945187b [file] [log] [blame]
// Copyright 2017 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.
#import "ios/web/download/download_controller_impl.h"
#include <memory>
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "ios/web/public/test/fakes/fake_download_controller_delegate.h"
#include "ios/web/public/test/fakes/test_browser_state.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "ios/web/public/test/web_task_environment.h"
#include "ios/web/public/test/web_test.h"
#include "net/url_request/url_fetcher_response_writer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace web {
namespace {
const char kContentDisposition[] = "attachment; filename=file.test";
const char kMimeType[] = "application/pdf";
} // namespace
// Test fixture for testing DownloadControllerImpl class.
class DownloadControllerImplTest : public WebTest {
protected:
DownloadControllerImplTest()
: download_controller_(std::make_unique<DownloadControllerImpl>()),
delegate_(download_controller_.get()) {
web_state_.SetBrowserState(GetBrowserState());
}
TestWebState web_state_;
std::unique_ptr<DownloadControllerImpl> download_controller_;
FakeDownloadControllerDelegate delegate_;
};
// Tests that DownloadController::GetDelegate returns delegate_.
TEST_F(DownloadControllerImplTest, Delegate) {
ASSERT_EQ(&delegate_, download_controller_->GetDelegate());
}
// Tests that DownloadController::FromBrowserState returns the same object for
// each call.
TEST_F(DownloadControllerImplTest, FromBrowserState) {
DownloadController* first_call_controller =
DownloadController::FromBrowserState(GetBrowserState());
ASSERT_TRUE(first_call_controller);
DownloadController* second_call_controller =
DownloadController::FromBrowserState(GetBrowserState());
ASSERT_EQ(first_call_controller, second_call_controller);
}
// Tests that DownloadController::CreateDownloadTask calls
// DownloadControllerDelegate::OnDownloadCreated.
TEST_F(DownloadControllerImplTest, OnDownloadCreated) {
NSString* identifier = [NSUUID UUID].UUIDString;
GURL url("https://download.test");
download_controller_->CreateDownloadTask(
&web_state_, identifier, url, @"POST", kContentDisposition,
/*total_bytes=*/-1, kMimeType, ui::PageTransition::PAGE_TRANSITION_TYPED);
ASSERT_EQ(1U, delegate_.alive_download_tasks().size());
DownloadTask* task = delegate_.alive_download_tasks()[0].second.get();
EXPECT_EQ(&web_state_, delegate_.alive_download_tasks()[0].first);
EXPECT_NSEQ(identifier, task->GetIndentifier());
EXPECT_EQ(url, task->GetOriginalUrl());
EXPECT_NSEQ(@"POST", task->GetHttpMethod());
EXPECT_FALSE(task->IsDone());
EXPECT_EQ(0, task->GetErrorCode());
EXPECT_EQ(-1, task->GetTotalBytes());
EXPECT_EQ(-1, task->GetPercentComplete());
EXPECT_EQ(kContentDisposition, task->GetContentDisposition());
EXPECT_EQ(kMimeType, task->GetMimeType());
EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs(
task->GetTransitionType(), ui::PageTransition::PAGE_TRANSITION_TYPED));
EXPECT_EQ("file.test", base::UTF16ToUTF8(task->GetSuggestedFilename()));
}
// Tests that DownloadController::FromBrowserState does not crash if used
// without delegate.
TEST_F(DownloadControllerImplTest, NullDelegate) {
download_controller_->SetDelegate(nullptr);
GURL url("https://download.test");
download_controller_->CreateDownloadTask(
&web_state_, [NSUUID UUID].UUIDString, url, @"GET", kContentDisposition,
/*total_bytes=*/-1, kMimeType, ui::PageTransition::PAGE_TRANSITION_LINK);
}
// Tests that DownloadController::CreateSession sets cookies correctly into the
// session's NSURLSessionConfiguration object.
TEST_F(DownloadControllerImplTest, SessionCookies) {
NSString* identifier = [NSUUID UUID].UUIDString;
NSURL* cookie_url = [NSURL URLWithString:@"https://download.test"];
NSHTTPCookie* cookie = [NSHTTPCookie cookieWithProperties:@{
NSHTTPCookieName : @"name",
NSHTTPCookieValue : @"value",
NSHTTPCookiePath : cookie_url.path,
NSHTTPCookieDomain : cookie_url.host,
NSHTTPCookieVersion : @1,
}];
NSURLSession* session = download_controller_->CreateSession(
identifier, @[ cookie ], /*delegate=*/nil, /*delegate_queue=*/nil);
NSArray* cookies = session.configuration.HTTPCookieStorage.cookies;
EXPECT_EQ(1U, cookies.count);
EXPECT_NSEQ(cookie, cookies.firstObject);
}
} // namespace web