// 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 <WebKit/WebKit.h>
#import "ios/web/download/crw_web_view_download.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 "url/gurl.h"
// Test fixture for testing CRWWebViewDownloadTest class.
class CRWWebViewDownloadTest : public PlatformTest {
protected:
web::WebTaskEnvironment task_environment_;
};
TEST_F(CRWWebViewDownloadTest, TestDownloadHTTPFile) {
NSURLRequest* request = [[NSURLRequest alloc]
initWithURL:[NSURL URLWithString:@"https://example.test"]];
id web_view = OCMStrictClassMock([WKWebView class]);
id wk_download = OCMStrictClassMock([WKDownload class]);
id delegate = OCMStrictProtocolMock(@protocol(CRWWebViewDownloadDelegate));
CRWWebViewDownload* download =
[[CRWWebViewDownload alloc] initWithPath:@"/path/foo/bar"
request:request
webview:web_view
delegate:delegate];
__block bool start_called = false;
[[web_view expect]
startDownloadUsingRequest:request
completionHandler:[OCMArg checkWithBlock:^(void (^completion)(
WKDownload* download)) {
completion(wk_download);
start_called = true;
return YES;
}]];
[[wk_download expect] setDelegate:[OCMArg any]];
[download startDownload];
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool() {
return start_called;
}));
}
TEST_F(CRWWebViewDownloadTest, TestDownloadLocalFile) {
id web_view = OCMStrictClassMock([WKWebView class]);
id delegate = OCMStrictProtocolMock(@protocol(CRWWebViewDownloadDelegate));
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;
[[[delegate expect] andDo:^(NSInvocation* invocation) {
finish_called = true;
}] downloadDidFinish];
[download startDownload];
task_environment_.RunUntilIdle();
ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForUIElementTimeout, ^bool() {
return finish_called;
}));
}