Index: ios/web/webui/crw_web_ui_manager_unittest.mm |
diff --git a/ios/web/webui/crw_web_ui_manager_unittest.mm b/ios/web/webui/crw_web_ui_manager_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b5f8227d7cba4cee73eeee28fa7dd8e726100a72 |
--- /dev/null |
+++ b/ios/web/webui/crw_web_ui_manager_unittest.mm |
@@ -0,0 +1,159 @@ |
+// Copyright 2015 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/webui/crw_web_ui_manager.h" |
+ |
+#include "base/files/file_path.h" |
+#include "base/files/file_util.h" |
+#include "base/logging.h" |
+#import "base/mac/scoped_nsobject.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop/message_loop.h" |
+#include "base/path_service.h" |
+#include "base/strings/stringprintf.h" |
+#import "base/strings/sys_string_conversions.h" |
+#include "base/values.h" |
+#include "ios/web/public/test/test_browser_state.h" |
+#include "ios/web/web_state/web_state_impl.h" |
+#import "ios/web/webui/crw_web_ui_page_builder.h" |
+#include "ios/web/webui/url_fetcher_block_adapter.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "testing/gtest_mac.h" |
+#include "testing/platform_test.h" |
+ |
+namespace web { |
+ |
+// Path for test favicon file. |
+const char kFaviconPath[] = "ios/web/test/data/testfavicon.png"; |
+// URL for mock WebUI page. |
+const char kTestChromeUrl[] = "chrome://test"; |
+// URL for mock favicon. |
+const char kFaviconUrl[] = "chrome://favicon"; |
+// HTML for mock WebUI page. |
+NSString* kHtml = @"<html>Hello World</html>"; |
+ |
+// Mock of WebStateImpl to check that LoadHtml and ExecuteJavaScriptAsync are |
+// called as expected. |
+class MockWebStateImpl : public WebStateImpl { |
+ public: |
+ MockWebStateImpl(BrowserState* browser_state) : WebStateImpl(browser_state) {} |
+ MOCK_METHOD2(LoadHtml, void(const base::string16& html, const GURL& url)); |
+ MOCK_METHOD1(ExecuteJavaScriptAsync, void(const base::string16& javascript)); |
+}; |
+ |
+// Mock of URLFetcherBlockAdapter to provide mock resources. |
+class MockURLFetcherBlockAdapter : public URLFetcherBlockAdapter { |
+ public: |
+ MockURLFetcherBlockAdapter( |
+ const GURL& url, |
+ net::URLRequestContextGetter* request_context, |
+ URLFetcherBlockAdapterCompletion completion_handler) |
+ : URLFetcherBlockAdapter(url, request_context, completion_handler), |
+ url_(url), |
+ completion_handler_(completion_handler) {} |
+ |
+ void Start() override { |
+ if (url_.spec() == kTestChromeUrl) { |
+ completion_handler_.get()([kHtml dataUsingEncoding:NSUTF8StringEncoding], |
+ this); |
+ } else if (url_.spec() == kFaviconUrl) { |
+ base::FilePath favicon_path; |
+ ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &favicon_path)); |
+ favicon_path = favicon_path.AppendASCII(kFaviconPath); |
+ completion_handler_.get()( |
+ [NSData dataWithContentsOfFile:base::SysUTF8ToNSString( |
+ favicon_path.value())], |
+ this); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ } |
+ |
+ private: |
+ // The URL to fetch. |
+ const GURL url_; |
+ // Callback for resource load. |
+ base::mac::ScopedBlock<URLFetcherBlockAdapterCompletion> completion_handler_; |
+}; |
+ |
+} // namespace web |
+ |
+// Subclass of CRWWebUIManager for testing. |
+@interface CRWTestWebUIManager : CRWWebUIManager |
+// Use mock URLFetcherBlockAdapter. |
+- (scoped_ptr<web::URLFetcherBlockAdapter>) |
+ fetcherForURL:(const GURL&)URL |
+ completionHandler:(web::URLFetcherBlockAdapterCompletion)handler; |
+@end |
+ |
+@implementation CRWTestWebUIManager |
+- (scoped_ptr<web::URLFetcherBlockAdapter>) |
+ fetcherForURL:(const GURL&)URL |
+ completionHandler:(web::URLFetcherBlockAdapterCompletion)handler { |
+ return scoped_ptr<web::URLFetcherBlockAdapter>( |
+ new web::MockURLFetcherBlockAdapter(URL, nil, handler)); |
+} |
+@end |
+ |
+namespace web { |
+ |
+// Test fixture for testing CRWWebUIManager |
+class CRWWebUIManagerTest : public PlatformTest { |
+ protected: |
+ void SetUp() override { |
+ test_browser_state_.reset(new TestBrowserState()); |
+ web_state_impl_.reset(new MockWebStateImpl(test_browser_state_.get())); |
+ web_ui_manager_.reset( |
+ [[CRWTestWebUIManager alloc] initWithWebState:web_state_impl_.get()]); |
+ } |
+ |
+ // TestBrowserState for creation of WebStateImpl. |
+ scoped_ptr<TestBrowserState> test_browser_state_; |
+ // MockWebStateImpl for detection of LoadHtml and EvaluateJavaScriptAync |
+ // calls. |
+ scoped_ptr<MockWebStateImpl> web_state_impl_; |
+ // WebUIManager for testing. |
+ base::scoped_nsobject<CRWTestWebUIManager> web_ui_manager_; |
+}; |
+ |
+// Tests that CRWWebUIManager observes provisional navigation and invokes an |
+// HTML load in web state. |
+TEST_F(CRWWebUIManagerTest, LoadWebUI) { |
+ base::string16 html(base::SysNSStringToUTF16(kHtml)); |
+ GURL url(kTestChromeUrl); |
+ EXPECT_CALL(*web_state_impl_, LoadHtml(html, url)); |
+ web_state_impl_->OnProvisionalNavigationStarted(url); |
+} |
+ |
+// Tests that CRWWebUIManager responds to OnScriptCommandReceieved call and runs |
+// JavaScript to set favicon background. |
+TEST_F(CRWWebUIManagerTest, HandleFaviconRequest) { |
+ GURL test_url(kTestChromeUrl); |
+ std::string favicon_url_string(kFaviconUrl); |
+ |
+ // Create mock JavaScript message to request favicon. |
+ base::ListValue* arguments(new base::ListValue()); |
+ arguments->AppendString(favicon_url_string); |
+ scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue()); |
+ message->SetString("message", "history.requestFavicon"); |
+ message->Set("arguments", arguments); |
+ |
+ // Create expected JavaScript to call. |
+ base::FilePath favicon_path; |
+ ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &favicon_path)); |
+ favicon_path = favicon_path.AppendASCII(kFaviconPath); |
+ NSData* expected_data = [NSData |
+ dataWithContentsOfFile:base::SysUTF8ToNSString(favicon_path.value())]; |
+ base::string16 expected_javascript = base::SysNSStringToUTF16([NSString |
+ stringWithFormat: |
+ @"chrome.setFaviconBackground('%s', 'data:image/png;base64,%@');", |
+ favicon_url_string.c_str(), |
+ [expected_data base64EncodedStringWithOptions:0]]); |
+ |
+ EXPECT_CALL(*web_state_impl_, ExecuteJavaScriptAsync(expected_javascript)); |
+ web_state_impl_->OnScriptCommandReceived("history.requestFavicon", *message, |
+ test_url, false); |
+} |
+} // namespace web |