Index: ios/web/web_state/js/crw_js_post_request_loader_unittest.mm |
diff --git a/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm b/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fe0354fd1774e84114f51c60fc74978d2a9dca16 |
--- /dev/null |
+++ b/ios/web/web_state/js/crw_js_post_request_loader_unittest.mm |
@@ -0,0 +1,122 @@ |
+// 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/web_state/js/crw_js_post_request_loader.h" |
+ |
+#import <WebKit/WebKit.h> |
+ |
+#import "base/strings/sys_string_conversions.h" |
Eugene But (OOO till 7-30)
2015/12/02 17:06:15
s/import/include
stkhapugin
2015/12/03 15:43:02
Done.
|
+#import "base/test/ios/wait_util.h" |
+#import "ios/web/web_state/ui/crw_wk_script_message_router.h" |
+#import "testing/gtest_mac.h" |
+#include "third_party/ocmock/OCMock/OCMock.h" |
+ |
+namespace { |
+ |
+typedef void (^SuccessCallback)(); |
+typedef void (^ErrorCallback)(NSError*); |
+ |
+// The expected HTML to be load in WKWebView to execute a post request from |
+// LoadsCorrectHTML test. |
+std::string expectedHTML = |
Eugene But (OOO till 7-30)
2015/12/02 17:06:15
FYI: Variables of class type with static storage d
stkhapugin
2015/12/03 15:43:02
Done.
|
+ R"delimeter(<html><script>var __crPostRequestHack={runPostRequest:function(k,l,m,n){var p=function(b,d,c,g){var e=new XMLHttpRequest;e.open("POST",b,!1);for(var a in d)d.hasOwnProperty(a)&&e.setRequestHeader(a,d[a]);b=atob(c);g=g||"";d=[];for(c=0;c<b.length;c+=512){a=b.slice(c,c+512);for(var h=Array(a.length),f=0;f<a.length;f++)h[f]=a.charCodeAt(f);a=new Uint8Array(h);d.push(a)}b=new Blob(d,{type:g});e.send(b);if(200!=e.status)throw e.status;return e.responseText};document.open();try{document.write(p(k,l,m,n)),window.webkit.messageHandlers.POSTSuccess.postMessage("")}catch(b){window.webkit.messageHandlers.POSTErrorHandler.postMessage(b)}document.close()}}; |
Eugene But (OOO till 7-30)
2015/12/02 17:06:15
This is too fragile, and will be breaking very oft
stkhapugin
2015/12/03 15:43:02
Done.
|
+__crPostRequestHack.runPostRequest("http://google.com", {}, "", "")</script></html>)delimeter"; |
+ |
+// Tests that the POST request is correctly executed by loading a HTML string. |
+TEST(CRWJSPOSTRequestLoaderTest, LoadsCorrectHTML) { |
+ CRWJSPOSTRequestLoader* loader = |
+ [[[CRWJSPOSTRequestLoader alloc] init] autorelease]; |
+ id mockWebView = [OCMockObject mockForClass:[WKWebView class]]; |
+ NSURL* url = [NSURL URLWithString:@"http://google.com"]; |
+ NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; |
+ request.HTTPMethod = @"POST"; |
+ id mockMessageRouter = |
+ [OCMockObject niceMockForClass:[CRWWKScriptMessageRouter class]]; |
+ NSString* expectedHTMLString = base::SysUTF8ToNSString(expectedHTML); |
+ [(WKWebView*)[mockWebView expect] loadHTMLString:expectedHTMLString |
+ baseURL:url]; |
+ |
+ [loader loadPOSTRequest:request |
+ inWebView:mockWebView |
+ messageRouter:mockMessageRouter |
+ errorBlock:^(NSError* error) { |
+ } |
+ successBlock:^{ |
+ }]; |
+ |
+ [mockWebView verify]; |
+} |
+ |
+// Tests that success and error message handlers are installed and removed. |
+TEST(CRWJSPOSTRequestLoaderTest, installsCallbacks) { |
Eugene But (OOO till 7-30)
2015/12/02 17:06:16
Installing and removing script message router is t
Eugene But (OOO till 7-30)
2015/12/02 17:06:16
s/installsCallbacks/InstallsCallbacks
stkhapugin
2015/12/03 15:43:02
Acknowledged.
stkhapugin
2015/12/03 15:43:02
OK, I'll remove this test for simplicity.
|
+ CRWJSPOSTRequestLoader* loader = |
+ [[[CRWJSPOSTRequestLoader alloc] init] autorelease]; |
+ id mockWebView = [OCMockObject niceMockForClass:[WKWebView class]]; |
+ NSURL* url = [NSURL URLWithString:@"http://google.com"]; |
+ NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; |
+ request.HTTPMethod = @"POST"; |
+ id mockMessageRouter = |
+ [OCMockObject mockForClass:[CRWWKScriptMessageRouter class]]; |
+ |
+ __block BOOL successBlockCalled = NO; |
+ SuccessCallback successHandler = ^{ |
+ EXPECT_FALSE(successBlockCalled); |
+ successBlockCalled = YES; |
+ }; |
+ __block BOOL errorBlockCalled = NO; |
+ ErrorCallback errorHandler = ^(NSError*) { |
+ EXPECT_FALSE(errorBlockCalled); |
+ errorBlockCalled = YES; |
+ }; |
+ |
+ // Checks that successHandler is called and that handlers are removed. |
+ id successArgChecker = |
+ [OCMArg checkWithBlock:^BOOL(SuccessCallback actualSuccessHandler) { |
+ [[mockMessageRouter expect] |
+ removeScriptMessageHandlerForName:@"POSTErrorHandler" |
+ webView:mockWebView]; |
+ [[mockMessageRouter expect] |
+ removeScriptMessageHandlerForName:@"POSTSuccess" |
+ webView:mockWebView]; |
+ actualSuccessHandler(); |
+ base::test::ios::WaitUntilCondition(^{ |
+ return successBlockCalled; |
+ }); |
+ return successBlockCalled; |
+ }]; |
+ |
+ // Checks that errorHandler is called and that handlers are removed. |
+ id errorArgChecker = |
+ [OCMArg checkWithBlock:^BOOL(ErrorCallback actualErrorHandler) { |
+ [[mockMessageRouter expect] |
+ removeScriptMessageHandlerForName:@"POSTErrorHandler" |
+ webView:mockWebView]; |
+ [[mockMessageRouter expect] |
+ removeScriptMessageHandlerForName:@"POSTSuccess" |
+ webView:mockWebView]; |
+ |
+ actualErrorHandler(nil); |
+ base::test::ios::WaitUntilCondition(^{ |
+ return errorBlockCalled; |
+ }); |
+ return errorBlockCalled; |
+ }]; |
+ |
+ [[mockMessageRouter expect] setScriptMessageHandler:successArgChecker |
+ name:@"POSTSuccess" |
+ webView:mockWebView]; |
+ [[mockMessageRouter expect] setScriptMessageHandler:errorArgChecker |
+ name:@"POSTErrorHandler" |
+ webView:mockWebView]; |
+ |
+ [loader loadPOSTRequest:request |
+ inWebView:mockWebView |
+ messageRouter:mockMessageRouter |
+ errorBlock:errorHandler |
+ successBlock:successHandler]; |
+ |
+ [mockMessageRouter verify]; |
+} |
+ |
+} // namespace |