blob: 658107656e252c307d333a87fdd17c0790a6ceff [file] [log] [blame]
// Copyright 2024 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/crw_web_view_download.h"
#import <WebKit/WebKit.h>
#import "base/files/scoped_temp_dir.h"
#import "base/strings/sys_string_conversions.h"
#import "base/test/ios/wait_util.h"
#import "ios/web/public/test/web_task_environment.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#import "third_party/ocmock/gtest_support.h"
#import "url/gurl.h"
// Test fixture for testing CRWWebViewDownloadTest class.
class CRWWebViewDownloadTest : public PlatformTest {
void TearDown() override {
EXPECT_OCMOCK_VERIFY((id)web_view_);
EXPECT_OCMOCK_VERIFY((id)wk_download_);
EXPECT_OCMOCK_VERIFY((id)delegate_);
PlatformTest::TearDown();
}
protected:
web::WebTaskEnvironment task_environment_;
WKWebView* web_view_ = OCMStrictClassMock([WKWebView class]);
WKDownload* wk_download_ = OCMStrictClassMock([WKDownload class]);
id<CRWWebViewDownloadDelegate> delegate_ =
OCMStrictProtocolMock(@protocol(CRWWebViewDownloadDelegate));
};
TEST_F(CRWWebViewDownloadTest, TestDownloadHTTPFile) {
NSURLRequest* request = [[NSURLRequest alloc]
initWithURL:[NSURL URLWithString:@"https://example.test"]];
CRWWebViewDownload* download =
[[CRWWebViewDownload alloc] initWithPath:@"/path/foo/bar"
request:request
webview:web_view_
delegate:delegate_];
__block bool start_called = false;
OCMExpect([web_view_
startDownloadUsingRequest:request
completionHandler:[OCMArg checkWithBlock:^(void (^completion)(
WKDownload* download)) {
completion(wk_download_);
start_called = true;
return YES;
}]]);
OCMExpect([wk_download_ setDelegate:[OCMArg any]]);
[download startDownload];
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool() {
return start_called;
}));
}
TEST_F(CRWWebViewDownloadTest, TestDownloadLocalFile) {
base::ScopedTempDir scoped_temp_dir;
ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
const base::FilePath root = scoped_temp_dir.GetPath();
const base::FilePath from = root.Append("from");
const base::FilePath dest = root.Append("to");
// Create a file in a sub-directory.
NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
EXPECT_TRUE([data writeToFile:base::SysUTF8ToNSString(from.value())
atomically:YES]);
NSURLRequest* request = [[NSURLRequest alloc]
initWithURL:[NSURL
fileURLWithPath:base::SysUTF8ToNSString(from.value())]];
CRWWebViewDownload* download = [[CRWWebViewDownload alloc]
initWithPath:base::SysUTF8ToNSString(dest.value())
request:request
webview:web_view_
delegate:delegate_];
__block bool finish_called = false;
OCMExpect([delegate_ downloadDidFinish]).andDo(^(NSInvocation* invocation) {
finish_called = true;
});
[download startDownload];
task_environment_.RunUntilIdle();
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool() {
return finish_called;
}));
}