Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Unified Diff: ios/web/public/test/response_providers/delayed_response_provider.mm

Issue 2282463002: Create a Delayed Response Provider for GCDWebServer. (Closed)
Patch Set: namespace Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/web/public/test/response_providers/delayed_response_provider.mm
diff --git a/ios/web/public/test/response_providers/delayed_response_provider.mm b/ios/web/public/test/response_providers/delayed_response_provider.mm
new file mode 100644
index 0000000000000000000000000000000000000000..f78188b1808e0cb6c2dec8394071da04652b3b81
--- /dev/null
+++ b/ios/web/public/test/response_providers/delayed_response_provider.mm
@@ -0,0 +1,110 @@
+// Copyright 2016 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.
+
+#include "ios/web/public/test/response_providers/delayed_response_provider.h"
+
+#import <Foundation/Foundation.h>
+
+#import "base/mac/scoped_nsobject.h"
+#import "ios/third_party/gcdwebserver/src/GCDWebServer/Responses/GCDWebServerDataResponse.h"
+
+@interface DelayedGCDWebServerResponse : NSProxy
stkhapugin 2016/08/26 13:06:48 Class comment here.
Olivier 2016/08/26 14:10:04 Done.
+
++ (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
+ delay:(NSTimeInterval)delay;
+- (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
+ delay:(NSTimeInterval)delay;
+@end
+
+@implementation DelayedGCDWebServerResponse {
+ base::scoped_nsobject<GCDWebServerResponse> _response;
+ NSTimeInterval _delay;
+}
+
++ (instancetype)responseWithServerResponse:(GCDWebServerResponse*)response
+ delay:(NSTimeInterval)delay {
+ return [[[DelayedGCDWebServerResponse alloc] initWithServerResponse:response
+ delay:delay]
+ autorelease];
+}
+
+- (instancetype)initWithServerResponse:(GCDWebServerResponse*)response
+ delay:(NSTimeInterval)delay {
+ _response.reset([response retain]);
+ _delay = delay;
+ return self;
+}
+
+#pragma mark - GCDWebServerResponse
+
+- (void)performReadDataWithCompletion:
+ (GCDWebServerBodyReaderCompletionBlock)block {
+ [self asyncReadDataWithCompletion:block];
+}
+
+- (void)asyncReadDataWithCompletion:
+ (GCDWebServerBodyReaderCompletionBlock)block {
+ if ([_response respondsToSelector:@selector(asyncReadDataWithCompletion:)]) {
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
+ static_cast<int64_t>(_delay * NSEC_PER_SEC)),
+ dispatch_get_main_queue(), ^{
+ [_response asyncReadDataWithCompletion:block];
+ });
+ } else {
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
+ static_cast<int64_t>(_delay * NSEC_PER_SEC)),
+ dispatch_get_main_queue(), ^{
+ NSError* error = nil;
+ NSData* data = [_response readData:&error];
+ block(data, error);
+ });
+ }
+}
+
+#pragma mark - NSProxy
+
+- (BOOL)conformsToProtocol:(Protocol*)protocol {
+ return [[_response class] conformsToProtocol:protocol];
+}
+
+- (BOOL)respondsToSelector:(SEL)selector {
+ return [[_response class] instancesRespondToSelector:selector];
+}
+
+- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
+ return [[_response class] instanceMethodSignatureForSelector:selector];
+}
+
+- (void)forwardInvocation:(NSInvocation*)invocation {
+ SEL selector = [invocation selector];
+ if ([_response respondsToSelector:selector])
+ [invocation invokeWithTarget:_response];
+}
+
+@end
+
+namespace web {
+
+DelayedResponseProvider::DelayedResponseProvider(
+ std::unique_ptr<web::ResponseProvider> delayed_provider,
+ double delay)
+ : web::ResponseProvider(),
+ delayed_provider_(std::move(delayed_provider)),
+ delay_(delay) {}
+
+DelayedResponseProvider::~DelayedResponseProvider() {}
+
+bool DelayedResponseProvider::CanHandleRequest(const Request& request) {
+ return delayed_provider_->CanHandleRequest(request);
+}
+
+GCDWebServerResponse* DelayedResponseProvider::GetGCDWebServerResponse(
+ const Request& request) {
+ return static_cast<id>([DelayedGCDWebServerResponse
stkhapugin 2016/08/26 13:06:48 ObjCCastStrict or ObjCCast instead of static_cast;
Olivier 2016/08/26 14:10:03 Done.
+ responseWithServerResponse:delayed_provider_->GetGCDWebServerResponse(
+ request)
+ delay:delay_]);
+}
+
+} // namespace web

Powered by Google App Engine
This is Rietveld 408576698