Move SKTigonNetwork internal plugin to xplat

Summary: Moves SKTigonNetwork internal plugin to xplat leaving behind a stub buck target in litho

Reviewed By: passy

Differential Revision: D9082339

fbshipit-source-id: d98eeef4e64458586403c01937f6d48ad82e27aa
This commit is contained in:
Pritesh Nandgaonkar
2018-08-02 08:02:44 -07:00
committed by Facebook Github Bot
parent 7a82d56eb6
commit 0b0f59f096
9 changed files with 650 additions and 0 deletions

View File

@@ -0,0 +1,160 @@
// Copyright 2004-present Facebook. All Rights Reserved.
#if FB_SONARKIT_ENABLED
#import <XCTest/XCTest.h>
#import <SonarKitNetworkPlugin/SonarKitNetworkPlugin.h>
#import <SonarKitTestUtils/SonarConnectionMock.h>
#import <SKTigonNetworkPlugin/SKTigonObserver.h>
#import <SKTigonNetworkPluginTestUtils/SKDispatchQueueMock.h>
static FBMonotonicTimeMilliseconds sendRequestInfoForIdentifier(NSInteger identifier, SKBufferingPlugin *plugin)
{
FBMonotonicTimeMilliseconds requestTimestamp = FBMonotonicTimeGetCurrentMilliseconds();
[plugin send:@"newRequest" sonarObject:@{
@"id": @(identifier),
@"timestamp": @(requestTimestamp),
}];
return requestTimestamp;
}
@interface SKBufferingPluginTests : XCTestCase
@end
@implementation SKBufferingPluginTests
- (void)testCacheAfterSuccessfulConnection {
SKBufferingPlugin *plugin = [[SKBufferingPlugin alloc] initWithQueue:std::make_shared<facebook::sonar::SyncQueue>()];
FBMonotonicTimeMilliseconds timestamp1 = sendRequestInfoForIdentifier(1, plugin);
FBMonotonicTimeMilliseconds timestamp2 = sendRequestInfoForIdentifier(2, plugin);
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
FBMonotonicTimeMilliseconds timestamp3 = sendRequestInfoForIdentifier(3, plugin);
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(timestamp1),
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @2,
@"timestamp": @(timestamp2),
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @3,
@"timestamp": @(timestamp3),
}]));
}
- (void)testCacheAfterDisconnection {
SKBufferingPlugin *plugin = [[SKBufferingPlugin alloc] initWithQueue:std::make_shared<facebook::sonar::SyncQueue>()];
FBMonotonicTimeMilliseconds timestamp1 = sendRequestInfoForIdentifier(1, plugin);
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
FBMonotonicTimeMilliseconds timestamp2 = sendRequestInfoForIdentifier(2, plugin);
[plugin didDisconnect];
connection.connected = NO;
FBMonotonicTimeMilliseconds timestamp3 = sendRequestInfoForIdentifier(3, plugin);
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(timestamp1),
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @2,
@"timestamp": @(timestamp2),
}]));
XCTAssertFalse(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @3,
@"timestamp": @(timestamp3),
}]));
}
- (void)testCacheAfterDisconnectionAndConnection {
SKBufferingPlugin *plugin = [[SKBufferingPlugin alloc] initWithQueue:std::make_shared<facebook::sonar::SyncQueue>()];
FBMonotonicTimeMilliseconds timestamp1 = sendRequestInfoForIdentifier(1, plugin);
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
FBMonotonicTimeMilliseconds timestamp2 = sendRequestInfoForIdentifier(2, plugin);
[plugin didDisconnect];
connection.connected = NO;
FBMonotonicTimeMilliseconds timestamp3 = sendRequestInfoForIdentifier(3, plugin);
connection.connected = YES;
[plugin didConnect: connection];
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(timestamp1),
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @2,
@"timestamp": @(timestamp2),
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @3,
@"timestamp": @(timestamp3),
}]));
}
- (void)testLossOfEventsDueToDisconnection {
auto queue = std::make_shared<facebook::sonar::SyncQueue>();
SKBufferingPlugin *plugin = [[SKBufferingPlugin alloc] initWithQueue:queue];
FBMonotonicTimeMilliseconds timestamp1 = sendRequestInfoForIdentifier(1, plugin);
queue->suspend();
FBMonotonicTimeMilliseconds timestamp2 = sendRequestInfoForIdentifier(2, plugin);
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
[plugin didDisconnect];
connection.connected = NO;
queue->resume();
XCTAssertFalse(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(timestamp1),
}]));
XCTAssertFalse(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @2,
@"timestamp": @(timestamp2),
}]));
}
- (void)testCacheInQueueSuspension {
auto queue = std::make_shared<facebook::sonar::SyncQueue>();
SKBufferingPlugin *plugin = [[SKBufferingPlugin alloc] initWithQueue:queue];
FBMonotonicTimeMilliseconds timestamp1 = sendRequestInfoForIdentifier(1, plugin);
queue->suspend();
FBMonotonicTimeMilliseconds timestamp2 = sendRequestInfoForIdentifier(2, plugin);
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
queue->resume();
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(timestamp1),
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @2,
@"timestamp": @(timestamp2),
}]));
}
@end
#endif

