diff --git a/WebDriverAgentLib/Routing/FBWebServer.m b/WebDriverAgentLib/Routing/FBWebServer.m index af0d82b3e..4afea3f77 100644 --- a/WebDriverAgentLib/Routing/FBWebServer.m +++ b/WebDriverAgentLib/Routing/FBWebServer.m @@ -265,7 +265,7 @@ - (void)handleException:(NSException *)exception forResponse:(RouteResponse *)re - (void)registerServerKeyRouteHandlers { - [self.server get:@"/health" withBlock:^(RouteRequest *request, RouteResponse *response) { + [self.server handleMethod:@"GET" withPath:@"/health" standalone:YES block:^(RouteRequest *request, RouteResponse *response) { [response respondWithString:@"Health Check

I-AM-ALIVE

"]; }]; diff --git a/WebDriverAgentTests/UnitTests/FBHTTPServerTests.m b/WebDriverAgentTests/UnitTests/FBHTTPServerTests.m index c1a21e597..8979872ee 100644 --- a/WebDriverAgentTests/UnitTests/FBHTTPServerTests.m +++ b/WebDriverAgentTests/UnitTests/FBHTTPServerTests.m @@ -15,6 +15,11 @@ #import "FBHTTPServer.h" #import "FBTCPSocket.h" +#import "FBWebServer.h" + +@interface FBWebServer (FBWDATestable) +- (void)registerServerKeyRouteHandlers; +@end static atomic_int gFramingProbeHits; @@ -230,6 +235,24 @@ - (void)testWellFormedRequestStillSucceeds XCTAssertTrue([response containsString:@"pong"], @"%@", response); } +- (void)testHealthRespondsWhileRouteQueueIsBlocked +{ + FBWebServer *webServer = [FBWebServer new]; + [webServer setValue:self.server forKey:@"server"]; + [webServer registerServerKeyRouteHandlers]; + dispatch_queue_t routeQueue = dispatch_queue_create("com.facebook.wda.test.health", DISPATCH_QUEUE_SERIAL); + [self.server setRouteQueue:routeQueue]; + dispatch_suspend(routeQueue); + @try { + NSString *response = [self responseClosingFirstForRequest:@"GET /health HTTP/1.1\r\nHost: localhost\r\n\r\n"]; + XCTAssertTrue([response hasPrefix:@"HTTP/1.1 200"], @"%@", response); + XCTAssertTrue([response hasSuffix:@"Health Check

I-AM-ALIVE

"], @"%@", response); + } @finally { + dispatch_resume(routeQueue); + dispatch_sync(routeQueue, ^{}); + } +} + - (void)testConnectionsTheClientClosesReleaseTheirSockets { // The server keeps a connection open after answering, so the client is the one that hangs up.