134 lines
4.3 KiB
Objective-C
134 lines
4.3 KiB
Objective-C
//
|
||
// ScheduleCenterV4Test.m
|
||
// TrustHttpDNSTests
|
||
//
|
||
// Created by xuyecan on 2024/6/16.
|
||
// Copyright 穢 2024 trustapp.com. All rights reserved.
|
||
//
|
||
|
||
#import <Foundation/Foundation.h>
|
||
#import <OCMock/OCMock.h>
|
||
#import "TestBase.h"
|
||
#import "HttpdnsHostObject.h"
|
||
#import "HttpdnsScheduleCenter.h"
|
||
#import "HttpdnsService.h"
|
||
#import "HttpdnsService_Internal.h"
|
||
#import "HttpdnsRequest_Internal.h"
|
||
#import "HttpdnsScheduleExecutor.h"
|
||
#import "HttpdnsRemoteResolver.h"
|
||
|
||
|
||
/**
|
||
* <20>曹<EFBFBD>雿輻鍂OCMock<63>刻<EFBFBD>蝏剔<E89D8F>瘚贝<E7989A><E8B49D>其<EFBFBD>銝剝<E98A9D>憭𦱆ock撖寡情(<28>喃蝙瘥𤩺活<F0A4A9BA>賢歇蝏𥲑topMocking)隡𡁏<E99AA1><F0A1818F><EFBFBD><EFBFBD><EFBFBD>嗘僚<E59798><E5839A>䔮憸矋<E686B8>
|
||
* <20>桀<EFBFBD>餈䁅圾<E48185>喃<EFBFBD>鈭<EFBFBD><E988AD><EFBFBD><EFBFBD>隞亥<E99A9E>銝芰掩銝剔<E98A9D>瘚贝<E7989A>case嚗屸<E59A97>閬<EFBFBD><E996AC><EFBFBD>典<EFBFBD><E585B8>祆<EFBFBD>銵?
|
||
*/
|
||
@interface ScheduleCenterV4Test : TestBase
|
||
|
||
@end
|
||
|
||
|
||
@implementation ScheduleCenterV4Test
|
||
|
||
+ (void)setUp {
|
||
[super setUp];
|
||
}
|
||
|
||
+ (void)tearDown {
|
||
[super tearDown];
|
||
}
|
||
|
||
- (void)setUp {
|
||
[super setUp];
|
||
|
||
static dispatch_once_t onceToken;
|
||
dispatch_once(&onceToken, ^{
|
||
self.httpdns = [[HttpDnsService alloc] initWithAccountID:100000];
|
||
});
|
||
|
||
[self.httpdns setLogEnabled:YES];
|
||
[self.httpdns setReuseExpiredIPEnabled:NO];
|
||
|
||
[self.httpdns setLogHandler:self];
|
||
|
||
self.currentTimeStamp = [[NSDate date] timeIntervalSince1970];
|
||
}
|
||
|
||
- (void)tearDown {
|
||
[super tearDown];
|
||
}
|
||
|
||
- (void)testUpdateFailureWillMoveToNextUpdateServer {
|
||
[self presetNetworkEnvAsIpv4];
|
||
|
||
HttpdnsScheduleExecutor *realRequest = [HttpdnsScheduleExecutor new];
|
||
id mockRequest = OCMPartialMock(realRequest);
|
||
OCMStub([mockRequest fetchRegionConfigFromServer:[OCMArg any] error:(NSError * __autoreleasing *)[OCMArg anyPointer]])
|
||
.andReturn(nil);
|
||
|
||
id mockRequestClass = OCMClassMock([HttpdnsScheduleExecutor class]);
|
||
OCMStub([mockRequestClass new]).andReturn(mockRequest);
|
||
|
||
HttpdnsScheduleCenter *scheduleCenter = [[HttpdnsScheduleCenter alloc] initWithAccountId:100000];
|
||
|
||
NSArray<NSString *> *updateServerHostList = [scheduleCenter currentUpdateServerV4HostList];
|
||
|
||
int updateServerCount = (int)[updateServerHostList count];
|
||
XCTAssertGreaterThan(updateServerCount, 0);
|
||
|
||
int startIndex = [scheduleCenter currentActiveUpdateServerHostIndex];
|
||
|
||
// <20><><EFBFBD>撌脩<E6928C><E884A9>滩<EFBFBD>2甈∴<E79488><E288B4>踹<EFBFBD><E8B8B9>滩<EFBFBD>敶勗<E695B6>霈∠<E99C88>
|
||
[scheduleCenter asyncUpdateRegionScheduleConfigAtRetry:2];
|
||
[NSThread sleepForTimeInterval:0.1];
|
||
|
||
OCMVerify([mockRequest fetchRegionConfigFromServer:[OCMArg any] error:(NSError * __autoreleasing *)[OCMArg anyPointer]]);
|
||
|
||
int currentIndex = [scheduleCenter currentActiveUpdateServerHostIndex];
|
||
XCTAssertEqual((startIndex + 1) % updateServerCount, currentIndex);
|
||
|
||
for (int i = 0; i < updateServerCount; i++) {
|
||
[scheduleCenter asyncUpdateRegionScheduleConfigAtRetry:2];
|
||
[NSThread sleepForTimeInterval:0.1];
|
||
}
|
||
|
||
int finalIndex = [scheduleCenter currentActiveUpdateServerHostIndex];
|
||
XCTAssertEqual(currentIndex, finalIndex % updateServerCount);
|
||
|
||
[NSThread sleepForTimeInterval:3];
|
||
}
|
||
|
||
- (void)testResolveFailureWillMoveToNextServiceServer {
|
||
[self presetNetworkEnvAsIpv4];
|
||
|
||
id mockResolver = OCMPartialMock([HttpdnsRemoteResolver new]);
|
||
OCMStub([mockResolver resolve:[OCMArg any] error:(NSError * __autoreleasing *)[OCMArg anyPointer]])
|
||
.andDo(^(NSInvocation *invocation) {
|
||
NSError *mockError = [NSError errorWithDomain:@"com.example.error" code:123 userInfo:@{NSLocalizedDescriptionKey: @"Mock error"}];
|
||
NSError *__autoreleasing *errorPtr = nil;
|
||
[invocation getArgument:&errorPtr atIndex:3];
|
||
if (errorPtr) {
|
||
*errorPtr = mockError;
|
||
}
|
||
});
|
||
|
||
id mockResolverClass = OCMClassMock([HttpdnsRemoteResolver class]);
|
||
OCMStub([mockResolverClass new]).andReturn(mockResolver);
|
||
|
||
HttpdnsScheduleCenter *scheduleCenter = [[HttpdnsScheduleCenter alloc] initWithAccountId:100000];
|
||
int startIndex = [scheduleCenter currentActiveServiceServerHostIndex];
|
||
int serviceServerCount = (int)[scheduleCenter currentServiceServerV4HostList].count;
|
||
|
||
HttpdnsRequest *request = [[HttpdnsRequest alloc] initWithHost:@"mock" queryIpType:HttpdnsQueryIPTypeAuto];
|
||
[request becomeBlockingRequest];
|
||
|
||
HttpdnsRequestManager *requestManager = self.httpdns.requestManager;
|
||
|
||
[requestManager executeRequest:request retryCount:1];
|
||
|
||
int secondIndex = [scheduleCenter currentActiveServiceServerHostIndex];
|
||
|
||
XCTAssertEqual((startIndex + 1) % serviceServerCount, secondIndex);
|
||
}
|
||
|
||
@end
|