// Copyright 2019 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/navigation/crw_error_page_helper.h"
#import "base/apple/bundle_locations.h"
#import "base/strings/sys_string_conversions.h"
#import "net/base/apple/url_conversions.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"
#import "url/gurl.h"
using CRWErrorPageHelperTest = PlatformTest;
// Tests that the failed navigation URL is correctly extracted from the error.
TEST_F(CRWErrorPageHelperTest, FailedNavigationURL) {
NSString* url_string = @"https://test-error-page.com";
NSError* error = [NSError
errorWithDomain:NSURLErrorDomain
code:NSURLErrorBadURL
userInfo:@{NSURLErrorFailingURLStringErrorKey : url_string}];
CRWErrorPageHelper* helper = [[CRWErrorPageHelper alloc] initWithError:error];
NSURL* url = [NSURL URLWithString:url_string];
EXPECT_NSEQ(url, helper.failedNavigationURL);
}
// Tests that the original URL is correctly extracted from the file error URL
// created by the helper.
TEST_F(CRWErrorPageHelperTest, ExtractOriginalURLFromErrorPageURL) {
NSString* url_string = @"https://test-error-page.com";
NSError* error = [NSError
errorWithDomain:NSURLErrorDomain
code:NSURLErrorBadURL
userInfo:@{NSURLErrorFailingURLStringErrorKey : url_string}];
CRWErrorPageHelper* helper = [[CRWErrorPageHelper alloc] initWithError:error];
GURL url_from_helper = net::GURLWithNSURL(helper.errorPageFileURL);
GURL result_original_url = [CRWErrorPageHelper
failedNavigationURLFromErrorPageFileURL:url_from_helper];
EXPECT_EQ(GURL(base::SysNSStringToUTF8(url_string)), result_original_url);
EXPECT_TRUE([CRWErrorPageHelper isErrorPageFileURL:url_from_helper]);
}
// Tests that the error page is correctly identified as error page.
TEST_F(CRWErrorPageHelperTest, IsErrorPageFileURL) {
NSString* url_string = @"https://test-error-page.com";
NSError* error = [NSError
errorWithDomain:NSURLErrorDomain
code:NSURLErrorBadURL
userInfo:@{NSURLErrorFailingURLStringErrorKey : url_string}];
CRWErrorPageHelper* helper = [[CRWErrorPageHelper alloc] initWithError:error];
EXPECT_TRUE([helper
isErrorPageFileURLForFailedNavigationURL:helper.errorPageFileURL]);
}
// Tests that a normal URL isn't identified as error page.
TEST_F(CRWErrorPageHelperTest, IsErrorPageFileURLWrong) {
NSString* url_string = @"file://test-error-page.com";
NSError* error =
[NSError errorWithDomain:NSURLErrorDomain
code:NSURLErrorBadURL
userInfo:@{
NSURLErrorFailingURLStringErrorKey : @"http://fake.com"
}];
CRWErrorPageHelper* helper = [[CRWErrorPageHelper alloc] initWithError:error];
EXPECT_FALSE([helper
isErrorPageFileURLForFailedNavigationURL:[NSURL
URLWithString:url_string]]);
}
// Tests that the failed navigation URL is correctly extracted from the page
// URL.
TEST_F(CRWErrorPageHelperTest, FailedNavigationURLFromErrorPageFileURLCorrect) {
std::string expected_url = "http://expected-url.com";
std::string path = base::SysNSStringToUTF8([base::apple::FrameworkBundle()
pathForResource:@"error_page_loaded"
ofType:@"html"]);
GURL url = GURL("file://" + path + "?file=http://not-that-url.com&url=" +
expected_url + "&garbage=http://still-not-that-one.com");
GURL result_url =
[CRWErrorPageHelper failedNavigationURLFromErrorPageFileURL:url];
EXPECT_EQ(GURL(expected_url), result_url);
EXPECT_TRUE([CRWErrorPageHelper isErrorPageFileURL:url]);
}
// Tests that the extract failed navigation URL is empty if the `url` query
// isn't present in the page URL.
TEST_F(CRWErrorPageHelperTest, FailedNavigationURLFromErrorPageFileURLNoQuery) {
std::string expected_url = "http://expected-url.com";
std::string path = base::SysNSStringToUTF8([base::apple::FrameworkBundle()
pathForResource:@"error_page_loaded"
ofType:@"html"]);
GURL url = GURL("file://" + path + "?file=" + expected_url +
"&garbage=http://still-not-that-one.com");
GURL result_url =
[CRWErrorPageHelper failedNavigationURLFromErrorPageFileURL:url];
EXPECT_TRUE(result_url.is_empty());
EXPECT_FALSE([CRWErrorPageHelper isErrorPageFileURL:url]);
}
// Tests that the extracted failed navigation URL is empty if the path of the
// current page isn't correct.
TEST_F(CRWErrorPageHelperTest,
FailedNavigationURLFromErrorPageFileURLWrongPath) {
GURL url =
GURL("file://not-the-correct-path.com?url=http://potential-url.com");
GURL result_url =
[CRWErrorPageHelper failedNavigationURLFromErrorPageFileURL:url];
EXPECT_TRUE(result_url.is_empty());
EXPECT_FALSE([CRWErrorPageHelper isErrorPageFileURL:url]);
}
// Tests that the extracted failed navigation URL is empty if the scheme of the
// current page isn't file://.
TEST_F(CRWErrorPageHelperTest,
FailedNavigationURLFromErrorPageFileURLWrongScheme) {
std::string path = base::SysNSStringToUTF8([base::apple::FrameworkBundle()
pathForResource:@"error_page_loaded"
ofType:@"html"]);
GURL url = GURL("http://" + path + "?url=http://potential-url.com");
GURL result_url =
[CRWErrorPageHelper failedNavigationURLFromErrorPageFileURL:url];
EXPECT_TRUE(result_url.is_empty());
EXPECT_FALSE([CRWErrorPageHelper isErrorPageFileURL:url]);
}