Chromium Code Reviews| 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 |