diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj new file mode 100644 index 000000000..92fef10fb --- /dev/null +++ b/Adjust.xcodeproj/project.pbxproj @@ -0,0 +1,568 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 9679921118BBAE2800394606 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679921018BBAE2800394606 /* Foundation.framework */; }; + 9679921F18BBAE2800394606 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679921E18BBAE2800394606 /* XCTest.framework */; }; + 9679922018BBAE2800394606 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679921018BBAE2800394606 /* Foundation.framework */; }; + 9679922218BBAE2800394606 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679922118BBAE2800394606 /* UIKit.framework */; }; + 9679922518BBAE2800394606 /* libAdjust.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679920D18BBAE2800394606 /* libAdjust.a */; }; + 96E5E38118BBB48A008E7B30 /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E34D18BBB48A008E7B30 /* Adjust.m */; }; + 96E5E38B18BBB48A008E7B30 /* AIActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36318BBB48A008E7B30 /* AIActivityHandler.m */; }; + 96E5E38C18BBB48A008E7B30 /* AIActivityKind.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36518BBB48A008E7B30 /* AIActivityKind.m */; }; + 96E5E38D18BBB48A008E7B30 /* AIActivityPackage.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36718BBB48A008E7B30 /* AIActivityPackage.m */; }; + 96E5E38E18BBB48A008E7B30 /* AIActivityState.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36918BBB48A008E7B30 /* AIActivityState.m */; }; + 96E5E38F18BBB48A008E7B30 /* NSData+AIAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36C18BBB48A008E7B30 /* NSData+AIAdditions.m */; }; + 96E5E39018BBB48A008E7B30 /* NSString+AIAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36E18BBB48A008E7B30 /* NSString+AIAdditions.m */; }; + 96E5E39118BBB48A008E7B30 /* UIDevice+AIAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37018BBB48A008E7B30 /* UIDevice+AIAdditions.m */; }; + 96E5E39218BBB48A008E7B30 /* AIAdjustFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37218BBB48A008E7B30 /* AIAdjustFactory.m */; }; + 96E5E39318BBB48A008E7B30 /* AILogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37418BBB48A008E7B30 /* AILogger.m */; }; + 96E5E39418BBB48A008E7B30 /* AIPackageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37618BBB48A008E7B30 /* AIPackageBuilder.m */; }; + 96E5E39518BBB48A008E7B30 /* AIPackageHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37818BBB48A008E7B30 /* AIPackageHandler.m */; }; + 96E5E39618BBB48A008E7B30 /* AIRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37A18BBB48A008E7B30 /* AIRequestHandler.m */; }; + 96E5E39718BBB48A008E7B30 /* AIResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37C18BBB48A008E7B30 /* AIResponseData.m */; }; + 96E5E39818BBB48A008E7B30 /* AITimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37E18BBB48A008E7B30 /* AITimer.m */; }; + 96E5E39918BBB48A008E7B30 /* AIUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E38018BBB48A008E7B30 /* AIUtil.m */; }; + 96E5E3AE18BBB49E008E7B30 /* AdjustTests-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 96E5E39C18BBB49E008E7B30 /* AdjustTests-Info.plist */; }; + 96E5E3AF18BBB49E008E7B30 /* AIActivityHandlerMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E39E18BBB49E008E7B30 /* AIActivityHandlerMock.m */; }; + 96E5E3B018BBB49E008E7B30 /* AIActivityHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E39F18BBB49E008E7B30 /* AIActivityHandlerTests.m */; }; + 96E5E3B118BBB49E008E7B30 /* AILoggerMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3A118BBB49E008E7B30 /* AILoggerMock.m */; }; + 96E5E3B218BBB49E008E7B30 /* AIPackageHandlerMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3A318BBB49E008E7B30 /* AIPackageHandlerMock.m */; }; + 96E5E3B318BBB49E008E7B30 /* AIPackageHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3A418BBB49E008E7B30 /* AIPackageHandlerTests.m */; }; + 96E5E3B418BBB49E008E7B30 /* AIRequestHandlerMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3A618BBB49E008E7B30 /* AIRequestHandlerMock.m */; }; + 96E5E3B518BBB49E008E7B30 /* AIRequestHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3A718BBB49E008E7B30 /* AIRequestHandlerTests.m */; }; + 96E5E3B618BBB49E008E7B30 /* AITestsUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3A918BBB49E008E7B30 /* AITestsUtil.m */; }; + 96E5E3B718BBB49E008E7B30 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 96E5E3AA18BBB49E008E7B30 /* InfoPlist.strings */; }; + 96E5E3B818BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E3AD18BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m */; }; + 96E5E3B918BBB75F008E7B30 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679921E18BBAE2800394606 /* XCTest.framework */; }; + 96E5E3BB18BBB989008E7B30 /* NSString+AIAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36E18BBB48A008E7B30 /* NSString+AIAdditions.m */; }; + 96E5E3BC18BBB98C008E7B30 /* NSData+AIAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36C18BBB48A008E7B30 /* NSData+AIAdditions.m */; }; + 96E5E3BD18BBB992008E7B30 /* UIDevice+AIAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E37018BBB48A008E7B30 /* UIDevice+AIAdditions.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 9679922318BBAE2800394606 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9679920518BBAE2800394606 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9679920C18BBAE2800394606; + remoteInfo = Adjust; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9679920B18BBAE2800394606 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 9679920D18BBAE2800394606 /* libAdjust.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAdjust.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 9679921018BBAE2800394606 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 9679921D18BBAE2800394606 /* AdjustTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AdjustTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 9679921E18BBAE2800394606 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 9679922118BBAE2800394606 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 96E5E34C18BBB48A008E7B30 /* Adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Adjust.h; sourceTree = ""; }; + 96E5E34D18BBB48A008E7B30 /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; + 96E5E36218BBB48A008E7B30 /* AIActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIActivityHandler.h; sourceTree = ""; }; + 96E5E36318BBB48A008E7B30 /* AIActivityHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIActivityHandler.m; sourceTree = ""; }; + 96E5E36418BBB48A008E7B30 /* AIActivityKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIActivityKind.h; sourceTree = ""; }; + 96E5E36518BBB48A008E7B30 /* AIActivityKind.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIActivityKind.m; sourceTree = ""; }; + 96E5E36618BBB48A008E7B30 /* AIActivityPackage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIActivityPackage.h; sourceTree = ""; }; + 96E5E36718BBB48A008E7B30 /* AIActivityPackage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIActivityPackage.m; sourceTree = ""; }; + 96E5E36818BBB48A008E7B30 /* AIActivityState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIActivityState.h; sourceTree = ""; }; + 96E5E36918BBB48A008E7B30 /* AIActivityState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIActivityState.m; sourceTree = ""; }; + 96E5E36B18BBB48A008E7B30 /* NSData+AIAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+AIAdditions.h"; sourceTree = ""; }; + 96E5E36C18BBB48A008E7B30 /* NSData+AIAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+AIAdditions.m"; sourceTree = ""; }; + 96E5E36D18BBB48A008E7B30 /* NSString+AIAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+AIAdditions.h"; sourceTree = ""; }; + 96E5E36E18BBB48A008E7B30 /* NSString+AIAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+AIAdditions.m"; sourceTree = ""; }; + 96E5E36F18BBB48A008E7B30 /* UIDevice+AIAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+AIAdditions.h"; sourceTree = ""; }; + 96E5E37018BBB48A008E7B30 /* UIDevice+AIAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+AIAdditions.m"; sourceTree = ""; }; + 96E5E37118BBB48A008E7B30 /* AIAdjustFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIAdjustFactory.h; sourceTree = ""; }; + 96E5E37218BBB48A008E7B30 /* AIAdjustFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIAdjustFactory.m; sourceTree = ""; }; + 96E5E37318BBB48A008E7B30 /* AILogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AILogger.h; sourceTree = ""; }; + 96E5E37418BBB48A008E7B30 /* AILogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AILogger.m; sourceTree = ""; }; + 96E5E37518BBB48A008E7B30 /* AIPackageBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIPackageBuilder.h; sourceTree = ""; }; + 96E5E37618BBB48A008E7B30 /* AIPackageBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIPackageBuilder.m; sourceTree = ""; }; + 96E5E37718BBB48A008E7B30 /* AIPackageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIPackageHandler.h; sourceTree = ""; }; + 96E5E37818BBB48A008E7B30 /* AIPackageHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIPackageHandler.m; sourceTree = ""; }; + 96E5E37918BBB48A008E7B30 /* AIRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRequestHandler.h; sourceTree = ""; }; + 96E5E37A18BBB48A008E7B30 /* AIRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRequestHandler.m; sourceTree = ""; }; + 96E5E37B18BBB48A008E7B30 /* AIResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIResponseData.h; sourceTree = ""; }; + 96E5E37C18BBB48A008E7B30 /* AIResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIResponseData.m; sourceTree = ""; }; + 96E5E37D18BBB48A008E7B30 /* AITimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AITimer.h; sourceTree = ""; }; + 96E5E37E18BBB48A008E7B30 /* AITimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AITimer.m; sourceTree = ""; }; + 96E5E37F18BBB48A008E7B30 /* AIUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIUtil.h; sourceTree = ""; }; + 96E5E38018BBB48A008E7B30 /* AIUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIUtil.m; sourceTree = ""; }; + 96E5E39B18BBB49E008E7B30 /* Adjust-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Adjust-Prefix.pch"; sourceTree = ""; }; + 96E5E39C18BBB49E008E7B30 /* AdjustTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AdjustTests-Info.plist"; sourceTree = ""; }; + 96E5E39D18BBB49E008E7B30 /* AIActivityHandlerMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIActivityHandlerMock.h; sourceTree = ""; }; + 96E5E39E18BBB49E008E7B30 /* AIActivityHandlerMock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIActivityHandlerMock.m; sourceTree = ""; }; + 96E5E39F18BBB49E008E7B30 /* AIActivityHandlerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIActivityHandlerTests.m; sourceTree = ""; }; + 96E5E3A018BBB49E008E7B30 /* AILoggerMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AILoggerMock.h; sourceTree = ""; }; + 96E5E3A118BBB49E008E7B30 /* AILoggerMock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AILoggerMock.m; sourceTree = ""; }; + 96E5E3A218BBB49E008E7B30 /* AIPackageHandlerMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIPackageHandlerMock.h; sourceTree = ""; }; + 96E5E3A318BBB49E008E7B30 /* AIPackageHandlerMock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIPackageHandlerMock.m; sourceTree = ""; }; + 96E5E3A418BBB49E008E7B30 /* AIPackageHandlerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIPackageHandlerTests.m; sourceTree = ""; }; + 96E5E3A518BBB49E008E7B30 /* AIRequestHandlerMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIRequestHandlerMock.h; sourceTree = ""; }; + 96E5E3A618BBB49E008E7B30 /* AIRequestHandlerMock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRequestHandlerMock.m; sourceTree = ""; }; + 96E5E3A718BBB49E008E7B30 /* AIRequestHandlerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AIRequestHandlerTests.m; sourceTree = ""; }; + 96E5E3A818BBB49E008E7B30 /* AITestsUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AITestsUtil.h; sourceTree = ""; }; + 96E5E3A918BBB49E008E7B30 /* AITestsUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AITestsUtil.m; sourceTree = ""; }; + 96E5E3AB18BBB49E008E7B30 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 96E5E3AC18BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h"; sourceTree = ""; }; + 96E5E3AD18BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9679920A18BBAE2800394606 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9679921118BBAE2800394606 /* Foundation.framework in Frameworks */, + 96E5E3B918BBB75F008E7B30 /* XCTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9679921A18BBAE2800394606 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9679922518BBAE2800394606 /* libAdjust.a in Frameworks */, + 9679921F18BBAE2800394606 /* XCTest.framework in Frameworks */, + 9679922218BBAE2800394606 /* UIKit.framework in Frameworks */, + 9679922018BBAE2800394606 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9679920418BBAE2800394606 = { + isa = PBXGroup; + children = ( + 96E5E39A18BBB49E008E7B30 /* AdjustTests */, + 96E5E34B18BBB48A008E7B30 /* Adjust */, + 9679920F18BBAE2800394606 /* Frameworks */, + 9679920E18BBAE2800394606 /* Products */, + ); + sourceTree = ""; + }; + 9679920E18BBAE2800394606 /* Products */ = { + isa = PBXGroup; + children = ( + 9679920D18BBAE2800394606 /* libAdjust.a */, + 9679921D18BBAE2800394606 /* AdjustTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 9679920F18BBAE2800394606 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9679921018BBAE2800394606 /* Foundation.framework */, + 9679921E18BBAE2800394606 /* XCTest.framework */, + 9679922118BBAE2800394606 /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 96E5E34B18BBB48A008E7B30 /* Adjust */ = { + isa = PBXGroup; + children = ( + 96E5E34C18BBB48A008E7B30 /* Adjust.h */, + 96E5E34D18BBB48A008E7B30 /* Adjust.m */, + 96E5E36218BBB48A008E7B30 /* AIActivityHandler.h */, + 96E5E36318BBB48A008E7B30 /* AIActivityHandler.m */, + 96E5E36418BBB48A008E7B30 /* AIActivityKind.h */, + 96E5E36518BBB48A008E7B30 /* AIActivityKind.m */, + 96E5E36618BBB48A008E7B30 /* AIActivityPackage.h */, + 96E5E36718BBB48A008E7B30 /* AIActivityPackage.m */, + 96E5E36818BBB48A008E7B30 /* AIActivityState.h */, + 96E5E36918BBB48A008E7B30 /* AIActivityState.m */, + 96E5E36A18BBB48A008E7B30 /* AIAdditions */, + 96E5E37118BBB48A008E7B30 /* AIAdjustFactory.h */, + 96E5E37218BBB48A008E7B30 /* AIAdjustFactory.m */, + 96E5E37318BBB48A008E7B30 /* AILogger.h */, + 96E5E37418BBB48A008E7B30 /* AILogger.m */, + 96E5E37518BBB48A008E7B30 /* AIPackageBuilder.h */, + 96E5E37618BBB48A008E7B30 /* AIPackageBuilder.m */, + 96E5E37718BBB48A008E7B30 /* AIPackageHandler.h */, + 96E5E37818BBB48A008E7B30 /* AIPackageHandler.m */, + 96E5E37918BBB48A008E7B30 /* AIRequestHandler.h */, + 96E5E37A18BBB48A008E7B30 /* AIRequestHandler.m */, + 96E5E37B18BBB48A008E7B30 /* AIResponseData.h */, + 96E5E37C18BBB48A008E7B30 /* AIResponseData.m */, + 96E5E37D18BBB48A008E7B30 /* AITimer.h */, + 96E5E37E18BBB48A008E7B30 /* AITimer.m */, + 96E5E37F18BBB48A008E7B30 /* AIUtil.h */, + 96E5E38018BBB48A008E7B30 /* AIUtil.m */, + ); + path = Adjust; + sourceTree = ""; + }; + 96E5E36A18BBB48A008E7B30 /* AIAdditions */ = { + isa = PBXGroup; + children = ( + 96E5E36B18BBB48A008E7B30 /* NSData+AIAdditions.h */, + 96E5E36C18BBB48A008E7B30 /* NSData+AIAdditions.m */, + 96E5E36D18BBB48A008E7B30 /* NSString+AIAdditions.h */, + 96E5E36E18BBB48A008E7B30 /* NSString+AIAdditions.m */, + 96E5E36F18BBB48A008E7B30 /* UIDevice+AIAdditions.h */, + 96E5E37018BBB48A008E7B30 /* UIDevice+AIAdditions.m */, + ); + path = AIAdditions; + sourceTree = ""; + }; + 96E5E39A18BBB49E008E7B30 /* AdjustTests */ = { + isa = PBXGroup; + children = ( + 96E5E39B18BBB49E008E7B30 /* Adjust-Prefix.pch */, + 96E5E39C18BBB49E008E7B30 /* AdjustTests-Info.plist */, + 96E5E39D18BBB49E008E7B30 /* AIActivityHandlerMock.h */, + 96E5E39E18BBB49E008E7B30 /* AIActivityHandlerMock.m */, + 96E5E39F18BBB49E008E7B30 /* AIActivityHandlerTests.m */, + 96E5E3A018BBB49E008E7B30 /* AILoggerMock.h */, + 96E5E3A118BBB49E008E7B30 /* AILoggerMock.m */, + 96E5E3A218BBB49E008E7B30 /* AIPackageHandlerMock.h */, + 96E5E3A318BBB49E008E7B30 /* AIPackageHandlerMock.m */, + 96E5E3A418BBB49E008E7B30 /* AIPackageHandlerTests.m */, + 96E5E3A518BBB49E008E7B30 /* AIRequestHandlerMock.h */, + 96E5E3A618BBB49E008E7B30 /* AIRequestHandlerMock.m */, + 96E5E3A718BBB49E008E7B30 /* AIRequestHandlerTests.m */, + 96E5E3A818BBB49E008E7B30 /* AITestsUtil.h */, + 96E5E3A918BBB49E008E7B30 /* AITestsUtil.m */, + 96E5E3AA18BBB49E008E7B30 /* InfoPlist.strings */, + 96E5E3AC18BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h */, + 96E5E3AD18BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m */, + ); + path = AdjustTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 9679920C18BBAE2800394606 /* Adjust */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9679923018BBAE2800394606 /* Build configuration list for PBXNativeTarget "Adjust" */; + buildPhases = ( + 9679920918BBAE2800394606 /* Sources */, + 9679920A18BBAE2800394606 /* Frameworks */, + 9679920B18BBAE2800394606 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Adjust; + productName = Adjust; + productReference = 9679920D18BBAE2800394606 /* libAdjust.a */; + productType = "com.apple.product-type.library.static"; + }; + 9679921C18BBAE2800394606 /* AdjustTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9679923318BBAE2800394606 /* Build configuration list for PBXNativeTarget "AdjustTests" */; + buildPhases = ( + 9679921918BBAE2800394606 /* Sources */, + 9679921A18BBAE2800394606 /* Frameworks */, + 9679921B18BBAE2800394606 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 9679922418BBAE2800394606 /* PBXTargetDependency */, + ); + name = AdjustTests; + productName = AdjustTests; + productReference = 9679921D18BBAE2800394606 /* AdjustTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9679920518BBAE2800394606 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = adjust; + }; + buildConfigurationList = 9679920818BBAE2800394606 /* Build configuration list for PBXProject "Adjust" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 9679920418BBAE2800394606; + productRefGroup = 9679920E18BBAE2800394606 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9679920C18BBAE2800394606 /* Adjust */, + 9679921C18BBAE2800394606 /* AdjustTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 9679921B18BBAE2800394606 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 96E5E3AE18BBB49E008E7B30 /* AdjustTests-Info.plist in Resources */, + 96E5E3B718BBB49E008E7B30 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 9679920918BBAE2800394606 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 96E5E38118BBB48A008E7B30 /* Adjust.m in Sources */, + 96E5E38B18BBB48A008E7B30 /* AIActivityHandler.m in Sources */, + 96E5E39618BBB48A008E7B30 /* AIRequestHandler.m in Sources */, + 96E5E39918BBB48A008E7B30 /* AIUtil.m in Sources */, + 96E5E39818BBB48A008E7B30 /* AITimer.m in Sources */, + 96E5E39718BBB48A008E7B30 /* AIResponseData.m in Sources */, + 96E5E38F18BBB48A008E7B30 /* NSData+AIAdditions.m in Sources */, + 96E5E39118BBB48A008E7B30 /* UIDevice+AIAdditions.m in Sources */, + 96E5E38C18BBB48A008E7B30 /* AIActivityKind.m in Sources */, + 96E5E38D18BBB48A008E7B30 /* AIActivityPackage.m in Sources */, + 96E5E38E18BBB48A008E7B30 /* AIActivityState.m in Sources */, + 96E5E39018BBB48A008E7B30 /* NSString+AIAdditions.m in Sources */, + 96E5E39518BBB48A008E7B30 /* AIPackageHandler.m in Sources */, + 96E5E39318BBB48A008E7B30 /* AILogger.m in Sources */, + 96E5E39418BBB48A008E7B30 /* AIPackageBuilder.m in Sources */, + 96E5E39218BBB48A008E7B30 /* AIAdjustFactory.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9679921918BBAE2800394606 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 96E5E3B118BBB49E008E7B30 /* AILoggerMock.m in Sources */, + 96E5E3BC18BBB98C008E7B30 /* NSData+AIAdditions.m in Sources */, + 96E5E3AF18BBB49E008E7B30 /* AIActivityHandlerMock.m in Sources */, + 96E5E3BD18BBB992008E7B30 /* UIDevice+AIAdditions.m in Sources */, + 96E5E3B318BBB49E008E7B30 /* AIPackageHandlerTests.m in Sources */, + 96E5E3B618BBB49E008E7B30 /* AITestsUtil.m in Sources */, + 96E5E3B018BBB49E008E7B30 /* AIActivityHandlerTests.m in Sources */, + 96E5E3BB18BBB989008E7B30 /* NSString+AIAdditions.m in Sources */, + 96E5E3B818BBB49E008E7B30 /* NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m in Sources */, + 96E5E3B418BBB49E008E7B30 /* AIRequestHandlerMock.m in Sources */, + 96E5E3B518BBB49E008E7B30 /* AIRequestHandlerTests.m in Sources */, + 96E5E3B218BBB49E008E7B30 /* AIPackageHandlerMock.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 9679922418BBAE2800394606 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9679920C18BBAE2800394606 /* Adjust */; + targetProxy = 9679922318BBAE2800394606 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 96E5E3AA18BBB49E008E7B30 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 96E5E3AB18BBB49E008E7B30 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 9679922E18BBAE2800394606 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 9679922F18BBAE2800394606 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 9679923118BBAE2800394606 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = /tmp/Adjust.dst; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "AdjustTests/Adjust-Prefix.pch"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 9679923218BBAE2800394606 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = /tmp/Adjust.dst; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "AdjustTests/Adjust-Prefix.pch"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 9679923418BBAE2800394606 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "AdjustTests/Adjust-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "AdjustTests/AdjustTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 9679923518BBAE2800394606 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "AdjustTests/Adjust-Prefix.pch"; + INFOPLIST_FILE = "AdjustTests/AdjustTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9679920818BBAE2800394606 /* Build configuration list for PBXProject "Adjust" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9679922E18BBAE2800394606 /* Debug */, + 9679922F18BBAE2800394606 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9679923018BBAE2800394606 /* Build configuration list for PBXNativeTarget "Adjust" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9679923118BBAE2800394606 /* Debug */, + 9679923218BBAE2800394606 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9679923318BBAE2800394606 /* Build configuration list for PBXNativeTarget "AdjustTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9679923418BBAE2800394606 /* Debug */, + 9679923518BBAE2800394606 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 9679920518BBAE2800394606 /* Project object */; +} diff --git a/Adjust.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Adjust.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..9c511c0f0 --- /dev/null +++ b/Adjust.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Adjust/AIAdditions/NSData+AIAdditions.m b/Adjust/AIAdditions/NSData+AIAdditions.m index 4cc847fc7..2fd5e9991 100644 --- a/Adjust/AIAdditions/NSData+AIAdditions.m +++ b/Adjust/AIAdditions/NSData+AIAdditions.m @@ -19,7 +19,7 @@ - (NSString *)aiEncodeBase64 { char * strResult; // Get the Raw Data length and ensure we actually have data - int intLength = self.length; + NSUInteger intLength = self.length; if (intLength == 0) return nil; // Setup the String-based Result placeholder and pointer within that placeholder diff --git a/Adjust/AIAdditions/NSString+AIAdditions.m b/Adjust/AIAdditions/NSString+AIAdditions.m index 340af566e..5a32e09af 100644 --- a/Adjust/AIAdditions/NSString+AIAdditions.m +++ b/Adjust/AIAdditions/NSString+AIAdditions.m @@ -30,7 +30,7 @@ - (NSString *)aiQuote { - (NSString *)aiMd5 { const char *cStr = [self UTF8String]; unsigned char digest[16]; - CC_MD5(cStr, strlen(cStr), digest); + CC_MD5(cStr, (CC_LONG)strlen(cStr), digest); NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { @@ -43,7 +43,7 @@ - (NSString *)aiSha1 { const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; - CC_SHA1(data.bytes, data.length, digest); + CC_SHA1(data.bytes, (CC_LONG)data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) { diff --git a/Adjust/AIUtil.m b/Adjust/AIUtil.m index 137f51fc5..4f3f0765e 100644 --- a/Adjust/AIUtil.m +++ b/Adjust/AIUtil.m @@ -90,7 +90,7 @@ + (void)excludeFromBackup:(NSString *)path { } } else { // iOS 5.0 and higher // First try and remove the extended attribute if it is present - int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0); + ssize_t result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0); if (result != -1) { // The attribute exists, we need to remove it int removeResult = removexattr(filePath, attrName, 0); diff --git a/AdjustTests/AIActivityHandlerMock.h b/AdjustTests/AIActivityHandlerMock.h new file mode 100644 index 000000000..4c91c426f --- /dev/null +++ b/AdjustTests/AIActivityHandlerMock.h @@ -0,0 +1,13 @@ +// +// AIActivityHandlerMock.h +// Adjust +// +// Created by Pedro Filipe on 11/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AIActivityHandler.h" + +@interface AIActivityHandlerMock : NSObject + +@end diff --git a/AdjustTests/AIActivityHandlerMock.m b/AdjustTests/AIActivityHandlerMock.m new file mode 100644 index 000000000..082c3a9dd --- /dev/null +++ b/AdjustTests/AIActivityHandlerMock.m @@ -0,0 +1,67 @@ +// +// AIActivityHandlerMock.m +// Adjust +// +// Created by Pedro Filipe on 11/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AIActivityHandlerMock.h" +#import "AILoggerMock.h" +#import "AIAdjustFactory.h" + +static NSString * const prefix = @"AIActivityHandler "; + +@interface AIActivityHandlerMock() + +@property (nonatomic, strong) AILoggerMock *loggerMock; + +@end + +@implementation AIActivityHandlerMock + +@synthesize environment; +@synthesize bufferEvents; +@synthesize trackMacMd5; +@synthesize delegate; + +- (id)initWithAppToken:(NSString *)yourAppToken { + self = [super init]; + if (self == nil) return nil; + + self.loggerMock = (AILoggerMock *) [AIAdjustFactory logger]; + + [self.loggerMock test:[prefix stringByAppendingFormat:@"initWithAppToken yourAppToken:%@", yourAppToken]]; + + return self; +} + +- (void)setSdkPrefix:(NSString *)sdkPrefix { + [self.loggerMock test:[prefix stringByAppendingFormat:@"setSdkPrefix sdkPrefix:%@", sdkPrefix]]; +} + +- (void)trackSubsessionStart { + [self.loggerMock test:[prefix stringByAppendingFormat:@"trackSubsessionStart"]]; +} +- (void)trackSubsessionEnd { + [self.loggerMock test:[prefix stringByAppendingFormat:@"trackSubsessionEnd"]]; +} + +- (void)trackEvent:(NSString *)eventToken + withParameters:(NSDictionary *)parameters { + [self.loggerMock test:[prefix stringByAppendingFormat:@"trackEvent eventToken:%@ parameters:%@", eventToken, parameters]]; +} + +- (void)trackRevenue:(double)amount + forEvent:(NSString *)eventToken + withParameters:(NSDictionary *)parameters { + [self.loggerMock test:[prefix stringByAppendingFormat:@"trackRevenue amount:%f eventToken:%@ parameters:%@", amount, eventToken, parameters]]; +} + +- (void)finishedTrackingWithResponse:(AIResponseData *)response { + [self.loggerMock test:[prefix stringByAppendingFormat:@"finishedTrackingWithResponse response:%@", response]]; +} + + + +@end diff --git a/AdjustTests/AIActivityHandlerTests.m b/AdjustTests/AIActivityHandlerTests.m new file mode 100644 index 000000000..61b402c27 --- /dev/null +++ b/AdjustTests/AIActivityHandlerTests.m @@ -0,0 +1,419 @@ +// +// AIActivityHandlerTests.m +// Adjust +// +// Created by Pedro Filipe on 07/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import +#import "AILoggerMock.h" +#import "AIPackageHandlerMock.h" +#import "AIAdjustFactory.h" +#import "AIActivityHandler.h" +#import "AIActivityPackage.h" +#import "AITestsUtil.h" + +@interface AIActivityHandlerTests : XCTestCase + +@property (atomic,strong) AILoggerMock *loggerMock; +@property (atomic,strong) AIPackageHandlerMock *packageHandlerMock; + +@end + +@implementation AIActivityHandlerTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here; it will be run once, before the first test case. + +} + +- (void)tearDown +{ + [AIAdjustFactory setPackageHandler:nil]; + [AIAdjustFactory setLogger:nil]; + [AIAdjustFactory setSessionInterval:-1]; + [AIAdjustFactory setSubsessionInterval:-1]; + // Put teardown code here; it will be run once, after the last test case. + [super tearDown]; +} + +- (void)reset { + self.loggerMock = [[AILoggerMock alloc] init]; + [AIAdjustFactory setLogger:self.loggerMock]; + + self.packageHandlerMock = [AIPackageHandlerMock alloc]; + [AIAdjustFactory setPackageHandler:self.packageHandlerMock]; + + [AIAdjustFactory setSessionInterval:-1]; + [AIAdjustFactory setSubsessionInterval:-1]; +} + +- (void)testFirstRun +{ + // reseting to make the test order independent + [self reset]; + + // deleting the activity state file to simulate a first session + XCTAssert([AITestsUtil deleteFile:@"AdjustIoActivityState" logger:self.loggerMock], @"%@", self.loggerMock); + + // create handler and start the first session + id activityHandler = [AIAdjustFactory activityHandlerWithAppToken:@"123456789012"]; + + // set the delegate to be called at after sending the package + AITestsUtil * testsUtil = [[AITestsUtil alloc] init]; + [activityHandler setDelegate:testsUtil]; + + // it's necessary to sleep the activity for a while after each handler call + // to let the internal queue act + [NSThread sleepForTimeInterval:10.0]; + + // test that the file did not exist in the first run of the application + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Activity state file not found"], @"%@", self.loggerMock); + + // when a session package is being sent the package handler should resume sending + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler resumeSending"], @"%@", self.loggerMock); + + // if the package was build, it was sent to the Package Handler + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler addPackage"], @"%@", self.loggerMock); + + // checking the default values of the first session package + // should only have one package + XCTAssertEqual((NSUInteger)1, [self.packageHandlerMock.packageQueue count], @"%@", self.loggerMock); + + AIActivityPackage *activityPackage = (AIActivityPackage *) self.packageHandlerMock.packageQueue[0]; + + // check the Sdk version is being tested + XCTAssertEqual(@"ios3.0.0", activityPackage.clientSdk, @"%@", activityPackage.extendedString); + + // packageType should be SESSION_START + XCTAssertEqual(@"/startup", activityPackage.path, @"%@", activityPackage.extendedString); + + NSDictionary *parameters = activityPackage.parameters; + + // sessions attributes + // sessionCount 1, because is the first session + XCTAssertEqual(1, [(NSString *)parameters[@"session_count"] intValue], @"%@", activityPackage.extendedString); + + // subSessionCount -1, because we didn't had any subsessions yet + // because only values > 0 are added to parameters, therefore is not present + XCTAssertNil(parameters[@"subsession_count"], @"%@", activityPackage.extendedString); + + // sessionLenght -1, same as before + XCTAssertNil(parameters[@"session_length"], @"%@", activityPackage.extendedString); + + // timeSpent -1, same as before + XCTAssertNil(parameters[@"time_spent"], @"%@", activityPackage.extendedString); + + // lastInterval -1, same as before + XCTAssertNil(parameters[@"last_interval"], @"%@", activityPackage.extendedString); + + // after adding, the activity handler ping the Package handler to send the package + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler sendFirstPackage"], @"%@", self.loggerMock); + + // check that the package handler calls back with the delegate + //XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AdjustDelegate adjustFinishedTrackingWithResponse"], + // @"%@", self.loggerMock); + + // check that the activity state is written by the first session or timer + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Wrote activity state: "], @"%@", self.loggerMock); + + // ending of first session + XCTAssert([self.loggerMock containsMessage:AILogLevelInfo beginsWith:@"First session"], @"%@", self.loggerMock); +} + +- (void)testSessions { + // reseting to make the test order independent + [self reset]; + + // starting from a clean slate + XCTAssert([AITestsUtil deleteFile:@"AdjustIoActivityState" logger:self.loggerMock], @"%@", self.loggerMock); + + // adjust the intervals for testing + [AIAdjustFactory setSessionInterval:(2)]; // 2 seconds + [AIAdjustFactory setSubsessionInterval:(0.1)]; // 0.1 second + + // create handler to start the session + id activityHandler = [AIAdjustFactory activityHandlerWithAppToken:@"123456789012"]; + + // wait enough to be a new subsession, but not a new session + [NSThread sleepForTimeInterval:1.5]; + [activityHandler trackSubsessionStart]; + + // wait enough to be a new session + [NSThread sleepForTimeInterval:4]; + [activityHandler trackSubsessionStart]; + + // test the subsession end + [activityHandler trackSubsessionEnd]; + [NSThread sleepForTimeInterval:1]; + + // check that a new subsession was created + XCTAssert([self.loggerMock containsMessage:AILogLevelInfo beginsWith:@"Processed Subsession 2 of Session 1"], @"%@", self.loggerMock); + + // check that it's now on the 2nd session + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Session 2"], @"%@", self.loggerMock); + + // check that 2 packages were added to the package handler + XCTAssertEqual((NSUInteger)2, [self.packageHandlerMock.packageQueue count], @"%@", self.loggerMock); + + // get the second session package and its parameters + AIActivityPackage *activityPackage = (AIActivityPackage *) self.packageHandlerMock.packageQueue[1]; + NSDictionary *parameters = activityPackage.parameters; + + // the session and subsession count should be 2 + // session_count + XCTAssertEqual(2, [(NSString *)parameters[@"session_count"] intValue], @"%@", activityPackage.extendedString); + + // subsession_count + XCTAssertEqual(2, [(NSString *)parameters[@"subsession_count"] intValue], @"%@", activityPackage.extendedString); + + // check that the package handler was paused + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler pauseSending"], @"%@", self.loggerMock); +} + +- (void)testEventsBuffered { + // reseting to make the test order independent + [self reset]; + + // starting from a clean slate + XCTAssert([AITestsUtil deleteFile:@"AdjustIoActivityState" logger:self.loggerMock], @"%@", self.loggerMock); + + // create handler to start the session + id activityHandler = [AIAdjustFactory activityHandlerWithAppToken:@"123456789012"]; + [activityHandler setBufferEvents:YES]; + + // construct the parameters of the the event + NSDictionary *eventParameters = @{@"key": @"value", @"foo": @"bar" }; + + // the first is a normal event has parameters, the second a revenue + [activityHandler trackEvent:@"abc123" withParameters:eventParameters]; + [activityHandler trackRevenue:4.45 forEvent:@"abc123" withParameters:eventParameters]; + + [NSThread sleepForTimeInterval:2]; + + // check that event buffering is enabled + //XCTAssert([self.loggerMock containsMessage:AILogLevelInfo beginsWith:@"Event buffering is enabled"], @"%@", self.loggerMock); + + // check that the package builder added the session, event and revenue package + XCTAssertEqual((NSUInteger)3, [self.packageHandlerMock.packageQueue count], @"%@", self.loggerMock); + + // check the first event + AIActivityPackage *eventPackage = (AIActivityPackage *) self.packageHandlerMock.packageQueue[1]; + + // check the event path + XCTAssert([eventPackage.path isEqualToString:@"/event"], @"%@", eventPackage.extendedString); + + // check the event suffix + XCTAssert([eventPackage.suffix isEqualToString:@" 'abc123'"], @"%@", eventPackage.extendedString); + + NSDictionary *eventPackageParameters = eventPackage.parameters; + + // check the event count in the package parameters + XCTAssertEqual(1, [(NSString *)eventPackageParameters[@"event_count"] intValue], @"%@", eventPackage.extendedString); + + // check the event token + XCTAssert([(NSString *)eventPackageParameters[@"event_token"] isEqualToString:@"abc123"], @"%@", eventPackage.extendedString); + + // check the injected parameters + XCTAssert([(NSString *)eventPackageParameters[@"params"] isEqualToString:@"eyJrZXkiOiJ2YWx1ZSIsImZvbyI6ImJhciJ9"], + @"%@", eventPackage.extendedString); + + // check that the event was buffered + XCTAssert([self.loggerMock containsMessage:AILogLevelInfo beginsWith:@"Buffered event 'abc123'"], @"%@", self.loggerMock); + + // check the event count in the written activity state + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Wrote activity state: ec:1"], @"%@", self.loggerMock); + + // check the event count in the logger + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Event 1"], @"%@", self.loggerMock); + + // check the second event/ first revenue + AIActivityPackage *revenuePackage = (AIActivityPackage *) self.packageHandlerMock.packageQueue[2]; + + // check the revenue path + XCTAssert([revenuePackage.path isEqualToString:@"/revenue"], @"%@", revenuePackage.extendedString); + + // check the revenue suffix + // note that the amount was rounded to the decimal cents + XCTAssert([revenuePackage.suffix isEqualToString:@" (4.5 cent, 'abc123')"], @"%@", revenuePackage.extendedString); + + NSDictionary *revenuePackageParameters = revenuePackage.parameters; + + // check the event count in the package parameters + XCTAssertEqual(2, [(NSString *)revenuePackageParameters[@"event_count"] intValue], @"%@", revenuePackage.extendedString); + + // check the amount, transforming cents into rounded decimal cents + // note that the 4.45 cents ~> 45 decimal cents + XCTAssertEqual(45, [(NSString *)revenuePackageParameters[@"amount"] intValue], @"%@", revenuePackage.extendedString); + + // check the event token + XCTAssert([(NSString *)revenuePackageParameters[@"event_token"] isEqualToString:@"abc123"], @"%@", revenuePackage.extendedString); + + // check the injected parameters + XCTAssert([(NSString *)revenuePackageParameters[@"params"] isEqualToString:@"eyJrZXkiOiJ2YWx1ZSIsImZvbyI6ImJhciJ9"], + @"%@", eventPackage.extendedString); + + // check that the revenue was buffered + XCTAssert([self.loggerMock containsMessage:AILogLevelInfo beginsWith:@"Buffered revenue (4.5 cent, 'abc123')"], @"%@", self.loggerMock); + + // check the event count in the written activity state + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Wrote activity state: ec:2"], @"%@", self.loggerMock); + + // check the event count in the logger + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Event 2 (revenue)"], @"%@", self.loggerMock); +} + +- (void)testEventsNotBuffered { + // reseting to make the test order independent + [self reset]; + + // starting from a clean slate + XCTAssert([AITestsUtil deleteFile:@"AdjustIoActivityState" logger:self.loggerMock], @"%@", self.loggerMock); + + // create handler to start the session + id activityHandler = [AIAdjustFactory activityHandlerWithAppToken:@"123456789012"]; + [activityHandler setBufferEvents:NO]; + + // the first is a normal event has parameters, the second a revenue + [activityHandler trackEvent:@"abc123" withParameters:nil]; + [activityHandler trackRevenue:0 forEvent:nil withParameters:nil]; + + [NSThread sleepForTimeInterval:2]; + + // check that the package added the session, event and revenue package + XCTAssertEqual((NSUInteger)3, [self.packageHandlerMock.packageQueue count], @"%@", self.loggerMock); + + // check the first event + AIActivityPackage *eventPackage = (AIActivityPackage *) self.packageHandlerMock.packageQueue[1]; + + // check the event path + XCTAssert([eventPackage.path isEqualToString:@"/event"], @"%@", eventPackage.extendedString); + + // check the event suffix + XCTAssert([eventPackage.suffix isEqualToString:@" 'abc123'"], @"%@", eventPackage.extendedString); + + NSDictionary *eventPackageParameters = eventPackage.parameters; + + // check the event count in the package parameters + XCTAssertEqual(1, [(NSString *)eventPackageParameters[@"event_count"] intValue], @"%@", eventPackage.extendedString); + + // check the event token + XCTAssert([(NSString *)eventPackageParameters[@"event_token"] isEqualToString:@"abc123"], @"%@", eventPackage.extendedString); + + // check the that the parameters were not injected + XCTAssertNil(eventPackageParameters[@"params"], @"%@", eventPackage.extendedString); + + // check that the package handler was called + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler sendFirstPackage"], @"%@", self.loggerMock); + + // check the event count in the written activity state + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Wrote activity state: ec:1"], @"%@", self.loggerMock); + + // check the event count in the logger + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Event 1"], @"%@", self.loggerMock); + + // check the second event/ first revenue + AIActivityPackage *revenuePackage = (AIActivityPackage *) self.packageHandlerMock.packageQueue[2]; + + // check the revenue path + XCTAssert([revenuePackage.path isEqualToString:@"/revenue"], @"%@", revenuePackage.extendedString); + + // check the revenue suffix + // note that the amount was rounded to the decimal cents + XCTAssert([revenuePackage.suffix isEqualToString:@" (0.0 cent)"], @"%@", revenuePackage.extendedString); + + NSDictionary *revenuePackageParameters = revenuePackage.parameters; + + // check the event count in the package parameters + XCTAssertEqual(2, [(NSString *)revenuePackageParameters[@"event_count"] intValue], @"%@", revenuePackage.extendedString); + + // check the amount, transforming cents into rounded decimal cents + // note that the 4.45 cents ~> 45 decimal cents + XCTAssertEqual(0, [(NSString *)revenuePackageParameters[@"amount"] intValue], @"%@", revenuePackage.extendedString); + + // check that the event token is nil + XCTAssertNil(revenuePackageParameters[@"event_token"], @"%@", revenuePackage.extendedString); + + // check the that the parameters were not injected + XCTAssertNil(eventPackageParameters[@"params"], @"%@", eventPackage.extendedString); + + // check that the package handler was called + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler sendFirstPackage"], @"%@", self.loggerMock); + + // check the event count in the written activity state + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Wrote activity state: ec:2"], @"%@", self.loggerMock); + + // check the event count in the logger + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Event 2 (revenue)"], @"%@", self.loggerMock); + +} + +- (void)testChecks { + // reseting to make the test order independent + [self reset]; + + // activity handler without app token + id nilActivityHandler = [AIAdjustFactory activityHandlerWithAppToken:nil]; + + // trigger the nil app token a 2nd time for a subsession start + [nilActivityHandler trackSubsessionStart]; + + // trigger the nil app token a 3rd time for a subsession end + [nilActivityHandler trackSubsessionStart]; + + // trigger the nil app token a 4th time for a event + [nilActivityHandler trackEvent:@"ab123" withParameters:nil]; + + // trigger the nil app token a 5th time for a revenue + [nilActivityHandler trackRevenue:0 forEvent:@"abc123" withParameters:nil]; + + [NSThread sleepForTimeInterval:1]; + // activity with invalid app token + [AIAdjustFactory activityHandlerWithAppToken:@"12345678901"]; + + [NSThread sleepForTimeInterval:1]; + // activity with valid app token + id activityHandler = [AIAdjustFactory activityHandlerWithAppToken:@"123456789012"]; + + // track event with nil token + [activityHandler trackEvent:nil withParameters:nil]; + + // track event with invalid token + [activityHandler trackEvent:@"abc1234" withParameters:nil]; + + // track revenue with invalid amount token + [activityHandler trackRevenue:-0.1 forEvent:nil withParameters:nil]; + + // track revenue with invalid token + [activityHandler trackRevenue:0 forEvent:@"abc12" withParameters:nil]; + + [NSThread sleepForTimeInterval:1]; + + // check missing app token messages + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Missing App Token"], @"%@", self.loggerMock); + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Missing App Token"], @"%@", self.loggerMock); + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Missing App Token"], @"%@", self.loggerMock); + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Missing App Token"], @"%@", self.loggerMock); + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Missing App Token"], @"%@", self.loggerMock); + + // check the invalid app token message + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Malformed App Token '12345678901'"], @"%@", self.loggerMock); + + // check the nil event token + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Missing Event Token"], @"%@", self.loggerMock); + + // check the invalid event token + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Malformed Event Token 'abc1234'"], @"%@", self.loggerMock); + + // check the invalid revenue amount token + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Invalid amount -0.1"], @"%@", self.loggerMock); + + // check the invalid revenue token + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Malformed Event Token 'abc12'"], @"%@", self.loggerMock); + +} + +@end diff --git a/AdjustTests/AILoggerMock.h b/AdjustTests/AILoggerMock.h new file mode 100644 index 000000000..5f454ec95 --- /dev/null +++ b/AdjustTests/AILoggerMock.h @@ -0,0 +1,17 @@ +// +// AILoggerMock.h +// Adjust +// +// Created by Pedro Filipe on 10/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import +#import "AILogger.h" + +static const int AILogLevelTest = 0; + +@interface AILoggerMock : NSObject + - (void)test:(NSString *)message, ...; + - (BOOL) containsMessage:(NSInteger)logLevel beginsWith:(NSString *)beginsWith; +@end diff --git a/AdjustTests/AILoggerMock.m b/AdjustTests/AILoggerMock.m new file mode 100644 index 000000000..7298ce370 --- /dev/null +++ b/AdjustTests/AILoggerMock.m @@ -0,0 +1,116 @@ +// +// AILoggerMock.m +// Adjust +// +// Created by Pedro Filipe on 10/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AILoggerMock.h" + +static NSString * const kLogTag = @"AdjustTests"; + +@interface AILoggerMock() + +@property (nonatomic, strong) NSMutableString *logBuffer; +@property (nonatomic, strong) NSDictionary *logMap; + +@end + +@implementation AILoggerMock + +- (id)init { + self = [super init]; + if (self == nil) return nil; + + self.logBuffer = [[NSMutableString alloc] init]; + self.logMap = @{ + @0 : [NSMutableArray array], + @1 : [NSMutableArray array], + @2 : [NSMutableArray array], + @3 : [NSMutableArray array], + @4 : [NSMutableArray array], + @5 : [NSMutableArray array], + @6 : [NSMutableArray array], + }; + + return self; +} + +- (NSString *)description { + return self.logBuffer; +} + +- (BOOL) containsMessage:(NSInteger)logLevel beginsWith:(NSString *)beginsWith { + NSMutableArray *logArray = (NSMutableArray *)self.logMap[@(logLevel)]; + for (int i = 0; i < [logArray count]; i++) { + NSString *logMessage = logArray[i]; + if ([logMessage hasPrefix:beginsWith]) { + [logArray removeObjectsInRange:NSMakeRange(0, i + 1)]; + NSLog(@"%@ found", beginsWith); + return YES; + } + } + NSLog(@"%@ not in (%@)", beginsWith, [logArray componentsJoinedByString:@","]); + return NO; +} + +- (void)setLogLevel:(AILogLevel)logLevel { + [self test:@"AILogger setLogLevel logLevel:%@", logLevel]; +} + +- (void)test:(NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelTest logPrefix:@"t" format:format parameters:parameters]; +} + + +- (void)verbose:(NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelVerbose logPrefix:@"v" format:format parameters:parameters]; +} + +- (void)debug: (NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelDebug logPrefix:@"d" format:format parameters:parameters]; +} + +- (void)info: (NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelInfo logPrefix:@"i" format:format parameters:parameters]; +} + +- (void)warn: (NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelWarn logPrefix:@"w" format:format parameters:parameters]; +} + +- (void)error: (NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelError logPrefix:@"e" format:format parameters:parameters]; +} + +- (void)assert: (NSString *)format, ... { + va_list parameters; va_start(parameters, format); + [self logLevel:AILogLevelAssert logPrefix:@"a" format:format parameters:parameters]; +} + +// private implementation +- (void)logLevel:(NSInteger)logLevel logPrefix:(NSString *)logPrefix format:(NSString *)format parameters:(va_list)parameters { + NSString *formatedMessage = [[NSString alloc] initWithFormat:format arguments:parameters]; + va_end(parameters); + + NSString *logMessage = [NSString stringWithFormat:@"\t[%@]%@: %@", kLogTag, logPrefix, formatedMessage]; + + [self.logBuffer appendString:logMessage]; + + NSMutableArray *logArray = (NSMutableArray *)self.logMap[@(logLevel)]; + [logArray addObject:formatedMessage]; + + NSArray *lines = [formatedMessage componentsSeparatedByString:@"\n"]; + for (NSString *line in lines) { + NSLog(@"\t[%@]%@: %@", kLogTag, logPrefix, line); + } +} + +@end diff --git a/AdjustTests/AIPackageHandlerMock.h b/AdjustTests/AIPackageHandlerMock.h new file mode 100644 index 000000000..b55bb010b --- /dev/null +++ b/AdjustTests/AIPackageHandlerMock.h @@ -0,0 +1,18 @@ +// +// AIPackageHandlerMock.h +// Adjust +// +// Created by Pedro Filipe on 10/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AIPackageHandler.h" + +@interface AIPackageHandlerMock : NSObject + +@property (nonatomic, strong) NSMutableArray *packageQueue; + +@property (nonatomic, strong) AIResponseData *responseData; +@property (nonatomic, strong) AIActivityPackage * activityPackage; + +@end diff --git a/AdjustTests/AIPackageHandlerMock.m b/AdjustTests/AIPackageHandlerMock.m new file mode 100644 index 000000000..6a21f6b5c --- /dev/null +++ b/AdjustTests/AIPackageHandlerMock.m @@ -0,0 +1,75 @@ +// +// AIPackageHandlerMock.m +// Adjust +// +// Created by Pedro Filipe on 10/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AIPackageHandlerMock.h" +#import "AILoggerMock.h" +#import "AIAdjustFactory.h" +#import "AIActivityHandler.h" +#import "AIResponseData.h" + +static NSString * const prefix = @"AIPackageHandler "; + +@interface AIPackageHandlerMock() + +@property (nonatomic, strong) AILoggerMock *loggerMock; +@property (nonatomic, assign) id activityHandler; + +@end + +@implementation AIPackageHandlerMock + +- (id)init { + return [self initWithActivityHandler:nil]; +} + +- (id)initWithActivityHandler:(id)activityHandler { + self = [super init]; + if (self == nil) return nil; + + self.activityHandler = activityHandler; + + self.loggerMock = (AILoggerMock *) AIAdjustFactory.logger; + self.packageQueue = [NSMutableArray array]; + + [self.loggerMock test:[prefix stringByAppendingString:@"initWithActivityHandler"]]; + + return self; +} + +- (void)addPackage:(AIActivityPackage *)package { + [self.loggerMock test:[prefix stringByAppendingString:@"addPackage"]]; + [self.packageQueue addObject:package]; +} + +- (void)sendFirstPackage { + [self.loggerMock test:[prefix stringByAppendingString:@"sendFirstPackage"]]; + [self.activityHandler finishedTrackingWithResponse:[[AIResponseData alloc] init]]; +} + +- (void)sendNextPackage { + [self.loggerMock test:[prefix stringByAppendingString:@"sendNextPackage"]]; +} + +- (void)closeFirstPackage { + [self.loggerMock test:[prefix stringByAppendingString:@"closeFirstPackage"]]; +} + +- (void)pauseSending { + [self.loggerMock test:[prefix stringByAppendingString:@"pauseSending"]]; +} + +- (void)resumeSending { + [self.loggerMock test:[prefix stringByAppendingString:@"resumeSending"]]; +} + +- (void)finishedTrackingActivity:(AIActivityPackage *)activityPackage withResponse:(AIResponseData *)response { + [self.loggerMock test:[prefix stringByAppendingString:@"finishedTrackingActivity"]]; + self.responseData = response; +} + +@end diff --git a/AdjustTests/AIPackageHandlerTests.m b/AdjustTests/AIPackageHandlerTests.m new file mode 100644 index 000000000..18ccb28f9 --- /dev/null +++ b/AdjustTests/AIPackageHandlerTests.m @@ -0,0 +1,177 @@ +// +// AIPackageHandlerTests.m +// Adjust +// +// Created by Pedro Filipe on 07/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import +#import "AIAdjustFactory.h" +#import "AILoggerMock.h" +#import "AIActivityHandlerMock.h" +#import "AIRequestHandlerMock.h" +#import "AITestsUtil.h" + +@interface AIPackageHandlerTests : XCTestCase + +@property (atomic,strong) AILoggerMock *loggerMock; +@property (atomic,strong) AIRequestHandlerMock *requestHandlerMock; + +@end + +@implementation AIPackageHandlerTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here; it will be run once, before the first test case. +} + +- (void)tearDown +{ + [AIAdjustFactory setRequestHandler:nil]; + [AIAdjustFactory setLogger:nil]; + + // Put teardown code here; it will be run once, after the last test case. + [super tearDown]; +} + +- (void)reset { + self.loggerMock = [[AILoggerMock alloc] init]; + [AIAdjustFactory setLogger:self.loggerMock]; + + self.requestHandlerMock = [AIRequestHandlerMock alloc]; + [AIAdjustFactory setRequestHandler:self.requestHandlerMock]; + +} + +- (void)testFirstPackage +{ + // reseting to make the test order independent + [self reset]; + + // delete previously created Package queue file to make a new queue + XCTAssert([AITestsUtil deleteFile:@"AdjustIoPackageQueue" logger:self.loggerMock], @"%@", self.loggerMock); + + // initialize Package Handler + AIActivityHandlerMock *activityHandler = [[AIActivityHandlerMock alloc] initWithAppToken:@"123456789012"]; + id packageHandler = [AIAdjustFactory packageHandlerForActivityHandler:activityHandler]; + + // enable sending packages to Request Handler + [packageHandler resumeSending]; + + // build and add the first package to the queue + [packageHandler addPackage:[AITestsUtil buildEmptyPackage]]; + + // send the first package in the queue to the mock request handler + [packageHandler sendFirstPackage]; + + // it's necessary to sleep the activity for a while after each handler call + // to let the internal queue act + [NSThread sleepForTimeInterval:1.0]; + + // check that the request handler mock was created + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIRequestHandler initWithPackageHandler"], @"%@", self.loggerMock); + + // test that the file did not exist in the first run of the application + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Package queue file not found"], @"%@", self.loggerMock); + + // check that added first package to a previous empty queue + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Added package 1 "], @"%@", self.loggerMock); + + //TODO add the verbose message + + // it should write the package queue with the first session package + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Package handler wrote 1 packages"], @"%@", self.loggerMock); + + // check that the Request Handler was called to send the package + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIRequestHandler sendPackage"], @"%@", self.loggerMock); + + // check that the the request handler called the package callback, that foward it to the activity handler + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIActivityHandler finishedTrackingWithResponse"], + @"%@", self.loggerMock); + + // check that the package was removed from the queue and 0 packages were written + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Package handler wrote 0 packages"], @"%@", self.loggerMock); +} + +- (void) testPaused { + // reseting to make the test order independent + [self reset]; + + // initialize Package Handler + AIActivityHandlerMock *activityHandler = [[AIActivityHandlerMock alloc] initWithAppToken:@"123456789012"]; + id packageHandler = [AIAdjustFactory packageHandlerForActivityHandler:activityHandler]; + + // disable sending packages to Request Handler + [packageHandler pauseSending]; + + // build and add a package the queue + [packageHandler addPackage:[AITestsUtil buildEmptyPackage]]; + + // try to send the first package in the queue to the mock request handler + [packageHandler sendFirstPackage]; + + [NSThread sleepForTimeInterval:1.0]; + + // check that the request handler mock was created + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIRequestHandler initWithPackageHandler"], @"%@", self.loggerMock); + + // check that a package was added + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Added package "], @"%@", self.loggerMock); + + // check that the mock request handler was NOT called to send the package + XCTAssertFalse([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIRequestHandler sendPackage"], @"%@", self.loggerMock); + + // check that the package handler is paused + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Package handler is paused"], @"%@", self.loggerMock); +} + +- (void) testMultiplePackages { + // reseting to make the test order independent + [self reset]; + + // delete previously created Package queue file to make a new queue + XCTAssert([AITestsUtil deleteFile:@"AdjustIoPackageQueue" logger:self.loggerMock], @"%@", self.loggerMock); + + // initialize Package Handler + AIActivityHandlerMock *activityHandler = [[AIActivityHandlerMock alloc] initWithAppToken:@"123456789012"]; + id packageHandler = [AIAdjustFactory packageHandlerForActivityHandler:activityHandler]; + + // enable sending packages to Request Handler + [packageHandler resumeSending]; + + // build and add the 3 packages to the queue + [packageHandler addPackage:[AITestsUtil buildEmptyPackage]]; + [packageHandler addPackage:[AITestsUtil buildEmptyPackage]]; + [packageHandler addPackage:[AITestsUtil buildEmptyPackage]]; + + // create a new package handler to simulate a new launch + [NSThread sleepForTimeInterval:1.0]; + packageHandler = [AIAdjustFactory packageHandlerForActivityHandler:activityHandler]; + + // try to send two packages without closing the first + [packageHandler sendFirstPackage]; + [packageHandler sendFirstPackage]; + + [NSThread sleepForTimeInterval:1.0]; + + // check that the request handler mock was created + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIRequestHandler initWithPackageHandler"], @"%@", self.loggerMock); + + // test that the file did not exist in the first run of the application + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Package queue file not found"], @"%@", self.loggerMock); + + // check that added the third package to the queue and wrote to a file + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Added package 3 "], @"%@", self.loggerMock); + + // check that it reads the same 3 packages in the file + XCTAssert([self.loggerMock containsMessage:AILogLevelDebug beginsWith:@"Package handler read 3 packages"], @"%@", self.loggerMock); + + // check that the package handler was already sending one package before + XCTAssert([self.loggerMock containsMessage:AILogLevelVerbose beginsWith:@"Package handler is already sending"], @"%@", self.loggerMock); + +} + +@end diff --git a/AdjustTests/AIRequestHandlerMock.h b/AdjustTests/AIRequestHandlerMock.h new file mode 100644 index 000000000..836c23791 --- /dev/null +++ b/AdjustTests/AIRequestHandlerMock.h @@ -0,0 +1,16 @@ +// +// AIRequestHandlerMock.h +// Adjust +// +// Created by Pedro Filipe on 10/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import +#import "AIRequestHandler.h" + +@interface AIRequestHandlerMock : NSObject + +@property (nonatomic, assign) BOOL connectionError; + +@end diff --git a/AdjustTests/AIRequestHandlerMock.m b/AdjustTests/AIRequestHandlerMock.m new file mode 100644 index 000000000..be926adf0 --- /dev/null +++ b/AdjustTests/AIRequestHandlerMock.m @@ -0,0 +1,60 @@ +// +// AIRequestHandlerMock.m +// Adjust +// +// Created by Pedro Filipe on 10/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AIRequestHandlerMock.h" +#import "AILoggerMock.h" +#import "AIAdjustFactory.h" +#import "AIResponseData.h" + +static NSString * const prefix = @"AIRequestHandler "; + +@interface AIRequestHandlerMock() + +@property (nonatomic, assign) id packageHandler; +@property (nonatomic, assign) AILoggerMock *loggerMock; + +@end + +@implementation AIRequestHandlerMock + +- (id)initWithPackageHandler:(id) packageHandler { + self = [super init]; + if (self == nil) return nil; + + self.packageHandler = packageHandler; + self.loggerMock = (AILoggerMock *) [AIAdjustFactory logger]; + + [self.loggerMock test:[prefix stringByAppendingString:@"initWithPackageHandler"]]; + + self.connectionError = NO; + + return self; +} + +- (void)sendPackage:(AIActivityPackage *)activityPackage { + [self.loggerMock test:[prefix stringByAppendingString:@"sendPackage"]]; + + AIResponseData *responseData; + + if (self.connectionError) { + responseData = [[AIResponseData alloc] initWithError:@"connection error"]; + } else { + responseData = [[AIResponseData alloc] initWithJsonString:@"{\"tracker_token\":\"token\",\"tracker_name\":\"name\"}"]; + } + + [self.packageHandler finishedTrackingActivity:activityPackage withResponse:responseData]; + + if (self.connectionError) { + [self.packageHandler closeFirstPackage]; + } else { + [self.packageHandler sendNextPackage]; + } +} + + +@end diff --git a/AdjustTests/AIRequestHandlerTests.m b/AdjustTests/AIRequestHandlerTests.m new file mode 100644 index 000000000..935fefa69 --- /dev/null +++ b/AdjustTests/AIRequestHandlerTests.m @@ -0,0 +1,159 @@ +// +// AIRequestHandlerTests.m +// Adjust +// +// Created by Pedro Filipe on 07/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import +#import "AIAdjustFactory.h" +#import "AILoggerMock.h" +#import "NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h" +#import "AIPackageHandlerMock.h" +#import "AIRequestHandlerMock.h" +#import "AITestsUtil.h" +#import "AIResponseData.h" + +@interface AIRequestHandlerTests : XCTestCase + +@property (atomic,strong) AILoggerMock *loggerMock; +@property (atomic,strong) AIPackageHandlerMock *packageHandlerMock; +@property (atomic,strong) id requestHandler; + + +@end + +@implementation AIRequestHandlerTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here; it will be run once, before the first test case. + + [self reset]; + +} + +- (void)tearDown +{ + [AIAdjustFactory setLogger:nil]; + + // Put teardown code here; it will be run once, after the last test case. + [super tearDown]; +} + +- (void)reset { + self.loggerMock = [[AILoggerMock alloc] init]; + [AIAdjustFactory setLogger:self.loggerMock]; + + self.packageHandlerMock = [[AIPackageHandlerMock alloc] init]; + self.requestHandler =[AIAdjustFactory requestHandlerForPackageHandler:self.packageHandlerMock]; +} + +- (void)testSendPackage +{ + // reseting to make the test order independent + [self reset]; + + // set the connection to respond OK + [NSURLConnection setConnectionError:NO]; + [NSURLConnection setResponseError:NO]; + + [self.requestHandler sendPackage:[AITestsUtil buildEmptyPackage]]; + + [NSThread sleepForTimeInterval:1.0]; + + NSLog(@"%@", self.loggerMock); + + // check the URL Connection was called + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"NSURLConnection sendSynchronousRequest"], + @"%@", self.loggerMock); + + // check that the package handler was pinged after sending + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler finishedTrackingActivity"], + @"%@", self.loggerMock); + + // check the response data, the kind is unknown because is set by the package handler + NSString *sresponseData= [NSString stringWithFormat:@"%@", self.packageHandlerMock.responseData]; + XCTAssert([sresponseData isEqualToString:@"[kind:unknown success:1 willRetry:0 error:(null) trackerToken:token trackerName:name]"], + @"%@", sresponseData); + + // check that the package was successfully sent + XCTAssert([self.loggerMock containsMessage:AILogLevelInfo beginsWith:@"Tracked session"], + @"%@", self.loggerMock); + + // check that the package handler was called to send the next package + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler sendNextPackage"], + @"%@", self.loggerMock); + +} + +- (void)testConnectionError { + // reseting to make the test order independent + [self reset]; + + // set the connection to return error on the connection + [NSURLConnection setConnectionError:YES]; + [NSURLConnection setResponseError:NO]; + + [self.requestHandler sendPackage:[AITestsUtil buildEmptyPackage]]; + [NSThread sleepForTimeInterval:1.0]; + + // check the URL Connection was called + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"NSURLConnection sendSynchronousRequest"], + @"%@", self.loggerMock); + + // check that the package handler was pinged after sending + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler finishedTrackingActivity"], + @"%@", self.loggerMock); + + // check the response data, + NSString *sresponseData= [NSString stringWithFormat:@"%@", self.packageHandlerMock.responseData]; + XCTAssert([sresponseData isEqualToString:@"[kind:unknown success:0 willRetry:1 error:'connection error' trackerToken:(null) trackerName:(null)]"], @"%@", sresponseData); + + // check that the package was successfully sent + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Failed to track session. (connection error) Will retry later."], + @"%@", self.loggerMock); + + // check that the package handler was called to close the package to retry later + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler closeFirstPackage"], + @"%@", self.loggerMock); + +} + +- (void)testResponseError { + // reseting to make the test order independent + [self reset]; + + // set the response to return an error + [NSURLConnection setConnectionError:NO]; + [NSURLConnection setResponseError:YES]; + + [self.requestHandler sendPackage:[AITestsUtil buildEmptyPackage]]; + [NSThread sleepForTimeInterval:1.0]; + + // check the URL Connection was called + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"NSURLConnection sendSynchronousRequest"], + @"%@", self.loggerMock); + + // check that the package handler was pinged after sending + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler finishedTrackingActivity"], + @"%@", self.loggerMock); + + // check the response data, + NSString *sresponseData= [NSString stringWithFormat:@"%@", self.packageHandlerMock.responseData]; + XCTAssert([sresponseData isEqualToString:@"[kind:unknown success:0 willRetry:0 error:'response error' trackerToken:token trackerName:name]"], @"%@", sresponseData); + + // check that the package was successfully sent + XCTAssert([self.loggerMock containsMessage:AILogLevelError beginsWith:@"Failed to track session. (response error)"], + @"%@", sresponseData); + + // check that the package handler was called to send the next package + XCTAssert([self.loggerMock containsMessage:AILogLevelTest beginsWith:@"AIPackageHandler sendNextPackage"], + @"%@", self.loggerMock); + +} + + +@end diff --git a/AdjustTests/AITestsUtil.h b/AdjustTests/AITestsUtil.h new file mode 100644 index 000000000..0f5a0f48e --- /dev/null +++ b/AdjustTests/AITestsUtil.h @@ -0,0 +1,22 @@ +// +// AITestsUtil.h +// Adjust +// +// Created by Pedro Filipe on 12/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import +#import "AILoggerMock.h" +#import "AIActivityPackage.h" +#import "Adjust.h" + +@interface AITestsUtil : NSObject + ++ (NSString *)getFilename:(NSString *)filename; ++ (BOOL)deleteFile:(NSString *)filename logger:(AILoggerMock *)loggerMock; ++ (AIActivityPackage *)buildEmptyPackage; + +- (void)adjustFinishedTrackingWithResponse:(AIResponseData *)responseData; + +@end diff --git a/AdjustTests/AITestsUtil.m b/AdjustTests/AITestsUtil.m new file mode 100644 index 000000000..297a47c8b --- /dev/null +++ b/AdjustTests/AITestsUtil.m @@ -0,0 +1,57 @@ +// +// AITestsUtil.m +// Adjust +// +// Created by Pedro Filipe on 12/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import "AITestsUtil.h" +#import "AIPackageBuilder.h" +#import "AILoggerMock.h" +#import "AIAdjustFactory.h" + +@implementation AITestsUtil + ++ (NSString *)getFilename:(NSString *)filename { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *path = [paths objectAtIndex:0]; + NSString *filepath = [path stringByAppendingPathComponent:filename]; + return filepath; +} + ++ (BOOL)deleteFile:(NSString *)filename logger:(AILoggerMock *)loggerMock { + NSString *filepath = [AITestsUtil getFilename:filename]; + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error = nil; + BOOL exists = [fileManager fileExistsAtPath:filepath]; + if (!exists) { + [loggerMock test:@"file %@ does not exist at path %@", filename, filepath]; + return YES; + } + BOOL deleted = [fileManager removeItemAtPath:filepath error:&error]; + + if (!deleted) { + [loggerMock test:@"unable to delete file %@ at path %@", filename, filepath]; + } + + if (error) { + [loggerMock test:@"error (%@) deleting file %@", [error localizedDescription], filename]; + } + + return deleted; +} + ++ (AIActivityPackage *)buildEmptyPackage { + AIPackageBuilder *sessionBuilder = [[AIPackageBuilder alloc] init]; + AIActivityPackage *sessionPackage = [sessionBuilder buildSessionPackage]; + return sessionPackage; +} + +- (void)adjustFinishedTrackingWithResponse:(AIResponseData *)responseData { + AILoggerMock *loggerMock = (AILoggerMock *)AIAdjustFactory.logger; + + [loggerMock test:@"AdjustDelegate adjustFinishedTrackingWithResponse"]; +} + +@end diff --git a/AdjustTests/Adjust-Prefix.pch b/AdjustTests/Adjust-Prefix.pch new file mode 100644 index 000000000..eb2007ecd --- /dev/null +++ b/AdjustTests/Adjust-Prefix.pch @@ -0,0 +1,9 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/AdjustTests/AdjustTests-Info.plist b/AdjustTests/AdjustTests-Info.plist new file mode 100644 index 000000000..654db09eb --- /dev/null +++ b/AdjustTests/AdjustTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + adeven.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/AdjustTests/NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h b/AdjustTests/NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h new file mode 100644 index 000000000..cfe3d4024 --- /dev/null +++ b/AdjustTests/NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h @@ -0,0 +1,18 @@ +// +// NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h +// Adjust +// +// Created by Pedro Filipe on 12/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// + +#import + +@interface NSURLConnection(NSURLConnectionSynchronousLoadingMock) + ++ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error; + ++ (void)setConnectionError:(BOOL)connection; ++ (void)setResponseError:(BOOL)response; + +@end diff --git a/AdjustTests/NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m b/AdjustTests/NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m new file mode 100644 index 000000000..440e19216 --- /dev/null +++ b/AdjustTests/NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m @@ -0,0 +1,57 @@ +// +// NSURLConnection+NSURLConnectionSynchronousLoadingMocking.m +// Adjust +// +// Created by Pedro Filipe on 12/02/14. +// Copyright (c) 2014 adeven. All rights reserved. +// +#import "NSURLConnection+NSURLConnectionSynchronousLoadingMocking.h" +#import "AIAdjustFactory.h" +#import "AILoggerMock.h" + +static BOOL triggerConnectionError = NO; +static BOOL triggerResponseError = NO; + +@implementation NSURLConnection(NSURLConnectionSynchronousLoadingMock) + ++ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error { + AILoggerMock *loggerMock =(AILoggerMock *)AIAdjustFactory.logger; + [loggerMock test:@"NSURLConnection sendSynchronousRequest"]; + + if (triggerConnectionError) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"connection error", nil) }; + (*error) = [NSError errorWithDomain:@"Adjust" + code:-57 + userInfo:userInfo]; + return nil; + } + NSInteger statusCode; + NSString * sResponseBase64; + if (triggerResponseError) { + statusCode = 0; + // encoded from "{"error":"response error","tracker_token":"token","tracker_name":"name"}" + sResponseBase64 = @"eyJlcnJvciI6InJlc3BvbnNlIGVycm9yIiwidHJhY2tlcl90b2tlbiI6InRva2VuIiwidHJhY2tlcl9uYW1lIjoibmFtZSJ9"; + } else { + statusCode = 200; + // encoded from "{"tracker_token":"token","tracker_name":"name"}" + sResponseBase64 = @"eyJ0cmFja2VyX3Rva2VuIjoidG9rZW4iLCJ0cmFja2VyX25hbWUiOiJuYW1lIn0="; + } + // build response + (*response) = [[NSHTTPURLResponse alloc] initWithURL:[[NSURL alloc] init] statusCode:statusCode HTTPVersion:@"" headerFields:nil]; + + NSData *responseData = [[NSData alloc] + initWithBase64EncodedString:sResponseBase64 + options:NSDataBase64DecodingIgnoreUnknownCharacters]; + + return responseData; +} + ++ (void)setConnectionError:(BOOL)connection { + triggerConnectionError = connection; +} + ++ (void)setResponseError:(BOOL)response { + triggerResponseError = response; +} + +@end diff --git a/AdjustTests/en.lproj/InfoPlist.strings b/AdjustTests/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/AdjustTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ +