#import #import "DnsManager.h" #import "TestUtil.h" #import "Util.h" #import "IpAddress.h" #import "ThreadManager.h" #import "CancelTokenSource.h" #import #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