|
|
|
#import <XCTest/XCTest.h>
|
|
|
|
#import "DnsManager.h"
|
|
|
|
#import "TestUtil.h"
|
|
|
|
#import "Util.h"
|
|
|
|
#import "IpAddress.h"
|
|
|
|
#import "ThreadManager.h"
|
|
|
|
#import "CancelTokenSource.h"
|
|
|
|
#import <netdb.h>
|
|
|
|
|
|
|
|
#define infrastructureTestHostName @"relay.whispersystems.org"
|
|
|
|
#define reliableHostName @"example.com"
|
|
|
|
#define invalidHostname @"∆©˙∆¨¥©©˜¨¥©˜†¥µ¬¬¨˙µ†¥∫®∂®†"
|
|
|
|
#define nonExistentHostname [NSString stringWithFormat:@"%@kfurmtludehntlgihmvnduyebntiinvbudydepqowudyfnrkt.com", \
|
|
|
|
[[CryptoTools generateSecureRandomData:10] encodedAsBase64]]
|
|
|
|
|
|
|
|
@interface DnsManagerTest : XCTestCase
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation DnsManagerTest
|
|
|
|
|
|
|
|
-(void) testQueryAddresses_Sequential {
|
|
|
|
Future* f1 = [DnsManager asyncQueryAddressesForDomainName:reliableHostName
|
|
|
|
unlessCancelled:nil];
|
|
|
|
testChurnUntil(f1.hasSucceeded, 5.0);
|
|
|
|
test([(NSArray*)[f1 forceGetResult] count] > 0);
|
|
|
|
|
|
|
|
Future* f2 = [DnsManager asyncQueryAddressesForDomainName:invalidHostname
|
|
|
|
unlessCancelled:nil];
|
|
|
|
testChurnUntil(f2.hasFailed, 5.0);
|
|
|
|
|
|
|
|
Future* f3 = [DnsManager asyncQueryAddressesForDomainName:nonExistentHostname
|
|
|
|
unlessCancelled:nil];
|
|
|
|
testChurnUntil(f3.hasFailed, 5.0);
|
|
|
|
|
|
|
|
Future* f4 = [DnsManager asyncQueryAddressesForDomainName:infrastructureTestHostName
|
|
|
|
unlessCancelled:nil];
|
|
|
|
testChurnUntil(f4.hasSucceeded, 5.0);
|
|
|
|
test(f4.hasSucceeded && [(NSArray*)[f4 forceGetResult] count] > 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
-(void) testQueryAddresses_Concurrent {
|
|
|
|
Future* f1 = [DnsManager asyncQueryAddressesForDomainName:reliableHostName
|
|
|
|
unlessCancelled:nil];
|
|
|
|
Future* f2 = [DnsManager asyncQueryAddressesForDomainName:invalidHostname
|
|
|
|
unlessCancelled:nil];
|
|
|
|
Future* f3 = [DnsManager asyncQueryAddressesForDomainName:nonExistentHostname
|
|
|
|
unlessCancelled:nil];
|
|
|
|
Future* f4 = [DnsManager asyncQueryAddressesForDomainName:infrastructureTestHostName
|
|
|
|
unlessCancelled:nil];
|
|
|
|
|
|
|
|
testChurnUntil(f1.hasSucceeded && f2.hasFailed && f3.hasFailed && f4.hasSucceeded, 5.0);
|
|
|
|
test(f1.hasSucceeded && [(NSArray*)[f1 forceGetResult] count] > 0);
|
|
|
|
test(f4.hasSucceeded && [(NSArray*)[f4 forceGetResult] count] > 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
-(void) testQueryAddresses_Cancel {
|
|
|
|
CancelTokenSource* c = [CancelTokenSource cancelTokenSource];
|
|
|
|
Future* f1 = [DnsManager asyncQueryAddressesForDomainName:reliableHostName
|
|
|
|
unlessCancelled:[c getToken]];
|
|
|
|
Future* f2 = [DnsManager asyncQueryAddressesForDomainName:invalidHostname
|
|
|
|
unlessCancelled:[c getToken]];
|
|
|
|
Future* f3 = [DnsManager asyncQueryAddressesForDomainName:nonExistentHostname
|
|
|
|
unlessCancelled:[c getToken]];
|
|
|
|
Future* f4 = [DnsManager asyncQueryAddressesForDomainName:infrastructureTestHostName
|
|
|
|
unlessCancelled:[c getToken]];
|
|
|
|
[c cancel];
|
|
|
|
|
|
|
|
testChurnUntil(!f1.isIncomplete && f2.hasFailed && f3.hasFailed && !f4.isIncomplete, 5.0);
|
|
|
|
test(f1.hasSucceeded || [[f1 forceGetFailure] conformsToProtocol:@protocol(CancelToken)]);
|
|
|
|
test(f2.hasFailed);
|
|
|
|
test(f3.hasFailed);
|
|
|
|
test(f4.hasSucceeded || [[f4 forceGetFailure] conformsToProtocol:@protocol(CancelToken)]);
|
|
|
|
}
|
|
|
|
|
|
|
|
-(void)testQueryAddresses_FastCancel {
|
|
|
|
CancelTokenSource* c = [CancelTokenSource cancelTokenSource];
|
|
|
|
Future* f = [DnsManager asyncQueryAddressesForDomainName:reliableHostName
|
|
|
|
unlessCancelled:[c getToken]];
|
|
|
|
[c cancel];
|
|
|
|
test(!f.isIncomplete);
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|