Authored by 周蓉君

新增YH_AnalyticsLogicTest. Review by 阿瑟。

... ... @@ -30,6 +30,7 @@
CA7AC79E1ADE0C3900F30791 /* YHDeviceFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC79D1ADE0C3900F30791 /* YHDeviceFactoryTests.m */; };
CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */; };
CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */; };
CA7AC7A41ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */; };
CABC32831AD7CEB8002A4260 /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CABC32821AD7CEB8002A4260 /* libOCMock.a */; };
E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D458E1ABA7C6300EFE12E /* AFHTTPRequestOperation.m */; };
E74D45B31ABA7C6300EFE12E /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D45901ABA7C6300EFE12E /* AFHTTPRequestOperationManager.m */; };
... ... @@ -126,6 +127,7 @@
CA7AC79D1ADE0C3900F30791 /* YHDeviceFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHDeviceFactoryTests.m; sourceTree = "<group>"; };
CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHEventFactoryTests.m; sourceTree = "<group>"; };
CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactoryTests.m; sourceTree = "<group>"; };
CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsLogicTests.m; sourceTree = "<group>"; };
CABC32791AD7CE40002A4260 /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+OCMAdditions.h"; sourceTree = "<group>"; };
CABC327A1AD7CE40002A4260 /* OCMArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMArg.h; sourceTree = "<group>"; };
CABC327B1AD7CE40002A4260 /* OCMConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMConstraint.h; sourceTree = "<group>"; };
... ... @@ -291,6 +293,7 @@
CA7AC78D1ADE08AF00F30791 /* ModelTest */,
CA7AC78C1ADE088D00F30791 /* UtilsTest */,
194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */,
CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */,
CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */,
CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */,
194EDC8D1A7F52D100421E6C /* Supporting Files */,
... ... @@ -688,6 +691,7 @@
CA7AC7931ADE08F000F30791 /* YHEventTests.m in Sources */,
CA7AC7851ADE073200F30791 /* NSString+YHAnalyticsTests.m in Sources */,
CA7AC79E1ADE0C3900F30791 /* YHDeviceFactoryTests.m in Sources */,
CA7AC7A41ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m in Sources */,
CA7AC79A1ADE0BD500F30791 /* YHDataFactoryTests.m in Sources */,
CA7AC79C1ADE0C0800F30791 /* YHErrorFactoryTests.m in Sources */,
CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */,
... ...
... ... @@ -20,18 +20,18 @@
// Override point for customization after application launch.
// 设置发送策略
// [YH_Analytics shareInstance].logStrategy = LogStrategyCustom;
// [YH_Analytics sharedInstance].logStrategy = LogStrategyCustom;
// 自定义发送时间,从服务器获取
[YH_Analytics shareInstance].customInterval = 1000;
[YH_Analytics sharedInstance].customInterval = 1000;
// 设置用户id
[YH_Analytics shareInstance].uid = @"0000001";
[YH_Analytics sharedInstance].uid = @"0000001";
// 启动
[[YH_Analytics shareInstance]startWithAppId:@"appid"];
[[YH_Analytics sharedInstance]startWithAppId:@"appid"];
NSLog(@"logStrategy == %d", [YH_Analytics shareInstance].logStrategy);
NSLog(@"logStrategy == %d", [YH_Analytics sharedInstance].logStrategy);
return YES;
}
... ...
... ... @@ -20,7 +20,7 @@
[super viewDidLoad];
[self.imageView setImage:[UIImage imageNamed:@"stastsold"]];
self.segment.selectedSegmentIndex = [YH_Analytics shareInstance].logStrategy;
self.segment.selectedSegmentIndex = [YH_Analytics sharedInstance].logStrategy;
}
- (void)didReceiveMemoryWarning {
... ... @@ -31,7 +31,7 @@
- (IBAction)click:(id)sender {
for (int i = 0; i< 10; i++) {
[[YH_Analytics shareInstance] logEvent:@"test" parameters:
[[YH_Analytics sharedInstance] logEvent:@"test" parameters:
@{@"key1" : [NSString stringWithFormat:@"%d", i],
@"key2" : @"v2"
}];
... ... @@ -43,7 +43,7 @@
// for (int i = 0; i< 10; i++) {
[[YH_Analytics shareInstance]logError:@"NETWORK" parameters:
[[YH_Analytics sharedInstance]logError:@"NETWORK" parameters:
@{JsonKeyErrorEC:@"503", // 错误码
JsonKeyErrorEI:@"getUserAvatar" //发生错误接口
}];
... ... @@ -68,17 +68,17 @@
switch (index) {
case 0: {
[YH_Analytics shareInstance].logStrategy = LogStrategyAppLaunch;
[YH_Analytics sharedInstance].logStrategy = LogStrategyAppLaunch;
break;
}
case 1: {
[YH_Analytics shareInstance].logStrategy = LogStrategyCustom;
[YH_Analytics sharedInstance].logStrategy = LogStrategyCustom;
[[NSUserDefaults standardUserDefaults] setDouble:60 forKey:kKeyUserDefaultsCustomInterval];
[[NSUserDefaults standardUserDefaults] synchronize];
break;
}
case 2: {
[YH_Analytics shareInstance].logStrategy = LogStrategyImmedi;;
[YH_Analytics sharedInstance].logStrategy = LogStrategyImmedi;;
break;
}
default:
... ...
... ... @@ -31,7 +31,7 @@ extern NSString * const JsonKeyDataTypeErrors;
@property (strong, nonatomic) YHStatus *currentStatus;
@property (strong, nonatomic) NSMutableDictionary *immediUploadItemDic; // 用于立即发送策略下(device信息是相同的)
+ (instancetype)shareInstance;
+ (instancetype)sharedInstance;
- (BOOL)canPersisiting;
... ...
... ... @@ -57,16 +57,16 @@ NSString * const JsonKeyDataTypeErrors = @"errors";
#pragma mark - 初始化
static dispatch_queue_t persisitingQueue;
+ (instancetype)shareInstance
+ (instancetype)sharedInstance
{
static YHAssemblyAssistant *_shareInstance;
static YHAssemblyAssistant *_sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_shareInstance = [[YHAssemblyAssistant alloc] init];
_sharedInstance = [[YHAssemblyAssistant alloc] init];
persisitingQueue = dispatch_queue_create("com.yoho.analytics.persisiting", NULL);
});
return _shareInstance;
return _sharedInstance;
}
- (id)init
... ... @@ -289,7 +289,7 @@ static dispatch_queue_t persisitingQueue;
if (data) {
[[YHNetworkAssistant shareInstance] postWhitAPI:kYASApiMethod parameters:data from:self success:^(id responseObject) {
[[YHNetworkAssistant sharedInstance] postWhitAPI:kYASApiMethod parameters:data from:self success:^(id responseObject) {
// NSLog(@"responseObject = %@", responseObject);
} failure:^(NSError *error) {
NSLog(@"error = %@", error.localizedDescription);
... ... @@ -299,11 +299,11 @@ static dispatch_queue_t persisitingQueue;
- (void)uploadDiskData
{
NSDictionary *uploadData = [[YHAssemblyAssistant shareInstance] getUploadData];
NSDictionary *uploadData = [[YHAssemblyAssistant sharedInstance] getUploadData];
if (uploadData) {
[[YHNetworkAssistant shareInstance] postWhitAPI:kYASApiMethod parameters:uploadData from:self success:^(id responseObject) {
[[YHNetworkAssistant sharedInstance] postWhitAPI:kYASApiMethod parameters:uploadData from:self success:^(id responseObject) {
// NSLog(@"responseObject = %@", responseObject);
[self removeLocalFile];
} failure:^(NSError *error) {
... ...
... ... @@ -59,14 +59,14 @@ void uncaughtCrashExceptionHandler(NSException *exception)
+ (YHCrashReporter *)sharedInstance
{
static YHCrashReporter *shareInstance = nil;
static YHCrashReporter *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[YHCrashReporter alloc] init];
sharedInstance = [[YHCrashReporter alloc] init];
});
return shareInstance;
return sharedInstance;
}
#pragma mark - Lifetime methods
... ... @@ -122,7 +122,7 @@ void uncaughtCrashExceptionHandler(NSException *exception)
{
NSLog(@"crash============:\n%@", userInfo);
if (userInfo) {
[[YH_Analytics shareInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
[[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
}
}
... ... @@ -130,7 +130,7 @@ void uncaughtCrashExceptionHandler(NSException *exception)
{
NSLog(@"crash============:\n%@", userInfo);
if (userInfo) {
[[YH_Analytics shareInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
[[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
}
}
... ...
... ... @@ -19,7 +19,7 @@ static NSString * const YHEAPIErrorDomain = @"YHEAPIErrorDomain";
#pragma mark - Init
+ (instancetype)shareInstance;
+ (instancetype)sharedInstance;
/**
* Initializes your network engine with a hostname
... ...
... ... @@ -28,15 +28,15 @@ AFNetworkReachabilityStatus _currentNetworkStatus;
#pragma mark - Init
+ (instancetype)shareInstance
+ (instancetype)sharedInstance
{
static YHNetworkAssistant *_shareInstance;
static YHNetworkAssistant *_sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sQueue = dispatch_queue_create("cn.yoho.analytics.network.squeue", 0);// create a serial queue
_allOperations = [NSMutableSet new];
_reachabilityChangedHandlers = [NSMutableArray array];
_shareInstance = [[YHNetworkAssistant alloc] initWithHostName:kAnalizedURL apiPath:nil customHeaderFields:nil];
_sharedInstance = [[YHNetworkAssistant alloc] initWithHostName:kAnalizedURL apiPath:nil customHeaderFields:nil];
// 监听网络状态
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
... ... @@ -53,7 +53,7 @@ AFNetworkReachabilityStatus _currentNetworkStatus;
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
});
return _shareInstance;
return _sharedInstance;
}
... ...
... ... @@ -22,7 +22,7 @@ typedef enum _YohoMobStatLogStrategy {
/**
* 获取统计对象的实例
*/
+ (YH_Analytics*) shareInstance;
+ (YH_Analytics*) sharedInstance;
/**
* 此处AppId即为应用的appKey
... ...
... ... @@ -50,16 +50,16 @@
static dispatch_queue_t persisitingQueue;
+ (YH_Analytics *)shareInstance
+ (YH_Analytics *)sharedInstance
{
static YH_Analytics *shareInstance = nil;
static YH_Analytics *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[YH_Analytics alloc] init];
sharedInstance = [[YH_Analytics alloc] init];
});
return shareInstance;
return sharedInstance;
}
- (id)init
... ... @@ -91,36 +91,36 @@ static dispatch_queue_t persisitingQueue;
CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE)
CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above)
*/
[[YHNetworkAssistant shareInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) {
[[YHNetworkAssistant sharedInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) {
CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
switch (networkStatus) {
case AFNetworkReachabilityStatusUnknown:
case AFNetworkReachabilityStatusNotReachable:
[YHAssemblyAssistant shareInstance].currentStatus.net = kNetWorkStatusUnknow;
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusUnknow;
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
{
if ([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
[YHAssemblyAssistant shareInstance].currentStatus.net = kNetWorkStatus2G;
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatus2G;
} else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
[YHAssemblyAssistant shareInstance].currentStatus.net = kNetWorkStatus3G;
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatus3G;
} else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
[YHAssemblyAssistant shareInstance].currentStatus.net = kNetWorkStatus4G;
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatus4G;
} else {
[YHAssemblyAssistant shareInstance].currentStatus.net = kNetWorkStatusUnknow;
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusUnknow;
}
}
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
[YHAssemblyAssistant shareInstance].currentStatus.net = kNetWorkStatusWIFI;
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusWIFI;
break;
default:
break;
}
[[YHAssemblyAssistant shareInstance] updateImmediUploadDic];
[[YHAssemblyAssistant sharedInstance] updateImmediUploadDic];
}];
}
... ... @@ -167,14 +167,14 @@ static dispatch_queue_t persisitingQueue;
{
[self registerCrashReporter];
[self registerAppWillEnterForegroundNotification];
[YHAssemblyAssistant shareInstance].currentStatus.sid = self.session;
[YHAssemblyAssistant shareInstance].device.ak = appId;
[YHAssemblyAssistant sharedInstance].currentStatus.sid = self.session;
[YHAssemblyAssistant sharedInstance].device.ak = appId;
/*
构建即时发送模式下数据
*/
[[YHAssemblyAssistant shareInstance] prepareImmediUploadDic];
[[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic];
/*
检查发送模式
... ... @@ -230,9 +230,9 @@ static dispatch_queue_t persisitingQueue;
// 立即发送策略
if (self.logStrategy == LogStrategyImmedi) {
[[YHAssemblyAssistant shareInstance] uploadImmedilyWithEvent:event];
[[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:event];
} else {
[[YHAssemblyAssistant shareInstance] saveItemData:event];
[[YHAssemblyAssistant sharedInstance] saveItemData:event];
}
}
... ... @@ -248,9 +248,9 @@ static dispatch_queue_t persisitingQueue;
error.param = param;
if (self.logStrategy == LogStrategyImmedi) {
[[YHAssemblyAssistant shareInstance] uploadImmedilyWithEvent:error];
[[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:error];
} else {
[[YHAssemblyAssistant shareInstance] saveItemData:error];
[[YHAssemblyAssistant sharedInstance] saveItemData:error];
}
}
... ... @@ -265,7 +265,7 @@ static dispatch_queue_t persisitingQueue;
// 发送本地持久化数据
- (void)uploadDiskData
{
[[YHAssemblyAssistant shareInstance] uploadDiskData];
[[YHAssemblyAssistant sharedInstance] uploadDiskData];
}
// 发送本地持久化数据
... ... @@ -302,11 +302,11 @@ static dispatch_queue_t persisitingQueue;
CLLocationCoordinate2D loc = [newLocation coordinate];
float longitude = loc.longitude;
float latitude = loc.latitude;
[YHAssemblyAssistant shareInstance].currentStatus.lo = [NSString stringWithFormat:@"%f",longitude];
[YHAssemblyAssistant shareInstance].currentStatus.la = [NSString stringWithFormat:@"%f",latitude];
[YHAssemblyAssistant sharedInstance].currentStatus.lo = [NSString stringWithFormat:@"%f",longitude];
[YHAssemblyAssistant sharedInstance].currentStatus.la = [NSString stringWithFormat:@"%f",latitude];
// 更新经纬度
[[YHAssemblyAssistant shareInstance].immediUploadItemDic setObject:[YHAssemblyAssistant shareInstance].device.jsonDictionary forKey:JsonKeyDataTypeDevice];
[[YHAssemblyAssistant sharedInstance].immediUploadItemDic setObject:[YHAssemblyAssistant sharedInstance].device.jsonDictionary forKey:JsonKeyDataTypeDevice];
}
... ...
//
// YH_AnalyticsLogicTests.m
// YH_Analytics
//
// Created by Zhou Rongjun on 15/4/16.
// Copyright (c) 2015年 YOHO. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import "OCMock.h"
#import <CoreLocation/CoreLocation.h>
#import "YHCrashReporter.h"
#import "YHAssemblyAssistant.h"
#import "YH_Analytics.h"
@interface YH_AnalyticsLogicTests : XCTestCase {
@private
id locationManageMock;
id assemblyAssistantMock;
id crashReporterMock;
id networkAssistantMock;
YH_Analytics *analytics;
}
@end
@implementation YH_AnalyticsLogicTests
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
locationManageMock = OCMClassMock([CLLocationManager class]);
assemblyAssistantMock = OCMClassMock([YHAssemblyAssistant class]);
OCMStub([assemblyAssistantMock sharedInstance]).andReturn(assemblyAssistantMock);
crashReporterMock = OCMClassMock([YHCrashReporter class]);
OCMStub([crashReporterMock sharedInstance]).andReturn(crashReporterMock);
networkAssistantMock = OCMClassMock([YHNetworkAssistant class]);
OCMStub([networkAssistantMock sharedInstance]).andReturn(networkAssistantMock);
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
#pragma mark - 逻辑分支测试
- (void)testStartWithAppIdMethodPrepareImmediUploadDic {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
OCMExpect([assemblyAssistantMock prepareImmediUploadDic]);
[analytics startWithAppId:@"appId"];
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
- (void)testStartWithAppIdMethodWithLogStrategyAppLaunch {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyAppLaunch;
OCMExpect([assemblyAssistantMock uploadDiskData]);
[analytics startWithAppId:@"appId"];
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
- (void)testStartWithAppIdMethodWithLogStrategyCustom {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyCustom;
OCMExpect([assemblyAssistantMock uploadDiskData]);
[analytics startWithAppId:@"appId"];
OCMVerifyAll(assemblyAssistantMock);
NSLog(@"%@ end", self.name);
}
- (void)testStartWithAppIdMethodWithLogStrategyImmedi {
NSLog(@"%@ start", self.name);
analytics = [[YH_Analytics alloc] init];
analytics.logStrategy = LogStrategyImmedi;
OCMExpect([assemblyAssistantMock uploadDiskData]);
[analytics startWithAppId:@"appId"];
XCTAssertThrows([assemblyAssistantMock verify], @"StartWithAppId should not uploadDiskData when strategy is immediately.") ;
NSLog(@"%@ end", self.name);
}
@end
... ...
... ... @@ -81,18 +81,4 @@
NSLog(@"%@ end", self.name);
}
#pragma mark - 分支测试
- (void)testStartWithAppIdMethodWithLogStrategyAppLaunch {
NSLog(@"%@ start", self.name);
NSLog(@"%@ end", self.name);
}
- (void)testStartWithAppIdMethodWithLogStrategyCustom {
NSLog(@"%@ start", self.name);
NSLog(@"%@ end", self.name);
}
@end
... ...