View File

@@ -0,0 +1,190 @@
// Copyright 2004-present Facebook. All Rights Reserved.
#if FB_SONARKIT_ENABLED
#import <XCTest/XCTest.h>
#import <WebKit/WebKit.h>
#import <Foundation/NSURLResponse.h>
#import <SonarKitTestUtils/SonarConnectionMock.h>
#import <SKTigonNetworkPluginTestUtils/SKTigonNetworkPluginMock.h>
#import <SonarKitNetworkPlugin/SonarKitNetworkPlugin.h>
#import <SKTigonNetworkPlugin/SKTigonObserver.h>
#import <SKTigonNetworkPlugin/SKTigonAdapter.h>
static BOOL isResponseStrippedForContentType(NSString *contentType)
{
SKTigonNetworkPluginMock *plugin = [[SKTigonNetworkPluginMock alloc] initWithNetworkAdapter:[SKTigonAdapter new]];
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
id<SKNetworkReporterDelegate> delegate = (id<SKNetworkReporterDelegate>)plugin;
NSURL *url = [NSURL URLWithString: @"http://fakeurl"];
NSURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL: url
statusCode: 200
HTTPVersion: @"1.1"
headerFields: @{
@"content-type": contentType
}];
FBMonotonicTimeMilliseconds responseTimestamp = FBMonotonicTimeGetCurrentMilliseconds();
NSData *responseBody = [@"some-response-data" dataUsingEncoding: NSUTF8StringEncoding];
ResponseInfo responseInfo = {
.identifier = 1,
.timestamp = responseTimestamp,
.response = response,
.body = nil,
};
responseInfo.setBody(responseBody);
[delegate didObserveResponse:responseInfo];
id data = connection.sent[@"newResponse"][0][@"data"];
return [data isEqual:[NSNull null]];
}
static FBMonotonicTimeMilliseconds sendRequestInfoForIdentifier(NSInteger identifier, NSData *requestBody, SonarKitNetworkPlugin *plugin)
{
id<SKNetworkReporterDelegate> delegate = (id<SKNetworkReporterDelegate>)plugin;
NSURL *url = [NSURL URLWithString: @"http://fakeurl"];
NSMutableURLRequest *request = [[NSURLRequest requestWithURL: url] mutableCopy];
[request setHTTPMethod: @"POST"];
[request addValue: @"somevalue" forHTTPHeaderField:@"some-header-field"];
FBMonotonicTimeMilliseconds requestTimestamp = FBMonotonicTimeGetCurrentMilliseconds();
RequestInfo requestInfo = {
.identifier = identifier,
.timestamp = requestTimestamp,
.request = request,
.body = nil,
};
requestInfo.setBody(requestBody);
[delegate didObserveRequest:requestInfo];
return requestTimestamp;
}
@interface SKTigonNetworkPluginTests : XCTestCase
@end
@implementation SKTigonNetworkPluginTests
- (void)testPluginIsObserverDelegate
{
SonarKitNetworkPlugin *plugin = [[SKTigonNetworkPluginMock alloc] initWithNetworkAdapter:[SKTigonAdapter new]];
XCTAssertTrue([plugin conformsToProtocol: @protocol(SKNetworkReporterDelegate)], @"SKTigonNetworkPlugin should conform to SKTigonObserverDelegate");
}
- (void)testObserveRequest
{
SKTigonNetworkPluginMock *plugin = [[SKTigonNetworkPluginMock alloc] initWithNetworkAdapter:[SKTigonAdapter new]];
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
id<SKNetworkReporterDelegate> delegate = (id<SKNetworkReporterDelegate>)plugin;
NSURL *url = [NSURL URLWithString: @"http://fakeurl"];
NSMutableURLRequest *request = [[NSURLRequest requestWithURL: url] mutableCopy];
[request setHTTPMethod: @"POST"];
[request addValue: @"somevalue" forHTTPHeaderField:@"some-header-field"];
FBMonotonicTimeMilliseconds requestTimestamp = FBMonotonicTimeGetCurrentMilliseconds();
NSData *requestBody = [@"some-request-data" dataUsingEncoding: NSUTF8StringEncoding];
RequestInfo requestInfo = {
.identifier = 1,
.timestamp = requestTimestamp,
.request = request,
.body = nil,
};
requestInfo.setBody(requestBody);
[delegate didObserveRequest:requestInfo];
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(requestTimestamp),
@"method": @"POST",
@"url": @"http://fakeurl",
@"headers": @[ @{
@"key": @"some-header-field",
@"value": @"somevalue"
}],
@"data": [requestBody base64EncodedStringWithOptions: 0]
}]));
}
- (void)testObserveRequestWithCache {
SKTigonNetworkPluginMock *plugin = [[SKTigonNetworkPluginMock alloc] initWithNetworkAdapter:[SKTigonAdapter new]];
NSData *requestBody = [@"some-request-data" dataUsingEncoding: NSUTF8StringEncoding];
FBMonotonicTimeMilliseconds timestamp1 = sendRequestInfoForIdentifier(1, requestBody, plugin);
FBMonotonicTimeMilliseconds timestamp2 = sendRequestInfoForIdentifier(2, requestBody, plugin);
FBMonotonicTimeMilliseconds timestamp3 = sendRequestInfoForIdentifier(3, requestBody, plugin);
SonarConnectionMock *connection = [SonarConnectionMock new];
[plugin didConnect: connection];
FBMonotonicTimeMilliseconds timestamp4 = sendRequestInfoForIdentifier(4, requestBody, plugin);
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @1,
@"timestamp": @(timestamp1),
@"method": @"POST",
@"url": @"http://fakeurl",
@"headers": @[ @{
@"key": @"some-header-field",
@"value": @"somevalue"
}],
@"data": [requestBody base64EncodedStringWithOptions: 0]
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @2,
@"timestamp": @(timestamp2),
@"method": @"POST",
@"url": @"http://fakeurl",
@"headers": @[ @{
@"key": @"some-header-field",
@"value": @"somevalue"
}],
@"data": [requestBody base64EncodedStringWithOptions: 0]
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @3,
@"timestamp": @(timestamp3),
@"method": @"POST",
@"url": @"http://fakeurl",
@"headers": @[ @{
@"key": @"some-header-field",
@"value": @"somevalue"
}],
@"data": [requestBody base64EncodedStringWithOptions: 0]
}]));
XCTAssertTrue(([connection.sent[@"newRequest"]
containsObject: @{
@"id": @4,
@"timestamp": @(timestamp4),
@"method": @"POST",
@"url": @"http://fakeurl",
@"headers": @[ @{
@"key": @"some-header-field",
@"value": @"somevalue"
}],
@"data": [requestBody base64EncodedStringWithOptions: 0]
}]));
}
- (void)testStripBinaryResponse
{
XCTAssertTrue(isResponseStrippedForContentType(@"image/jpeg"));
XCTAssertTrue(isResponseStrippedForContentType(@"image/jpg"));
XCTAssertTrue(isResponseStrippedForContentType(@"image/png"));
XCTAssertTrue(isResponseStrippedForContentType(@"video/mp4"));
XCTAssertTrue(isResponseStrippedForContentType(@"application/zip"));
}
@end
#endif