| // Copyright 2017 The Chromium Authors |
| // 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" |
| |
| #import <memory> |
| |
| #import "base/run_loop.h" |
| #import "base/strings/utf_string_conversions.h" |
| #import "ios/web/public/test/fakes/fake_download_controller_delegate.h" |
| #import "ios/web/public/test/fakes/fake_web_state.h" |
| #import "ios/web/public/test/web_task_environment.h" |
| #import "ios/web/public/test/web_test.h" |
| #import "ios/web/test/fakes/fake_native_task_bridge.h" |
| #import "testing/gtest/include/gtest/gtest.h" |
| #import "testing/gtest_mac.h" |
| |
| namespace web { |
| |
| namespace { |
| const char kContentDisposition[] = "attachment; filename=file.test"; |
| const char kMimeType[] = "application/pdf"; |
| const base::FilePath::CharType kTestFileName[] = FILE_PATH_LITERAL("file.test"); |
| } // namespace |
| |
| // Test fixture for testing DownloadControllerImpl class. |
| class DownloadControllerImplTest : public WebTest { |
| protected: |
| DownloadControllerImplTest() {} |
| |
| void SetUp() override { |
| WebTest::SetUp(); |
| |
| download_controller_ = std::make_unique<DownloadControllerImpl>(); |
| delegate_ = std::make_unique<FakeDownloadControllerDelegate>( |
| download_controller_.get()); |
| web_state_.SetBrowserState(GetBrowserState()); |
| } |
| |
| FakeWebState web_state_; |
| std::unique_ptr<DownloadControllerImpl> download_controller_; |
| std::unique_ptr<FakeDownloadControllerDelegate> delegate_; |
| }; |
| |
| // Tests that DownloadController::GetDelegate returns delegate_. |
| TEST_F(DownloadControllerImplTest, Delegate) { |
| ASSERT_EQ(delegate_.get(), 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::CreateNativeDownloadTask calls |
| // DownloadControllerDelegate::OnDownloadCreated. |
| TEST_F(DownloadControllerImplTest, OnNativeDownloadCreated) { |
| NSString* identifier = [NSUUID UUID].UUIDString; |
| GURL url("https://download.test"); |
| |
| WKDownload* fake_download = nil; |
| id<DownloadNativeTaskBridgeDelegate> fake_delegate = nil; |
| FakeNativeTaskBridge* fake_task_bridge = |
| [[FakeNativeTaskBridge alloc] initWithDownload:fake_download |
| delegate:fake_delegate]; |
| |
| download_controller_->CreateNativeDownloadTask( |
| &web_state_, identifier, url, @"POST", kContentDisposition, |
| /*total_bytes=*/-1, kMimeType, fake_task_bridge); |
| |
| 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->GetIdentifier()); |
| 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_EQ(base::FilePath(kTestFileName), task->GenerateFileName()); |
| } |
| |
| // Tests that DownloadController::FromBrowserState does not crash if used |
| // without delegate. |
| TEST_F(DownloadControllerImplTest, NullDelegate) { |
| download_controller_->SetDelegate(nullptr); |
| GURL url("https://download.test"); |
| |
| WKDownload* fake_download = nil; |
| id<DownloadNativeTaskBridgeDelegate> fake_delegate = nil; |
| FakeNativeTaskBridge* fake_task_bridge = |
| [[FakeNativeTaskBridge alloc] initWithDownload:fake_download |
| delegate:fake_delegate]; |
| |
| download_controller_->CreateNativeDownloadTask( |
| &web_state_, [NSUUID UUID].UUIDString, url, @"GET", kContentDisposition, |
| /*total_bytes=*/-1, kMimeType, fake_task_bridge); |
| } |
| |
| } // namespace web |