From aaf9d32bc298ae5d4e0b9d6113c0c865f36c83f0 Mon Sep 17 00:00:00 2001 From: Nan Date: Wed, 8 Mar 2023 12:36:23 -0800 Subject: [PATCH 1/9] [cleanup] remove unused methods from OneSignalClient Looks like these methods are no longer used within the SDK, so let's remove them from OneSignalClient: - executeSimultaneousRequests - executeSynchronousRequest - executeDataRequest Update OneSignalClient.h And types: - OSDataRequestSuccessBlock - OSMultipleCompletionBlock - OSMultipleFailureBlock - OSMultipleSuccessBlock - genericTimedOutError --- .../Source/API/OneSignalClient.h | 43 ----- .../Source/API/OneSignalClient.m | 180 ------------------ 2 files changed, 223 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h index 46f466add..6ac351479 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h @@ -31,52 +31,9 @@ #ifndef OneSignalClient_h #define OneSignalClient_h -typedef void (^OSDataRequestSuccessBlock)(NSData *data); - -typedef void (^OSMultipleCompletionBlock)(NSDictionary *responses); -typedef void (^OSMultipleFailureBlock)(NSDictionary *errors); -typedef void (^OSMultipleSuccessBlock)(NSDictionary *results); - @interface OneSignalClient : NSObject + (OneSignalClient *)sharedClient; - (void)executeRequest:(OneSignalRequest *)request onSuccess:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock; -- (void)executeSynchronousRequest:(OneSignalRequest *)request onSuccess:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock; - -// ie. for loading HTML or other non-JSON based requests -- (void)executeDataRequest:(OneSignalRequest *)request onSuccess:(OSDataRequestSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock; - -// Executes multiple OneSignalRequest's simultaneously, needs a unique identifier for each request -- (void)executeSimultaneousRequests:(NSDictionary *)requests withSuccess:(OSMultipleSuccessBlock)successBlock onFailure:(OSMultipleFailureBlock)failureBlock; - -/* - TODO: We want to eventually migrate over to using this method for executing simultaneous requests: - This allows us to combine multiple async concurrent requests to return from a single callback with the proper formatted responses from each reuqest (successful or not, account for params returning from GETs). - A generalized format should be followed and we should make sure not to break form that as it could break peoples apps in the future if we add params and remove params from this callback. - Currently for the only implementation this is used for "setExternalUserId:withCOmpletion:" the format is as follows: - - NSDictionary response = @{ - (required) @"push" : { - @"success" : @(true) or @(false) - }, - - (optional) @"email" : { - @"success" : @(true) or @(false) - } - } - - - Building off of this format now will require: - - 1. Including other attributes and whether they are required or not - ex. @"push" is always going to be within the callback resposne (required), meanwhile, - @"email" will not always exist in the callback resposne (optoinal) - - 2. Can't remove params that are required as an app may be expecting them and removing/modifying a key could break there app with an SDK upgrade - - 3. Add more requirements... - - */ -- (void)executeSimultaneousRequests:(NSDictionary *)requests withCompletion:(OSMultipleCompletionBlock)completionBlock; @end #endif diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.m b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.m index 9c38f0c7f..0c83011dc 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.m +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.m @@ -73,117 +73,6 @@ - (NSError *)privacyConsentErrorWithRequestType:(NSString *)type { return [NSError errorWithDomain:@"OneSignal Error" code:0 userInfo:@{@"error" : [NSString stringWithFormat: @"Attempted to perform an HTTP request (%@) before the user provided privacy consent.", type]}]; } -- (NSError *)genericTimedOutError { - return [NSError errorWithDomain:@"OneSignal Error" code:0 userInfo:@{@"error" : @"The request timed out"}]; -} - -- (void)executeSimultaneousRequests:(NSDictionary *)requests withCompletion:(OSMultipleCompletionBlock)completionBlock { - if (requests.allKeys.count == 0) - return; - - // Execute on a background thread or the semaphore will block the caller thread - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - dispatch_group_t group = dispatch_group_create(); - - __block NSMutableDictionary *errors = [NSMutableDictionary new]; - __block NSMutableDictionary *results = [NSMutableDictionary new]; - - // Used as the reasposne for the completion callback - __block NSMutableDictionary *response = [NSMutableDictionary new]; - - for (NSString *identifier in requests.allKeys) { - OneSignalRequest *request = requests[identifier]; - - // Use a dispatch_group instead of a semaphore, in case the failureBlock gets called synchronously - // This will prevent the SDK from waiting/blocking on a request that instantly failed - dispatch_group_enter(group); - [self executeRequest:request onSuccess:^(NSDictionary *result) { - results[identifier] = result; - // Add a success as 1 (success) to the response - response[identifier] = @{ @"success" : @(true) }; - [OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"Request %@ success result %@", request, result]]; - dispatch_group_leave(group); - } onFailure:^(NSError *error) { - errors[identifier] = error; - // Add a success as 0 (failed) to the response - response[identifier] = @{ @"success" : @(false) }; - [OneSignalLog onesignalLog:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"Request %@ fail result error %@", request, error]]; - - dispatch_group_leave(group); - }]; - } - - // Will wait for up to (maxTimeout) seconds and will then give up and call - // the failure block if the request times out. - BOOL timedOut = (bool)(0 != dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, MAX_TIMEOUT))); - - // Add a generic 'timed out' error if the request timed out - // and there are no other errors present. - if (timedOut && errors.allKeys.count == 0) { - for (NSString *key in requests.allKeys) { - errors[key] = [self genericTimedOutError]; - // Add a success as 0 (timeout/failed) to the response - response[key] = @{ @"success" : @(false) }; - } - } - - // Requests should all be completed at this point, the response NSDictionary will be passed back - dispatch_async(dispatch_get_main_queue(), ^{ - if (completionBlock) - completionBlock(response); - }); - }); -} - -- (void)executeSimultaneousRequests:(NSDictionary *)requests withSuccess:(OSMultipleSuccessBlock)successBlock onFailure:(OSMultipleFailureBlock)failureBlock { - if (requests.allKeys.count == 0) - return; - - //execute on a background thread or the semaphore will block the caller thread - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - dispatch_group_t group = dispatch_group_create(); - - __block NSMutableDictionary *errors = [NSMutableDictionary new]; - __block NSMutableDictionary *results = [NSMutableDictionary new]; - - for (NSString *identifier in requests.allKeys) { - OneSignalRequest *request = requests[identifier]; - - //use a dispatch_group instead of a semaphore, in case the failureBlock gets called synchronously - //this will prevent the SDK from waiting/blocking on a request that instantly failed - dispatch_group_enter(group); - [self executeRequest:request onSuccess:^(NSDictionary *result) { - results[identifier] = result; - [OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"Request %@ success result %@", request, result]]; - dispatch_group_leave(group); - } onFailure:^(NSError *error) { - errors[identifier] = error; - [OneSignalLog onesignalLog:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"Request %@ fail result error %@", request, error]]; - dispatch_group_leave(group); - }]; - } - - // Will wait for up to (maxTimeout) seconds and will then give up and call - // the failure block if the request times out. - BOOL timedOut = (bool)(0 != dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, MAX_TIMEOUT))); - - // add a generic 'timed out' error if the request timed out - // and there are no other errors present. - if (timedOut && errors.allKeys.count == 0) - for (NSString *key in requests.allKeys) - errors[key] = [self genericTimedOutError]; - - //requests should all be completed at this point - dispatch_async(dispatch_get_main_queue(), ^{ - if (errors.allKeys.count > 0 && failureBlock) { - failureBlock(errors); - } else if (errors.allKeys.count == 0 && successBlock) { - successBlock(results); - } - }); - }); -} - - (void)executeRequest:(OneSignalRequest *)request onSuccess:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock { // If privacy consent is required but not yet given, any non-GET request should be blocked. if (request.method != GET && [OSPrivacyConsentController shouldLogMissingPrivacyConsentErrorWithMethodName:nil]) { @@ -223,75 +112,6 @@ - (void)executeRequest:(OneSignalRequest *)request onSuccess:(OSResultSuccessBlo [task resume]; } -// while this method still uses completion blocks like the asynchronous method, -// it pauses execution of the thread until the request is finished -- (void)executeSynchronousRequest:(OneSignalRequest *)request onSuccess:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock { - if (![self validRequest:request]) { - [self handleMissingAppIdError:failureBlock withRequest:request]; - return; - } - - if (request.dataRequest) { - if (failureBlock) { - failureBlock([NSError errorWithDomain:@"onesignal" code:0 userInfo:@{@"error" : [NSString stringWithFormat:@"Attempted to execute a data-only API request (%@) using OneSignalClient's executeRequest: method, which only accepts JSON-based API requests", NSStringFromClass(request.class)]}]); - } - - return; - } - - __block NSURLResponse *httpResponse; - __block NSError *httpError; - - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - - NSURLSessionDataTask *dataTask = [self.sharedSession dataTaskWithRequest:request.urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { - httpResponse = response; - httpError = error; - - dispatch_semaphore_signal(semaphore); - }]; - - [dataTask resume]; - - dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, REQUEST_TIMEOUT_RESOURCE * NSEC_PER_SEC)); - - [self handleJSONNSURLResponse:httpResponse data:nil error:httpError isAsync:false withRequest:request onSuccess:successBlock onFailure:failureBlock]; -} - -- (void)executeDataRequest:(OneSignalRequest *)request onSuccess:(OSDataRequestSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock { - [self prettyPrintDebugStatementWithRequest:request]; - - if (!request.dataRequest) { - if (failureBlock) { - failureBlock([NSError errorWithDomain:@"onesignal" code:0 userInfo:@{@"error" : [NSString stringWithFormat:@"Attempted to execute an API request (%@) using OneSignalClient's executeDataRequest: method, which only accepts data based requests", NSStringFromClass(request.class)]}]); - } - - return; - } - - NSURLSession *session = request.disableLocalCaching ? self.noCacheSession : self.sharedSession; - - NSURLSessionDataTask *task = [session dataTaskWithRequest:request.urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { - NSError *requestError = error; - int status = (int)((NSHTTPURLResponse *)response).statusCode; - - if (requestError || status >= 300) { - if (!requestError) - requestError = [NSError errorWithDomain:@"onesignal" code:0 userInfo:@{@"error" : [NSString stringWithFormat:@"Request (%@)encountered an unknown error with HTTP status code %i", NSStringFromClass([request class]), status]}]; - - if (failureBlock) - failureBlock(requestError); - - return; - } - - if (successBlock) - successBlock(data); - }]; - - [task resume]; -} - - (void)handleMissingAppIdError:(OSFailureBlock)failureBlock withRequest:(OneSignalRequest *)request { NSString *errorDescription = [NSString stringWithFormat:@"HTTP Request (%@) must contain app_id parameter", NSStringFromClass([request class])]; From f25e9bf88642381ba52fef1b77a1b1312f21ae31 Mon Sep 17 00:00:00 2001 From: Nan Date: Wed, 7 Feb 2024 19:55:48 -0800 Subject: [PATCH 2/9] Make `OneSignalCore` class to hold module's services - Make a OneSignalCore class through which the services of this module can be set and accessed - To start, make a protocol for OneSignalClient, IOneSignalClient (name of protocol TBD) --- .../OneSignal.xcodeproj/project.pbxproj | 4 ++ .../Source/API/OneSignalClient.h | 7 ++- .../OneSignalCore/Source/OneSignalCore.h | 8 ++++ .../OneSignalCore/Source/OneSignalCore.m | 46 +++++++++++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.m diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index f0855fed5..1c2c769db 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -108,6 +108,7 @@ 3C9AD6DF2B22A8EC00BC1540 /* OneSignalNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEF784292912DEB600A1F3A5 /* OneSignalNotifications.framework */; }; 3C9AD6E02B22A8EC00BC1540 /* OneSignalNotifications.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEF784292912DEB600A1F3A5 /* OneSignalNotifications.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3CA6CE0A28E4F19B00CA0585 /* OSUserRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA6CE0928E4F19B00CA0585 /* OSUserRequest.swift */; }; + 3CC063942B6D6B6B002BB07F /* OneSignalCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063932B6D6B6B002BB07F /* OneSignalCore.m */; }; 3CC9A6342AFA1FDE008F68FD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3CC9A6332AFA1FDD008F68FD /* PrivacyInfo.xcprivacy */; }; 3CC9A6362AFA26E7008F68FD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3CC9A6352AFA26E7008F68FD /* PrivacyInfo.xcprivacy */; }; 3CCF44BE299B17290021964D /* OneSignalWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CCF44BC299B17290021964D /* OneSignalWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -816,6 +817,7 @@ 3C9AD6D02B228B9200BC1540 /* OSRequestRemoveAlias.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSRequestRemoveAlias.swift; sourceTree = ""; }; 3C9AD6D22B228BB000BC1540 /* OSRequestUpdateProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSRequestUpdateProperties.swift; sourceTree = ""; }; 3CA6CE0928E4F19B00CA0585 /* OSUserRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSUserRequest.swift; sourceTree = ""; }; + 3CC063932B6D6B6B002BB07F /* OneSignalCore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalCore.m; sourceTree = ""; }; 3CC9A6332AFA1FDD008F68FD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 3CC9A6352AFA26E7008F68FD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 3CCF44BC299B17290021964D /* OneSignalWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalWrapper.h; sourceTree = ""; }; @@ -1745,6 +1747,7 @@ isa = PBXGroup; children = ( DE7D17E827026B95002D3A5D /* OneSignalCore.h */, + 3CC063932B6D6B6B002BB07F /* OneSignalCore.m */, DEF7848E2914798400A1F3A5 /* Swizzling */, DEF7845A2912E89200A1F3A5 /* OSObservable.h */, DEF7845B2912E89200A1F3A5 /* OSObservable.m */, @@ -3091,6 +3094,7 @@ DE7D182E270275FA002D3A5D /* OneSignalTrackFirebaseAnalytics.m in Sources */, DE51DDE5294262AB0073D5C4 /* OSRemoteParamController.m in Sources */, DE7D182827026F86002D3A5D /* OneSignalUserDefaults.m in Sources */, + 3CC063942B6D6B6B002BB07F /* OneSignalCore.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h index 6ac351479..7982f5143 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClient.h @@ -31,9 +31,12 @@ #ifndef OneSignalClient_h #define OneSignalClient_h -@interface OneSignalClient : NSObject -+ (OneSignalClient *)sharedClient; +@protocol IOneSignalClient - (void)executeRequest:(OneSignalRequest *)request onSuccess:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock; @end +@interface OneSignalClient : NSObject ++ (OneSignalClient *)sharedClient; +@end + #endif diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.h b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.h index 966ea8fdc..add969551 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.h +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.h @@ -56,3 +56,11 @@ #import #import #import + +// TODO: Testing: Should this class be defined in this file? +@interface OneSignalCore : NSObject + ++ (void)setSharedClient:(nonnull id)client; ++ (nonnull id)sharedClient; + +@end diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.m b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.m new file mode 100644 index 000000000..cc9f5f81c --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCore.m @@ -0,0 +1,46 @@ +/** + * Modified MIT License + * + * Copyright 2024 OneSignal + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * 1. The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * 2. All copies of substantial portions of the Software may only be used in connection + * with services provided by OneSignal. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#import +#import "OneSignalCore.h" + +@implementation OneSignalCore + +static id _sharedClient; ++ (id)sharedClient { + if (!_sharedClient) { + // If tests didn't set their own client, we will default to this + return OneSignalClient.sharedClient; + } + return _sharedClient; +} + ++ (void)setSharedClient:(id)client { + _sharedClient = client; +} + +@end From a7e495821f913a8d9ee28029be327eedbdfbeca3 Mon Sep 17 00:00:00 2001 From: Nan Date: Wed, 7 Feb 2024 20:11:48 -0800 Subject: [PATCH 3/9] Access the shared client via OneSignalCore - Change all `OneSignalClient.sharedClient` calls to `OneSignalCore.sharedClient` --- .../OneSignalReceiveReceiptsController.m | 2 +- .../Controller/OSInAppMessageController.m | 4 ++-- .../Controller/OSMessagingController.m | 8 ++++---- .../OneSignalNotifications/OSNotificationsManager.m | 2 +- .../Controller/V1/OSOutcomeEventsV1Repository.m | 2 +- .../Controller/V2/OSOutcomeEventsV2Repository.m | 2 +- .../OutcomeEvents/OneSignalOutcomeEventsController.m | 2 +- .../Source/Executors/OSIdentityOperationExecutor.swift | 4 ++-- .../Source/Executors/OSPropertyOperationExecutor.swift | 4 ++-- .../Executors/OSSubscriptionOperationExecutor.swift | 6 +++--- .../Source/Executors/OSUserExecutor.swift | 10 +++++----- iOS_SDK/OneSignalSDK/Source/OneSignal.m | 2 +- .../Source/OneSignalLiveActivityController.m | 8 ++++---- iOS_SDK/OneSignalSDK/UnitTests/EmailTests.m | 2 +- .../UnitTests/Shadows/OneSignalClientOverrider.m | 2 +- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalExtension/OneSignalReceiveReceiptsController.m b/iOS_SDK/OneSignalSDK/OneSignalExtension/OneSignalReceiveReceiptsController.m index f3ab87765..1dcf605c7 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalExtension/OneSignalReceiveReceiptsController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalExtension/OneSignalReceiveReceiptsController.m @@ -97,7 +97,7 @@ - (void)sendReceiveReceiptWithPlayerId:(nonnull NSString *)playerId dispatch_time_t dispatchTime = dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC); dispatch_after(dispatchTime, dispatch_get_main_queue(), ^{ [OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"OneSignal sendReceiveReceiptWithPlayerId now sending confirmed delievery after: %i second delay", delay]]; - [OneSignalClient.sharedClient executeRequest:request onSuccess:^(NSDictionary *result) { + [OneSignalCore.sharedClient executeRequest:request onSuccess:^(NSDictionary *result) { if (success) { success(result); } diff --git a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSInAppMessageController.m b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSInAppMessageController.m index 5aa037244..7e378232f 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSInAppMessageController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSInAppMessageController.m @@ -46,13 +46,13 @@ - (void)loadMessageHTMLContentWithResult:(OSResultSuccessBlock _Nullable)success let request = [OSRequestLoadInAppMessageContent withAppId:[OneSignalConfigManager getAppId] withMessageId:self.messageId withVariantId:variantId]; - [OneSignalClient.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; + [OneSignalCore.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; } - (void)loadPreviewMessageHTMLContentWithUUID:(NSString * _Nonnull)previewUUID success:(OSResultSuccessBlock _Nullable)successBlock failure:(OSFailureBlock _Nullable)failureBlock { let request = [OSRequestLoadInAppMessagePreviewContent withAppId:[OneSignalConfigManager getAppId] previewUUID:previewUUID]; - [OneSignalClient.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; + [OneSignalCore.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; } /** diff --git a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m index e34764df3..1a8b299cf 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m @@ -245,7 +245,7 @@ - (void)getInAppMessagesFromServer:(NSString *)subscriptionId { } OSRequestGetInAppMessages *request = [OSRequestGetInAppMessages withSubscriptionId:subscriptionId]; - [OneSignalClient.sharedClient executeRequest:request onSuccess:^(NSDictionary *result) { + [OneSignalCore.sharedClient executeRequest:request onSuccess:^(NSDictionary *result) { dispatch_async(dispatch_get_main_queue(), ^{ [OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:@"getInAppMessagesFromServer success"]; if (result[@"in_app_messages"]) { // when there are no IAMs, will this still be there? @@ -510,7 +510,7 @@ - (void)messageViewPageImpressionRequest:(OSInAppMessageInternal *)message withP withPageId:pageId forVariantId:message.variantId]; - [OneSignalClient.sharedClient executeRequest:metricsRequest + [OneSignalCore.sharedClient executeRequest:metricsRequest onSuccess:^(NSDictionary *result) { NSString *successMessage = [NSString stringWithFormat:@"In App Message with message id: %@ and page id: %@, successful POST page impression update with result: %@", message.messageId, pageId, result]; [OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:successMessage]; @@ -549,7 +549,7 @@ - (void)messageViewImpressionRequest:(OSInAppMessageInternal *)message { withMessageId:message.messageId forVariantId:message.variantId]; - [OneSignalClient.sharedClient executeRequest:metricsRequest + [OneSignalCore.sharedClient executeRequest:metricsRequest onSuccess:^(NSDictionary *result) { NSString *successMessage = [NSString stringWithFormat:@"In App Message with id: %@, successful POST impression update with result: %@", message.messageId, result]; [OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:successMessage]; @@ -951,7 +951,7 @@ - (void)sendClickRESTCall:(OSInAppMessageInternal *)message withAction:(OSInAppM forVariantId:message.variantId withAction:action]; - [OneSignalClient.sharedClient executeRequest:metricsRequest + [OneSignalCore.sharedClient executeRequest:metricsRequest onSuccess:^(NSDictionary *result) { NSString *successMessage = [NSString stringWithFormat:@"In App Message with id: %@, successful POST click update for click id: %@, with result: %@", message.messageId, action.clickId, result]; [OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:successMessage]; diff --git a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m index 9a2ee252e..8bd1e4ae3 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m +++ b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m @@ -716,7 +716,7 @@ + (void)submitNotificationOpened:(NSString*)messageId { NSString* lastMessageId = [standardUserDefaults getSavedStringForKey:OSUD_LAST_MESSAGE_OPENED defaultValue:nil]; //Only submit request if messageId not nil and: (lastMessage is nil or not equal to current one) if(messageId && (!lastMessageId || ![lastMessageId isEqualToString:messageId])) { - [OneSignalClient.sharedClient executeRequest:[OSRequestSubmitNotificationOpened withUserId:[self pushSubscriptionId] + [OneSignalCore.sharedClient executeRequest:[OSRequestSubmitNotificationOpened withUserId:[self pushSubscriptionId] appId:[OneSignalConfigManager getAppId] wasOpened:YES messageId:messageId diff --git a/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V1/OSOutcomeEventsV1Repository.m b/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V1/OSOutcomeEventsV1Repository.m index c159983cb..65ffce8fc 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V1/OSOutcomeEventsV1Repository.m +++ b/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V1/OSOutcomeEventsV1Repository.m @@ -65,7 +65,7 @@ - (void)requestMeasureOutcomeEventWithAppId:(NSString *)appId return; } - [OneSignalClient.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; + [OneSignalCore.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; } @end diff --git a/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V2/OSOutcomeEventsV2Repository.m b/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V2/OSOutcomeEventsV2Repository.m index da7a7b806..2deab5918 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V2/OSOutcomeEventsV2Repository.m +++ b/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/Controller/V2/OSOutcomeEventsV2Repository.m @@ -43,7 +43,7 @@ - (void)requestMeasureOutcomeEventWithAppId:(NSString *)appId appId:appId deviceType:deviceType]; - [OneSignalClient.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; + [OneSignalCore.sharedClient executeRequest:request onSuccess:successBlock onFailure:failureBlock]; } @end diff --git a/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/OneSignalOutcomeEventsController.m b/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/OneSignalOutcomeEventsController.m index 4d319474c..7049d0539 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/OneSignalOutcomeEventsController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/OneSignalOutcomeEventsController.m @@ -111,7 +111,7 @@ - (void)sendSessionEndOutcomes:(NSNumber * _Nonnull)timeElapsed influenceParams:(NSArray * _Nonnull)influenceParams onSuccess:(OSResultSuccessBlock _Nonnull)successBlock onFailure:(OSFailureBlock _Nonnull)failureBlock { - [OneSignalClient.sharedClient executeRequest:[OSRequestSendSessionEndOutcomes + [OneSignalCore.sharedClient executeRequest:[OSRequestSendSessionEndOutcomes withActiveTime:timeElapsed appId:appId pushSubscriptionId:pushSubscriptionId diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSIdentityOperationExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSIdentityOperationExecutor.swift index 475ddffde..589659453 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSIdentityOperationExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSIdentityOperationExecutor.swift @@ -179,7 +179,7 @@ class OSIdentityOperationExecutor: OSOperationExecutor { OSBackgroundTaskManager.beginBackgroundTask(backgroundTaskIdentifier) } - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in // No hydration from response // On success, remove request from cache self.addRequestQueue.removeAll(where: { $0 == request}) @@ -234,7 +234,7 @@ class OSIdentityOperationExecutor: OSOperationExecutor { OSBackgroundTaskManager.beginBackgroundTask(backgroundTaskIdentifier) } - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in // There is nothing to hydrate // On success, remove request from cache self.removeRequestQueue.removeAll(where: { $0 == request}) diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSPropertyOperationExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSPropertyOperationExecutor.swift index 9f219f6dd..f01f60b89 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSPropertyOperationExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSPropertyOperationExecutor.swift @@ -138,7 +138,7 @@ class OSPropertyOperationExecutor: OSOperationExecutor { OSBackgroundTaskManager.beginBackgroundTask(backgroundTaskIdentifier) } - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in // On success, remove request from cache, and we do need to hydrate // TODO: We need to hydrate after all ? What why ? self.updateRequestQueue.removeAll(where: { $0 == request}) @@ -191,7 +191,7 @@ extension OSPropertyOperationExecutor { if sendImmediately { // Bypass the request queues - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in if let onSuccess = onSuccess { onSuccess() } diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSSubscriptionOperationExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSSubscriptionOperationExecutor.swift index 8188663ef..699d8bc52 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSSubscriptionOperationExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSSubscriptionOperationExecutor.swift @@ -246,7 +246,7 @@ class OSSubscriptionOperationExecutor: OSOperationExecutor { } OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSSubscriptionOperationExecutor: executeCreateSubscriptionRequest making request: \(request)") - OneSignalClient.shared().execute(request) { result in + OneSignalCore.sharedClient().execute(request) { result in // On success, remove request from cache (even if not hydrating model), and hydrate model self.addRequestQueue.removeAll(where: { $0 == request}) OneSignalUserDefaults.initShared().saveCodeableData(forKey: OS_SUBSCRIPTION_EXECUTOR_ADD_REQUEST_QUEUE_KEY, withValue: self.addRequestQueue) @@ -308,7 +308,7 @@ class OSSubscriptionOperationExecutor: OSOperationExecutor { // This request can be executed as-is. OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSSubscriptionOperationExecutor: executeDeleteSubscriptionRequest making request: \(request)") - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in // On success, remove request from cache. No model hydration occurs. // For example, if app restarts and we read in operations between sending this off and getting the response self.removeRequestQueue.removeAll(where: { $0 == request}) @@ -347,7 +347,7 @@ class OSSubscriptionOperationExecutor: OSOperationExecutor { OSBackgroundTaskManager.beginBackgroundTask(backgroundTaskIdentifier) } - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in // On success, remove request from cache. No model hydration occurs. // For example, if app restarts and we read in operations between sending this off and getting the response self.updateRequestQueue.removeAll(where: { $0 == request}) diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSUserExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSUserExecutor.swift index da719ee64..9829f344e 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSUserExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSUserExecutor.swift @@ -206,7 +206,7 @@ class OSUserExecutor { request.updatePushSubscriptionModel(pushSubscriptionModel) } - OneSignalClient.shared().execute(request) { response in + OneSignalCore.sharedClient().execute(request) { response in removeFromQueue(request) // TODO: Differentiate if we need to fetch the user based on response code of 200, 201, 202 @@ -263,7 +263,7 @@ class OSUserExecutor { } request.sentToClient = true - OneSignalClient.shared().execute(request) { response in + OneSignalCore.sharedClient().execute(request) { response in removeFromQueue(request) if let identityObject = parseIdentityObjectResponse(response), @@ -316,7 +316,7 @@ class OSUserExecutor { } request.sentToClient = true - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in removeFromQueue(request) // the anonymous user has been identified, still need to Fetch User as we cleared local data @@ -386,7 +386,7 @@ class OSUserExecutor { return } request.sentToClient = true - OneSignalClient.shared().execute(request) { _ in + OneSignalCore.sharedClient().execute(request) { _ in removeFromQueue(request) // TODO: ... hydrate with returned identity object? @@ -422,7 +422,7 @@ class OSUserExecutor { return } request.sentToClient = true - OneSignalClient.shared().execute(request) { response in + OneSignalCore.sharedClient().execute(request) { response in removeFromQueue(request) if let response = response { diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignal.m b/iOS_SDK/OneSignalSDK/Source/OneSignal.m index 22591c8a4..c1d793bd7 100755 --- a/iOS_SDK/OneSignalSDK/Source/OneSignal.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignal.m @@ -601,7 +601,7 @@ + (void)downloadIOSParamsWithAppId:(NSString *)appId { // NSString *userId = OneSignalUserManagerImpl.sharedInstance.pushSubscriptionId; NSString *userId = nil; - [OneSignalClient.sharedClient executeRequest:[OSRequestGetIosParams withUserId:userId appId:appId] onSuccess:^(NSDictionary *result) { + [OneSignalCore.sharedClient executeRequest:[OSRequestGetIosParams withUserId:userId appId:appId] onSuccess:^(NSDictionary *result) { if (result[IOS_REQUIRES_USER_ID_AUTHENTICATION]) { OneSignalUserManagerImpl.sharedInstance.requiresUserAuth = [result[IOS_REQUIRES_USER_ID_AUTHENTICATION] boolValue]; diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignalLiveActivityController.m b/iOS_SDK/OneSignalSDK/Source/OneSignalLiveActivityController.m index 54c1866bb..f39fcc959 100644 --- a/iOS_SDK/OneSignalSDK/Source/OneSignalLiveActivityController.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignalLiveActivityController.m @@ -126,7 +126,7 @@ + (void)enterLiveActivity:(NSString * _Nonnull)activityId appId:(NSString *)appI } if(subscriptionId) { - [OneSignalClient.sharedClient executeRequest:[OSRequestLiveActivityEnter withSubscriptionId:subscriptionId appId:appId activityId:activityId token:token] + [OneSignalCore.sharedClient executeRequest:[OSRequestLiveActivityEnter withSubscriptionId:subscriptionId appId:appId activityId:activityId token:token] onSuccess:^(NSDictionary *result) { [self callSuccessBlockOnMainThread:successBlock withResult:result]; } onFailure:^(NSError *error) { @@ -169,7 +169,7 @@ + (void)exitLiveActivity:(NSString * _Nonnull)activityId appId:(NSString *)appId } if(subscriptionId) { - [OneSignalClient.sharedClient executeRequest:[OSRequestLiveActivityExit withSubscriptionId:subscriptionId appId:appId activityId:activityId] + [OneSignalCore.sharedClient executeRequest:[OSRequestLiveActivityExit withSubscriptionId:subscriptionId appId:appId activityId:activityId] onSuccess:^(NSDictionary *result) { [self callSuccessBlockOnMainThread:successBlock withResult:result]; } onFailure:^(NSError *error) { @@ -221,7 +221,7 @@ + (void)executePendingLiveActivityUpdates { OSPendingLiveActivityUpdate * updateToProcess = [pendingLiveActivityUpdates objectAtIndex:0]; [pendingLiveActivityUpdates removeObjectAtIndex: 0]; if (updateToProcess.isEnter) { - [OneSignalClient.sharedClient executeRequest:[OSRequestLiveActivityEnter withSubscriptionId:subscriptionId appId:updateToProcess.appId activityId:updateToProcess.activityId token:updateToProcess.token] + [OneSignalCore.sharedClient executeRequest:[OSRequestLiveActivityEnter withSubscriptionId:subscriptionId appId:updateToProcess.appId activityId:updateToProcess.activityId token:updateToProcess.token] onSuccess:^(NSDictionary *result) { [self callSuccessBlockOnMainThread:updateToProcess.successBlock withResult:result]; [self executePendingLiveActivityUpdates]; @@ -230,7 +230,7 @@ + (void)executePendingLiveActivityUpdates { [self executePendingLiveActivityUpdates]; }]; } else { - [OneSignalClient.sharedClient executeRequest:[OSRequestLiveActivityExit withSubscriptionId:subscriptionId appId:updateToProcess.appId activityId:updateToProcess.activityId] + [OneSignalCore.sharedClient executeRequest:[OSRequestLiveActivityExit withSubscriptionId:subscriptionId appId:updateToProcess.appId activityId:updateToProcess.activityId] onSuccess:^(NSDictionary *result) { [self callSuccessBlockOnMainThread:updateToProcess.successBlock withResult:result]; [self executePendingLiveActivityUpdates]; diff --git a/iOS_SDK/OneSignalSDK/UnitTests/EmailTests.m b/iOS_SDK/OneSignalSDK/UnitTests/EmailTests.m index 093868813..80808d699 100644 --- a/iOS_SDK/OneSignalSDK/UnitTests/EmailTests.m +++ b/iOS_SDK/OneSignalSDK/UnitTests/EmailTests.m @@ -277,7 +277,7 @@ of this software and associated documentation files (the "Software"), to deal // // expectation.expectedFulfillmentCount = 1; // -// [OneSignalClient.sharedClient executeSimultaneousRequests:@{@"first" : first, @"second" : second} withSuccess:^(NSDictionary *results) { +// [OneSignalCore.sharedClient executeSimultaneousRequests:@{@"first" : first, @"second" : second} withSuccess:^(NSDictionary *results) { // [expectation fulfill]; // } onFailure:^(NSDictionary *errors) { // XCTFail("Failed with error: %@", errors); diff --git a/iOS_SDK/OneSignalSDK/UnitTests/Shadows/OneSignalClientOverrider.m b/iOS_SDK/OneSignalSDK/UnitTests/Shadows/OneSignalClientOverrider.m index 3b7789130..e158ee87e 100644 --- a/iOS_SDK/OneSignalSDK/UnitTests/Shadows/OneSignalClientOverrider.m +++ b/iOS_SDK/OneSignalSDK/UnitTests/Shadows/OneSignalClientOverrider.m @@ -145,7 +145,7 @@ // __block NSMutableDictionary *results = [NSMutableDictionary new]; // // for (NSString *key in requests.allKeys) { -// [OneSignalClient.sharedClient executeRequest:requests[key] onSuccess:^(NSDictionary *result) { +// [OneSignalCore.sharedClient executeRequest:requests[key] onSuccess:^(NSDictionary *result) { // results[key] = result; // dispatch_semaphore_signal(semaphore); // } onFailure:^(NSError *error) { From 63c4976861cc1c06efe35d41c19f060c12a57099 Mon Sep 17 00:00:00 2001 From: Nan Date: Mon, 12 Feb 2024 20:58:43 -0800 Subject: [PATCH 4/9] Extract OpRepo's poll interval into a constant * Store in the variable `POLL_INTERVAL_MS` so that it can have a different value for testing vs non-testing --- .../OneSignalCore/Source/OneSignalCommonDefines.h | 6 ++++++ .../OneSignalOSCore/Source/OSOperationRepo.swift | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h index 7c183f1d3..7ba28165b 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h @@ -255,6 +255,9 @@ typedef enum {GET, POST, HEAD, PUT, DELETE, OPTIONS, CONNECT, TRACE, PATCH} HTTP // Defines the maximum delay time for confirmed deliveries #define MAX_CONF_DELIVERY_DELAY 25.0 + + // Flush interval for operation repo in milliseconds + #define POLL_INTERVAL_MS 5000 #else // Test defines for API Client #define REATTEMPT_DELAY 0.004 @@ -272,6 +275,9 @@ typedef enum {GET, POST, HEAD, PUT, DELETE, OPTIONS, CONNECT, TRACE, PATCH} HTTP // We don't want to delay confirmed deliveries in unit tests #define MAX_CONF_DELIVERY_DELAY 0 + // Reduce flush interval for operation repo in tests + #define POLL_INTERVAL_MS 100 + #endif // A max timeout for a request, which might include multiple reattempts diff --git a/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationRepo.swift b/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationRepo.swift index 25ef3b00f..d13d38162 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationRepo.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationRepo.swift @@ -41,8 +41,8 @@ public class OSOperationRepo: NSObject { var executors: [OSOperationExecutor] = [] var deltaQueue: [OSDelta] = [] - // TODO: This should come from a config, plist, method, remote params - var pollIntervalSeconds = 5 + // TODO: This could come from a config, plist, method, remote params + var pollIntervalMilliseconds = Int(POLL_INTERVAL_MS) public var paused = false /** @@ -76,7 +76,7 @@ public class OSOperationRepo: NSObject { } private func pollFlushQueue() { - DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(pollIntervalSeconds)) { [weak self] in + DispatchQueue.global().asyncAfter(deadline: .now() + .milliseconds(pollIntervalMilliseconds)) { [weak self] in self?.flushDeltaQueue() self?.pollFlushQueue() } From dbafa4b2e7e9ebc8168f834e28a96dd8cec8e052 Mon Sep 17 00:00:00 2001 From: Nan Date: Tue, 13 Feb 2024 11:29:37 -0800 Subject: [PATCH 5/9] Add 2 mocking frameworks and 2 testing bundles * Add mocking framework called `OneSignalCoreMocks` to simplify working with `OneSignalCore` in unit tests - Add helper method `clearUserDefaults()` - Create `MockOneSignalClient` class to replace `OneSignalClient` in unit tests * Add mocking framework called `OneSignalUserMocks` to simplify working with `OneSignalUser` in unit tests - Add some helper methods to reset state between tests, WIP * Add unit testing bundle `OneSignalCoreTests`, meant to test `OneSignalCore` - Add one test `testNotificationJson`, to get started * Add unit testing bundle `OneSignalUserTests`, meant to test `OneSignalUser` - Add one test `testLoginSetsExternalId`, to get started --- .../OneSignal.xcodeproj/project.pbxproj | 1305 ++++++++++++++++- .../xcschemes/OneSignalCoreTests.xcscheme | 54 + .../xcschemes/OneSignalUserTests.xcscheme | 54 + .../MockOneSignalClient.swift | 139 ++ .../OneSignalCoreMocks/OneSignalCoreMocks.h | 32 + .../OneSignalCoreMocks.swift | 46 + .../OneSignalCoreTests.swift | 76 + .../OneSignalUserMocks/OneSignalUserMocks.h | 32 + .../OneSignalUserMocks.swift | 74 + .../OneSignalUserTests.swift | 65 + 10 files changed, 1822 insertions(+), 55 deletions(-) create mode 100644 iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalCoreTests.xcscheme create mode 100644 iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalUserTests.xcscheme create mode 100644 iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOneSignalClient.swift create mode 100644 iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.h create mode 100644 iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.swift create mode 100644 iOS_SDK/OneSignalSDK/OneSignalCoreTests/OneSignalCoreTests.swift create mode 100644 iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.h create mode 100644 iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift create mode 100644 iOS_SDK/OneSignalSDK/OneSignalUserTests/OneSignalUserTests.swift diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index 1c2c769db..78019bd5b 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -84,6 +84,9 @@ 3C5117172B15C31E00563465 /* OSUserState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5117162B15C31E00563465 /* OSUserState.swift */; }; 3C789DBD293C2206004CF83D /* OSFocusInfluenceParam.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A600B432453790700514A53 /* OSFocusInfluenceParam.m */; }; 3C789DBE293D8EAD004CF83D /* OSFocusInfluenceParam.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A600B41245378ED00514A53 /* OSFocusInfluenceParam.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C7A39C12B7BED900082665E /* OneSignalCoreMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; }; + 3C7A39C22B7BED900082665E /* OneSignalCoreMocks.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3C7A39DC2B7C1C580082665E /* UNUserNotificationCenterOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEE61FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.m */; }; 3C8E6DF928A6D89E0031E48A /* OSOperationExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8E6DF828A6D89E0031E48A /* OSOperationExecutor.swift */; }; 3C8E6DFF28AB09AE0031E48A /* OSPropertyOperationExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8E6DFE28AB09AE0031E48A /* OSPropertyOperationExecutor.swift */; }; 3C8E6E0128AC0BA10031E48A /* OSIdentityOperationExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8E6E0028AC0BA10031E48A /* OSIdentityOperationExecutor.swift */; }; @@ -109,6 +112,17 @@ 3C9AD6E02B22A8EC00BC1540 /* OneSignalNotifications.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEF784292912DEB600A1F3A5 /* OneSignalNotifications.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3CA6CE0A28E4F19B00CA0585 /* OSUserRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA6CE0928E4F19B00CA0585 /* OSUserRequest.swift */; }; 3CC063942B6D6B6B002BB07F /* OneSignalCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063932B6D6B6B002BB07F /* OneSignalCore.m */; }; + 3CC063A22B6D7A8E002BB07F /* OneSignalCoreMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; }; + 3CC063A72B6D7A8E002BB07F /* OneSignalCoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063A62B6D7A8E002BB07F /* OneSignalCoreTests.swift */; }; + 3CC063A82B6D7A8E002BB07F /* OneSignalCoreMocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CC0639C2B6D7A8D002BB07F /* OneSignalCoreMocks.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3CC063B22B6D7AD8002BB07F /* MockOneSignalClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063B12B6D7AD8002BB07F /* MockOneSignalClient.swift */; }; + 3CC063B42B6D7BA2002BB07F /* OneSignalCoreMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063B32B6D7BA2002BB07F /* OneSignalCoreMocks.swift */; }; + 3CC063D32B6D7EA2002BB07F /* OneSignalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; }; + 3CC063D42B6D7EA2002BB07F /* OneSignalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CC063E02B6D7F2A002BB07F /* OneSignalUserMocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CC063DF2B6D7F2A002BB07F /* OneSignalUserMocks.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3CC063E62B6D7F96002BB07F /* OneSignalUserMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063E52B6D7F96002BB07F /* OneSignalUserMocks.swift */; }; + 3CC063EE2B6D7FE8002BB07F /* OneSignalUserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063ED2B6D7FE8002BB07F /* OneSignalUserTests.swift */; }; + 3CC063EF2B6D7FE8002BB07F /* OneSignalUser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE69E19B282ED8060090BB3D /* OneSignalUser.framework */; }; 3CC9A6342AFA1FDE008F68FD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3CC9A6332AFA1FDD008F68FD /* PrivacyInfo.xcprivacy */; }; 3CC9A6362AFA26E7008F68FD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3CC9A6352AFA26E7008F68FD /* PrivacyInfo.xcprivacy */; }; 3CCF44BE299B17290021964D /* OneSignalWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CCF44BC299B17290021964D /* OneSignalWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -125,6 +139,18 @@ 3CE8CC582911B2B2000DB0D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CE8CC572911B2B2000DB0D3 /* SystemConfiguration.framework */; }; 3CE8CC5B29143F4B000DB0D3 /* NSDateFormatter+OneSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = DE98772A2591655800DE07D5 /* NSDateFormatter+OneSignal.m */; }; 3CE9227A289FA88B001B1062 /* OSIdentityModelStoreListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CE92279289FA88B001B1062 /* OSIdentityModelStoreListener.swift */; }; + 3CEE93422B7C4174008440BD /* OneSignalUserMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; }; + 3CEE93432B7C4174008440BD /* OneSignalUserMocks.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CEE93462B7C73AB008440BD /* OneSignalCoreMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; }; + 3CEE93472B7C73AB008440BD /* OneSignalCoreMocks.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CEE934A2B7C73B6008440BD /* OneSignalUserMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; }; + 3CEE934B2B7C73B6008440BD /* OneSignalUserMocks.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CEE934E2B7C787B008440BD /* OneSignalOSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C115161289A259500565C41 /* OneSignalOSCore.framework */; }; + 3CEE934F2B7C787B008440BD /* OneSignalOSCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3C115161289A259500565C41 /* OneSignalOSCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CEE93532B7C78EC008440BD /* OneSignalUser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE69E19B282ED8060090BB3D /* OneSignalUser.framework */; }; + 3CEE93542B7C78EC008440BD /* OneSignalUser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE69E19B282ED8060090BB3D /* OneSignalUser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CEE93572B7C78FD008440BD /* OneSignalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; }; + 3CEE93582B7C78FE008440BD /* OneSignalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3CF8629E28A183F900776CA4 /* OSIdentityModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF8629D28A183F900776CA4 /* OSIdentityModel.swift */; }; 3CF862A028A1964F00776CA4 /* OSPropertiesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF8629F28A1964F00776CA4 /* OSPropertiesModel.swift */; }; 3CF862A228A197D200776CA4 /* OSPropertiesModelStoreListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF862A128A197D200776CA4 /* OSPropertiesModelStoreListener.swift */; }; @@ -136,7 +162,6 @@ 4529DEDE1FA828E500CEAB1D /* NSDateOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEDD1FA828E500CEAB1D /* NSDateOverrider.m */; }; 4529DEE11FA82AB300CEAB1D /* NSBundleOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEE01FA82AB300CEAB1D /* NSBundleOverrider.m */; }; 4529DEE41FA82C6200CEAB1D /* NSURLSessionOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEE31FA82C6200CEAB1D /* NSURLSessionOverrider.m */; }; - 4529DEE71FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEE61FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.m */; }; 4529DEEA1FA8360C00CEAB1D /* UIApplicationOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEE91FA8360C00CEAB1D /* UIApplicationOverrider.m */; }; 4529DEED1FA83C5D00CEAB1D /* OneSignalHelperOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEEC1FA83C5D00CEAB1D /* OneSignalHelperOverrider.m */; }; 4529DEF01FA8433500CEAB1D /* NSLocaleOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4529DEEF1FA8433500CEAB1D /* NSLocaleOverrider.m */; }; @@ -510,6 +535,27 @@ remoteGlobalIDString = 3C115160289A259500565C41; remoteInfo = OneSignalOSCore; }; + 3C7A39C32B7BED900082665E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3CC063992B6D7A8C002BB07F; + remoteInfo = OneSignalCoreMocks; + }; + 3C7A39DD2B7C1C860082665E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DEF5CCF02539321A0003E9CC; + remoteInfo = UnitTestApp; + }; + 3C7A39DF2B7C1C8B0082665E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DEF5CCF02539321A0003E9CC; + remoteInfo = UnitTestApp; + }; 3C9AD6D82B22A8DF00BC1540 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 37747F8B19147D6400558FAD /* Project object */; @@ -531,6 +577,69 @@ remoteGlobalIDString = DEF784282912DEB600A1F3A5; remoteInfo = OneSignalNotifications; }; + 3CC063A32B6D7A8E002BB07F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3CC063992B6D7A8C002BB07F; + remoteInfo = OneSignalCoreMocks; + }; + 3CC063D52B6D7EA3002BB07F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE7D17E527026B95002D3A5D; + remoteInfo = OneSignalCore; + }; + 3CC063F02B6D7FE8002BB07F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE69E19A282ED8060090BB3D; + remoteInfo = OneSignalUser; + }; + 3CEE93442B7C4174008440BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3CC063DC2B6D7F2A002BB07F; + remoteInfo = OneSignalUserMocks; + }; + 3CEE93482B7C73AB008440BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3CC063992B6D7A8C002BB07F; + remoteInfo = OneSignalCoreMocks; + }; + 3CEE934C2B7C73B6008440BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3CC063DC2B6D7F2A002BB07F; + remoteInfo = OneSignalUserMocks; + }; + 3CEE93502B7C787C008440BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3C115160289A259500565C41; + remoteInfo = OneSignalOSCore; + }; + 3CEE93552B7C78EC008440BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE69E19A282ED8060090BB3D; + remoteInfo = OneSignalUser; + }; + 3CEE93592B7C78FE008440BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE7D17E527026B95002D3A5D; + remoteInfo = OneSignalCore; + }; DE12F3F4289B28C4002F63AA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 37747F8B19147D6400558FAD /* Project object */; @@ -726,6 +835,18 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3C7A39C52B7BED910082665E /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3CEE93432B7C4174008440BD /* OneSignalUserMocks.framework in Embed Frameworks */, + 3C7A39C22B7BED900082665E /* OneSignalCoreMocks.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 3C9AD6DA2B22A8DF00BC1540 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -739,6 +860,40 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 3CC063D72B6D7EA3002BB07F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3CC063D42B6D7EA2002BB07F /* OneSignalCore.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 3CEE93522B7C787C008440BD /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3CEE93542B7C78EC008440BD /* OneSignalUser.framework in Embed Frameworks */, + 3CEE934F2B7C787B008440BD /* OneSignalOSCore.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 3CEE935B2B7C78FE008440BD /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3CEE93582B7C78FE008440BD /* OneSignalCore.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; DEA4B45E2888C1D000E9FE12 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -750,7 +905,9 @@ DEA4B4662888C59E00E9FE12 /* OneSignalExtension.framework in Embed Frameworks */, DEBAAE2F2A4211DA00BF2C1C /* OneSignalInAppMessages.framework in Embed Frameworks */, DEA4B4632888C4DC00E9FE12 /* OneSignalOutcomes.framework in Embed Frameworks */, + 3CEE934B2B7C73B6008440BD /* OneSignalUserMocks.framework in Embed Frameworks */, DEA4B45D2888C1D000E9FE12 /* OneSignalCore.framework in Embed Frameworks */, + 3CEE93472B7C73AB008440BD /* OneSignalCoreMocks.framework in Embed Frameworks */, 3C11518F289AF83600565C41 /* OneSignalOSCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -801,6 +958,7 @@ 3C47A973292642B100312125 /* OneSignalConfigManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalConfigManager.m; sourceTree = ""; }; 3C4F9E4328A4466C009F453A /* OSOperationRepo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSOperationRepo.swift; sourceTree = ""; }; 3C5117162B15C31E00563465 /* OSUserState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSUserState.swift; sourceTree = ""; }; + 3C7A39D42B7C18EE0082665E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 3C8E6DF828A6D89E0031E48A /* OSOperationExecutor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSOperationExecutor.swift; sourceTree = ""; }; 3C8E6DFE28AB09AE0031E48A /* OSPropertyOperationExecutor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSPropertyOperationExecutor.swift; sourceTree = ""; }; 3C8E6E0028AC0BA10031E48A /* OSIdentityOperationExecutor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSIdentityOperationExecutor.swift; sourceTree = ""; }; @@ -818,6 +976,17 @@ 3C9AD6D22B228BB000BC1540 /* OSRequestUpdateProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSRequestUpdateProperties.swift; sourceTree = ""; }; 3CA6CE0928E4F19B00CA0585 /* OSUserRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSUserRequest.swift; sourceTree = ""; }; 3CC063932B6D6B6B002BB07F /* OneSignalCore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalCore.m; sourceTree = ""; }; + 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OneSignalCoreMocks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CC0639C2B6D7A8D002BB07F /* OneSignalCoreMocks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalCoreMocks.h; sourceTree = ""; }; + 3CC063A12B6D7A8D002BB07F /* OneSignalCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OneSignalCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CC063A62B6D7A8E002BB07F /* OneSignalCoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneSignalCoreTests.swift; sourceTree = ""; }; + 3CC063B12B6D7AD8002BB07F /* MockOneSignalClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockOneSignalClient.swift; sourceTree = ""; }; + 3CC063B32B6D7BA2002BB07F /* OneSignalCoreMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneSignalCoreMocks.swift; sourceTree = ""; }; + 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OneSignalUserMocks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CC063DF2B6D7F2A002BB07F /* OneSignalUserMocks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalUserMocks.h; sourceTree = ""; }; + 3CC063E52B6D7F96002BB07F /* OneSignalUserMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneSignalUserMocks.swift; sourceTree = ""; }; + 3CC063EB2B6D7FE8002BB07F /* OneSignalUserTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OneSignalUserTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CC063ED2B6D7FE8002BB07F /* OneSignalUserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneSignalUserTests.swift; sourceTree = ""; }; 3CC9A6332AFA1FDD008F68FD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 3CC9A6352AFA26E7008F68FD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 3CCF44BC299B17290021964D /* OneSignalWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalWrapper.h; sourceTree = ""; }; @@ -1188,6 +1357,42 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3CC063972B6D7A8C002BB07F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CEE93572B7C78FD008440BD /* OneSignalCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC0639E2B6D7A8D002BB07F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CC063D32B6D7EA2002BB07F /* OneSignalCore.framework in Frameworks */, + 3CC063A22B6D7A8E002BB07F /* OneSignalCoreMocks.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063DA2B6D7F2A002BB07F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CEE93532B7C78EC008440BD /* OneSignalUser.framework in Frameworks */, + 3CEE934E2B7C787B008440BD /* OneSignalOSCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063E82B6D7FE8002BB07F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3C7A39C12B7BED900082665E /* OneSignalCoreMocks.framework in Frameworks */, + 3CC063EF2B6D7FE8002BB07F /* OneSignalUser.framework in Frameworks */, + 3CEE93422B7C4174008440BD /* OneSignalUserMocks.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3E2400341D4FFC31008BDE70 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1300,8 +1505,10 @@ DEBAAE2E2A4211DA00BF2C1C /* OneSignalInAppMessages.framework in Frameworks */, DEA4B4652888C59100E9FE12 /* OneSignalExtension.framework in Frameworks */, DEF7842F2912DEBA00A1F3A5 /* OneSignalNotifications.framework in Frameworks */, + 3CEE93462B7C73AB008440BD /* OneSignalCoreMocks.framework in Frameworks */, DEA4B4622888C4D500E9FE12 /* OneSignalOutcomes.framework in Frameworks */, DEA4B45C2888C1D000E9FE12 /* OneSignalCore.framework in Frameworks */, + 3CEE934A2B7C73B6008440BD /* OneSignalUserMocks.framework in Frameworks */, DEF5CD52253934410003E9CC /* CoreFoundation.framework in Frameworks */, DEF5CD502539343C0003E9CC /* Foundation.framework in Frameworks */, DEF5CD4F253934350003E9CC /* UIKit.framework in Frameworks */, @@ -1347,6 +1554,8 @@ 37747F8A19147D6400558FAD = { isa = PBXGroup; children = ( + 37747F9519147D6500558FAD /* Frameworks */, + 3E2400391D4FFC31008BDE70 /* OneSignalFramework */, DEBAAE212A42119100BF2C1C /* OneSignalInAppMessagesFramework */, DEBAAE012A420B0500BF2C1C /* OneSignalLocationFramework */, DEF784352912E00900A1F3A5 /* OneSignalNotificationsFramework */, @@ -1366,8 +1575,10 @@ DEF7842A2912DEBA00A1F3A5 /* OneSignalNotifications */, DEBAADFA2A420A3900BF2C1C /* OneSignalLocation */, DEBAAE292A4211DA00BF2C1C /* OneSignalInAppMessages */, - 37747F9519147D6500558FAD /* Frameworks */, - 3E2400391D4FFC31008BDE70 /* OneSignalFramework */, + 3CC0639B2B6D7A8D002BB07F /* OneSignalCoreMocks */, + 3CC063DE2B6D7F2A002BB07F /* OneSignalUserMocks */, + 3CC063A52B6D7A8E002BB07F /* OneSignalCoreTests */, + 3CC063EC2B6D7FE8002BB07F /* OneSignalUserTests */, 37747F9419147D6500558FAD /* Products */, ); sourceTree = ""; @@ -1387,6 +1598,10 @@ DEF784292912DEB600A1F3A5 /* OneSignalNotifications.framework */, DEBAADF92A420A3700BF2C1C /* OneSignalLocation.framework */, DEBAAE282A4211D900BF2C1C /* OneSignalInAppMessages.framework */, + 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */, + 3CC063A12B6D7A8D002BB07F /* OneSignalCoreTests.xctest */, + 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */, + 3CC063EB2B6D7FE8002BB07F /* OneSignalUserTests.xctest */, ); name = Products; sourceTree = ""; @@ -1394,6 +1609,7 @@ 37747F9519147D6500558FAD /* Frameworks */ = { isa = PBXGroup; children = ( + 3C7A39D42B7C18EE0082665E /* XCTest.framework */, DEBAAE9A2A4222B000BF2C1C /* CoreGraphics.framework */, DEBAAE4A2A42123400BF2C1C /* WebKit.framework */, DEBAAE092A420CA500BF2C1C /* UIKit.framework */, @@ -1472,6 +1688,41 @@ path = Requests; sourceTree = ""; }; + 3CC0639B2B6D7A8D002BB07F /* OneSignalCoreMocks */ = { + isa = PBXGroup; + children = ( + 3CC0639C2B6D7A8D002BB07F /* OneSignalCoreMocks.h */, + 3CC063B32B6D7BA2002BB07F /* OneSignalCoreMocks.swift */, + 3CC063B12B6D7AD8002BB07F /* MockOneSignalClient.swift */, + ); + path = OneSignalCoreMocks; + sourceTree = ""; + }; + 3CC063A52B6D7A8E002BB07F /* OneSignalCoreTests */ = { + isa = PBXGroup; + children = ( + 3CC063A62B6D7A8E002BB07F /* OneSignalCoreTests.swift */, + ); + path = OneSignalCoreTests; + sourceTree = ""; + }; + 3CC063DE2B6D7F2A002BB07F /* OneSignalUserMocks */ = { + isa = PBXGroup; + children = ( + 3CC063DF2B6D7F2A002BB07F /* OneSignalUserMocks.h */, + 3CC063E52B6D7F96002BB07F /* OneSignalUserMocks.swift */, + ); + path = OneSignalUserMocks; + sourceTree = ""; + }; + 3CC063EC2B6D7FE8002BB07F /* OneSignalUserTests */ = { + isa = PBXGroup; + children = ( + 3CC063ED2B6D7FE8002BB07F /* OneSignalUserTests.swift */, + ); + path = OneSignalUserTests; + sourceTree = ""; + }; 3E2400391D4FFC31008BDE70 /* OneSignalFramework */ = { isa = PBXGroup; children = ( @@ -1509,8 +1760,6 @@ 4529DEF21FA8440A00CEAB1D /* UIAlertViewOverrider.m */, 4529DEE81FA8360C00CEAB1D /* UIApplicationOverrider.h */, 4529DEE91FA8360C00CEAB1D /* UIApplicationOverrider.m */, - 4529DEE51FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.h */, - 4529DEE61FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.m */, CA1A6E7320DC2F04001C41B9 /* OneSignalDialogControllerOverrider.h */, CA1A6E7420DC2F04001C41B9 /* OneSignalDialogControllerOverrider.m */, CA8E18FA2193A1A5009DA223 /* NSTimerOverrider.h */, @@ -1527,6 +1776,8 @@ 16664C5425DDB2CB003B8A14 /* NSTimeZoneOverrider.h */, 03E56DD128405F4A006AA1DA /* OneSignalAppDelegateOverrider.h */, 03E56DD228405F4A006AA1DA /* OneSignalAppDelegateOverrider.m */, + 4529DEE51FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.h */, + 4529DEE61FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.m */, DEA4B44D2888AF8900E9FE12 /* OneSignalUNUserNotificationCenterOverrider.h */, DEA4B44C2888AF8900E9FE12 /* OneSignalUNUserNotificationCenterOverrider.m */, ); @@ -2198,6 +2449,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3CC063952B6D7A8C002BB07F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CC063A82B6D7A8E002BB07F /* OneSignalCoreMocks.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063D82B6D7F2A002BB07F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CC063E02B6D7F2A002BB07F /* OneSignalUserMocks.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3E2400351D4FFC31008BDE70 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2408,6 +2675,90 @@ productReference = 3C115161289A259500565C41 /* OneSignalOSCore.framework */; productType = "com.apple.product-type.framework"; }; + 3CC063992B6D7A8C002BB07F /* OneSignalCoreMocks */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3CC063AF2B6D7A8E002BB07F /* Build configuration list for PBXNativeTarget "OneSignalCoreMocks" */; + buildPhases = ( + 3CC063952B6D7A8C002BB07F /* Headers */, + 3CC063962B6D7A8C002BB07F /* Sources */, + 3CC063972B6D7A8C002BB07F /* Frameworks */, + 3CC063982B6D7A8C002BB07F /* Resources */, + 3CEE935B2B7C78FE008440BD /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 3CEE935A2B7C78FE008440BD /* PBXTargetDependency */, + ); + name = OneSignalCoreMocks; + productName = OneSignalCoreMocks; + productReference = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; + productType = "com.apple.product-type.framework"; + }; + 3CC063A02B6D7A8D002BB07F /* OneSignalCoreTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3CC063B02B6D7A8E002BB07F /* Build configuration list for PBXNativeTarget "OneSignalCoreTests" */; + buildPhases = ( + 3CC0639D2B6D7A8D002BB07F /* Sources */, + 3CC0639E2B6D7A8D002BB07F /* Frameworks */, + 3CC0639F2B6D7A8D002BB07F /* Resources */, + 3CC063D72B6D7EA3002BB07F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 3CC063A42B6D7A8E002BB07F /* PBXTargetDependency */, + 3CC063D62B6D7EA3002BB07F /* PBXTargetDependency */, + 3C7A39DE2B7C1C860082665E /* PBXTargetDependency */, + ); + name = OneSignalCoreTests; + productName = OneSignalCoreMocksTests; + productReference = 3CC063A12B6D7A8D002BB07F /* OneSignalCoreTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 3CC063DC2B6D7F2A002BB07F /* OneSignalUserMocks */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3CC063E12B6D7F2A002BB07F /* Build configuration list for PBXNativeTarget "OneSignalUserMocks" */; + buildPhases = ( + 3CC063D82B6D7F2A002BB07F /* Headers */, + 3CC063D92B6D7F2A002BB07F /* Sources */, + 3CC063DA2B6D7F2A002BB07F /* Frameworks */, + 3CC063DB2B6D7F2A002BB07F /* Resources */, + 3CEE93522B7C787C008440BD /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 3CEE93512B7C787C008440BD /* PBXTargetDependency */, + 3CEE93562B7C78EC008440BD /* PBXTargetDependency */, + ); + name = OneSignalUserMocks; + productName = OneSignalUserMocks; + productReference = 3CC063DD2B6D7F2A002BB07F /* OneSignalUserMocks.framework */; + productType = "com.apple.product-type.framework"; + }; + 3CC063EA2B6D7FE8002BB07F /* OneSignalUserTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3CC063F22B6D7FE8002BB07F /* Build configuration list for PBXNativeTarget "OneSignalUserTests" */; + buildPhases = ( + 3CC063E72B6D7FE8002BB07F /* Sources */, + 3CC063E82B6D7FE8002BB07F /* Frameworks */, + 3CC063E92B6D7FE8002BB07F /* Resources */, + 3C7A39C52B7BED910082665E /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 3CC063F12B6D7FE8002BB07F /* PBXTargetDependency */, + 3C7A39C42B7BED900082665E /* PBXTargetDependency */, + 3C7A39E02B7C1C8B0082665E /* PBXTargetDependency */, + 3CEE93452B7C4174008440BD /* PBXTargetDependency */, + ); + name = OneSignalUserTests; + productName = OneSignalUserTests; + productReference = 3CC063EB2B6D7FE8002BB07F /* OneSignalUserTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 3E2400371D4FFC31008BDE70 /* OneSignalFramework */ = { isa = PBXNativeTarget; buildConfigurationList = 3E24003F1D4FFC31008BDE70 /* Build configuration list for PBXNativeTarget "OneSignalFramework" */; @@ -2591,6 +2942,8 @@ dependencies = ( DEF7842E2912DEBA00A1F3A5 /* PBXTargetDependency */, DEBAAE2D2A4211DA00BF2C1C /* PBXTargetDependency */, + 3CEE93492B7C73AB008440BD /* PBXTargetDependency */, + 3CEE934D2B7C73B6008440BD /* PBXTargetDependency */, ); name = UnitTestApp; productName = UnitTestApp; @@ -2624,7 +2977,7 @@ 37747F8B19147D6400558FAD /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1320; + LastSwiftUpdateCheck = 1520; LastUpgradeCheck = 0800; ORGANIZATIONNAME = Hiptic; TargetAttributes = { @@ -2636,6 +2989,30 @@ DevelopmentTeam = 99SW8E36CT; ProvisioningStyle = Automatic; }; + 3CC063992B6D7A8C002BB07F = { + CreatedOnToolsVersion = 15.2; + DevelopmentTeam = 99SW8E36CT; + LastSwiftMigration = 1520; + ProvisioningStyle = Automatic; + }; + 3CC063A02B6D7A8D002BB07F = { + CreatedOnToolsVersion = 15.2; + DevelopmentTeam = 99SW8E36CT; + ProvisioningStyle = Automatic; + TestTargetID = DEF5CCF02539321A0003E9CC; + }; + 3CC063DC2B6D7F2A002BB07F = { + CreatedOnToolsVersion = 15.2; + DevelopmentTeam = 99SW8E36CT; + LastSwiftMigration = 1520; + ProvisioningStyle = Automatic; + }; + 3CC063EA2B6D7FE8002BB07F = { + CreatedOnToolsVersion = 15.2; + DevelopmentTeam = 99SW8E36CT; + ProvisioningStyle = Automatic; + TestTargetID = DEF5CCF02539321A0003E9CC; + }; 3E2400371D4FFC31008BDE70 = { CreatedOnToolsVersion = 8.0; DevelopmentTeam = 99SW8E36CT; @@ -2735,6 +3112,10 @@ DEF784282912DEB600A1F3A5 /* OneSignalNotifications */, DEBAADF82A420A3700BF2C1C /* OneSignalLocation */, DEBAAE272A4211D900BF2C1C /* OneSignalInAppMessages */, + 3CC063992B6D7A8C002BB07F /* OneSignalCoreMocks */, + 3CC063DC2B6D7F2A002BB07F /* OneSignalUserMocks */, + 3CC063A02B6D7A8D002BB07F /* OneSignalCoreTests */, + 3CC063EA2B6D7FE8002BB07F /* OneSignalUserTests */, ); }; /* End PBXProject section */ @@ -2747,6 +3128,34 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3CC063982B6D7A8C002BB07F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC0639F2B6D7A8D002BB07F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063DB2B6D7F2A002BB07F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063E92B6D7FE8002BB07F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3E2400361D4FFC31008BDE70 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2917,30 +3326,63 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3E2400331D4FFC31008BDE70 /* Sources */ = { + 3CC063962B6D7A8C002BB07F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9124120F1E73342200E41FD7 /* OneSignal.m in Sources */, - 9124121F1E73342200E41FD7 /* OneSignalJailbreakDetection.m in Sources */, - 912412481E73369700E41FD7 /* OneSignalHelper.m in Sources */, - 7AECE59723674AB700537907 /* OSUnattributedFocusTimeProcessor.m in Sources */, - 944F7ED2296F9F1200AEBA54 /* OneSignalLiveActivityController.m in Sources */, - DE7D18E02703B49B002D3A5D /* OSFocusRequests.m in Sources */, - 7AAA60692485D0420004FADE /* OSMigrationController.m in Sources */, - DE16C14524D3724700670EFA /* OneSignalLifecycleObserver.m in Sources */, - CAB4112A20852E4C005A70D1 /* DelayedConsentInitializationParameters.m in Sources */, - 9124123F1E73342200E41FD7 /* UIApplicationDelegate+OneSignal.m in Sources */, - 7AECE59F23675F6300537907 /* OSFocusTimeProcessorFactory.m in Sources */, - DEC08B012947D4E900C81DA3 /* OneSignalSwiftInterface.swift in Sources */, - CA1A6E7120DC2E73001C41B9 /* OneSignalDialogRequest.m in Sources */, - 912412331E73342200E41FD7 /* OneSignalTracker.m in Sources */, - 7A674F1C2360D82E001F9ACD /* OSBaseFocusTimeProcessor.m in Sources */, - 7AFE856C2368DDB80091D6A5 /* OSFocusCallParams.m in Sources */, - 7A93269D25AF4F0200BBEC27 /* OSPendingCallbacks.m in Sources */, - DE20425F24E21C2C00350E4F /* UIApplication+OneSignal.m in Sources */, - 3C448B9F2936ADFD002F96BC /* OSBackgroundTaskHandlerImpl.m in Sources */, - 912412371E73342200E41FD7 /* OneSignalTrackIAP.m in Sources */, + 3CC063B22B6D7AD8002BB07F /* MockOneSignalClient.swift in Sources */, + 3CC063B42B6D7BA2002BB07F /* OneSignalCoreMocks.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC0639D2B6D7A8D002BB07F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CC063A72B6D7A8E002BB07F /* OneSignalCoreTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063D92B6D7F2A002BB07F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CC063E62B6D7F96002BB07F /* OneSignalUserMocks.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3CC063E72B6D7FE8002BB07F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3CC063EE2B6D7FE8002BB07F /* OneSignalUserTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E2400331D4FFC31008BDE70 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9124120F1E73342200E41FD7 /* OneSignal.m in Sources */, + 9124121F1E73342200E41FD7 /* OneSignalJailbreakDetection.m in Sources */, + 912412481E73369700E41FD7 /* OneSignalHelper.m in Sources */, + 7AECE59723674AB700537907 /* OSUnattributedFocusTimeProcessor.m in Sources */, + 944F7ED2296F9F1200AEBA54 /* OneSignalLiveActivityController.m in Sources */, + DE7D18E02703B49B002D3A5D /* OSFocusRequests.m in Sources */, + 7AAA60692485D0420004FADE /* OSMigrationController.m in Sources */, + DE16C14524D3724700670EFA /* OneSignalLifecycleObserver.m in Sources */, + CAB4112A20852E4C005A70D1 /* DelayedConsentInitializationParameters.m in Sources */, + 9124123F1E73342200E41FD7 /* UIApplicationDelegate+OneSignal.m in Sources */, + 7AECE59F23675F6300537907 /* OSFocusTimeProcessorFactory.m in Sources */, + DEC08B012947D4E900C81DA3 /* OneSignalSwiftInterface.swift in Sources */, + CA1A6E7120DC2E73001C41B9 /* OneSignalDialogRequest.m in Sources */, + 912412331E73342200E41FD7 /* OneSignalTracker.m in Sources */, + 7A674F1C2360D82E001F9ACD /* OSBaseFocusTimeProcessor.m in Sources */, + 7AFE856C2368DDB80091D6A5 /* OSFocusCallParams.m in Sources */, + 7A93269D25AF4F0200BBEC27 /* OSPendingCallbacks.m in Sources */, + DE20425F24E21C2C00350E4F /* UIApplication+OneSignal.m in Sources */, + 3C448B9F2936ADFD002F96BC /* OSBackgroundTaskHandlerImpl.m in Sources */, + 912412371E73342200E41FD7 /* OneSignalTrackIAP.m in Sources */, 7AECE59123674A9700537907 /* OSAttributedFocusTimeProcessor.m in Sources */, CA1A6E6B20DC2E31001C41B9 /* OneSignalDialogController.m in Sources */, ); @@ -2993,6 +3435,7 @@ 4529DED51FA823B900CEAB1D /* TestHelperFunctions.m in Sources */, 911E2CBD1E398AB3003112A4 /* UnitTests.m in Sources */, CA63AF8420211F7400E340FB /* EmailTests.m in Sources */, + 3C7A39DC2B7C1C580082665E /* UNUserNotificationCenterOverrider.m in Sources */, 7A674F1D2360D82E001F9ACD /* OSBaseFocusTimeProcessor.m in Sources */, 7A2E90622460DA1500B3428C /* OutcomeIntegrationV2Tests.m in Sources */, 4529DEDE1FA828E500CEAB1D /* NSDateOverrider.m in Sources */, @@ -3000,7 +3443,6 @@ 7AF5174C24FE980400B076BC /* RemoteParamsTests.m in Sources */, 912412401E73342200E41FD7 /* UIApplicationDelegate+OneSignal.m in Sources */, CACBAAAA218A65AE000ACAA5 /* InAppMessagingTests.m in Sources */, - 4529DEE71FA82CDC00CEAB1D /* UNUserNotificationCenterOverrider.m in Sources */, 3C9AD6D52B22A8C400BC1540 /* OneSignalLiveActivityController.m in Sources */, 3C2C7DC6288E00AA0020F9AE /* UserModelObjcTests.m in Sources */, 4529DEDB1FA8284E00CEAB1D /* NSDataOverrider.m in Sources */, @@ -3216,6 +3658,21 @@ target = 3C115160289A259500565C41 /* OneSignalOSCore */; targetProxy = 3C115199289AF86C00565C41 /* PBXContainerItemProxy */; }; + 3C7A39C42B7BED900082665E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3CC063992B6D7A8C002BB07F /* OneSignalCoreMocks */; + targetProxy = 3C7A39C32B7BED900082665E /* PBXContainerItemProxy */; + }; + 3C7A39DE2B7C1C860082665E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DEF5CCF02539321A0003E9CC /* UnitTestApp */; + targetProxy = 3C7A39DD2B7C1C860082665E /* PBXContainerItemProxy */; + }; + 3C7A39E02B7C1C8B0082665E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DEF5CCF02539321A0003E9CC /* UnitTestApp */; + targetProxy = 3C7A39DF2B7C1C8B0082665E /* PBXContainerItemProxy */; + }; 3C9AD6D92B22A8DF00BC1540 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DEBAADF82A420A3700BF2C1C /* OneSignalLocation */; @@ -3231,6 +3688,51 @@ target = DEF784282912DEB600A1F3A5 /* OneSignalNotifications */; targetProxy = 3C9AD6E12B22A8ED00BC1540 /* PBXContainerItemProxy */; }; + 3CC063A42B6D7A8E002BB07F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3CC063992B6D7A8C002BB07F /* OneSignalCoreMocks */; + targetProxy = 3CC063A32B6D7A8E002BB07F /* PBXContainerItemProxy */; + }; + 3CC063D62B6D7EA3002BB07F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE7D17E527026B95002D3A5D /* OneSignalCore */; + targetProxy = 3CC063D52B6D7EA3002BB07F /* PBXContainerItemProxy */; + }; + 3CC063F12B6D7FE8002BB07F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE69E19A282ED8060090BB3D /* OneSignalUser */; + targetProxy = 3CC063F02B6D7FE8002BB07F /* PBXContainerItemProxy */; + }; + 3CEE93452B7C4174008440BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3CC063DC2B6D7F2A002BB07F /* OneSignalUserMocks */; + targetProxy = 3CEE93442B7C4174008440BD /* PBXContainerItemProxy */; + }; + 3CEE93492B7C73AB008440BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3CC063992B6D7A8C002BB07F /* OneSignalCoreMocks */; + targetProxy = 3CEE93482B7C73AB008440BD /* PBXContainerItemProxy */; + }; + 3CEE934D2B7C73B6008440BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3CC063DC2B6D7F2A002BB07F /* OneSignalUserMocks */; + targetProxy = 3CEE934C2B7C73B6008440BD /* PBXContainerItemProxy */; + }; + 3CEE93512B7C787C008440BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3C115160289A259500565C41 /* OneSignalOSCore */; + targetProxy = 3CEE93502B7C787C008440BD /* PBXContainerItemProxy */; + }; + 3CEE93562B7C78EC008440BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE69E19A282ED8060090BB3D /* OneSignalUser */; + targetProxy = 3CEE93552B7C78EC008440BD /* PBXContainerItemProxy */; + }; + 3CEE935A2B7C78FE008440BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE7D17E527026B95002D3A5D /* OneSignalCore */; + targetProxy = 3CEE93592B7C78FE008440BD /* PBXContainerItemProxy */; + }; DE12F3F5289B28C4002F63AA /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 3C115160289A259500565C41 /* OneSignalOSCore */; @@ -3380,17 +3882,462 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 3C115173289A259500565C41 /* Release */ = { +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 3C115173289A259500565C41 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 99SW8E36CT; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = OneSignalOSCoreFramework/Info.plist; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2022 Hiptic. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalOSCore; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3C115174289A259500565C41 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 99SW8E36CT; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = OneSignalOSCoreFramework/Info.plist; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2022 Hiptic. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalOSCore; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 3CC063A92B6D7A8E002BB07F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 99SW8E36CT; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2024 Hiptic. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalCoreMocks; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3CC063AA2B6D7A8E002BB07F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 99SW8E36CT; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2024 Hiptic. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalCoreMocks; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 3CC063AB2B6D7A8E002BB07F /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 99SW8E36CT; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2024 Hiptic. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalCoreMocks; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Test; + }; + 3CC063AC2B6D7A8E002BB07F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalCoreMocksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UnitTestApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/UnitTestApp"; + }; + name = Release; + }; + 3CC063AD2B6D7A8E002BB07F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalCoreMocksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UnitTestApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/UnitTestApp"; + }; + name = Debug; + }; + 3CC063AE2B6D7A8E002BB07F /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalCoreMocksTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UnitTestApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/UnitTestApp"; + }; + name = Test; + }; + 3CC063E22B6D7F2A002BB07F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -3415,22 +4362,25 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_C_LANGUAGE_STANDARD = gnu11; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = OneSignalOSCoreFramework/Info.plist; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2022 Hiptic. All rights reserved."; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2024 Hiptic. All rights reserved."; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - OTHER_CFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalOSCore; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalUserMocks; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -3438,14 +4388,13 @@ }; name = Release; }; - 3C115174289A259500565C41 /* Debug */ = { + 3CC063E32B6D7F2A002BB07F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -3469,8 +4418,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -3478,20 +4429,21 @@ "$(inherited)", ); GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = OneSignalOSCoreFramework/Info.plist; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2022 Hiptic. All rights reserved."; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2024 Hiptic. All rights reserved."; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalOSCore; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalUserMocks; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -3501,6 +4453,209 @@ }; name = Debug; }; + 3CC063E42B6D7F2A002BB07F /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 99SW8E36CT; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright ยฉ 2024 Hiptic. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalUserMocks; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Test; + }; + 3CC063F32B6D7FE8002BB07F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalUserTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UnitTestApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/UnitTestApp"; + }; + name = Release; + }; + 3CC063F42B6D7FE8002BB07F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalUserTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UnitTestApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/UnitTestApp"; + }; + name = Debug; + }; + 3CC063F52B6D7FE8002BB07F /* Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.OneSignalUserTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UnitTestApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/UnitTestApp"; + }; + name = Test; + }; CA2951B62167F4120064227A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3629,7 +4784,7 @@ GCC_PREPROCESSOR_DEFINITIONS = OS_TEST; HEADER_SEARCH_PATHS = $CONFIGURATION_TEMP_DIR/UnitTests.build/DerivedSources; INFOPLIST_FILE = UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; @@ -3798,7 +4953,7 @@ GCC_PREPROCESSOR_DEFINITIONS = OS_TEST; HEADER_SEARCH_PATHS = $CONFIGURATION_TEMP_DIR/UnitTests.build/DerivedSources; INFOPLIST_FILE = UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; @@ -3967,7 +5122,7 @@ GCC_PREPROCESSOR_DEFINITIONS = OS_TEST; HEADER_SEARCH_PATHS = $CONFIGURATION_TEMP_DIR/UnitTests.build/DerivedSources; INFOPLIST_FILE = UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; @@ -5494,6 +6649,46 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 3CC063AF2B6D7A8E002BB07F /* Build configuration list for PBXNativeTarget "OneSignalCoreMocks" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3CC063A92B6D7A8E002BB07F /* Release */, + 3CC063AA2B6D7A8E002BB07F /* Debug */, + 3CC063AB2B6D7A8E002BB07F /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3CC063B02B6D7A8E002BB07F /* Build configuration list for PBXNativeTarget "OneSignalCoreTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3CC063AC2B6D7A8E002BB07F /* Release */, + 3CC063AD2B6D7A8E002BB07F /* Debug */, + 3CC063AE2B6D7A8E002BB07F /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3CC063E12B6D7F2A002BB07F /* Build configuration list for PBXNativeTarget "OneSignalUserMocks" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3CC063E22B6D7F2A002BB07F /* Release */, + 3CC063E32B6D7F2A002BB07F /* Debug */, + 3CC063E42B6D7F2A002BB07F /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3CC063F22B6D7FE8002BB07F /* Build configuration list for PBXNativeTarget "OneSignalUserTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3CC063F32B6D7FE8002BB07F /* Release */, + 3CC063F42B6D7FE8002BB07F /* Debug */, + 3CC063F52B6D7FE8002BB07F /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 3E24003F1D4FFC31008BDE70 /* Build configuration list for PBXNativeTarget "OneSignalFramework" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalCoreTests.xcscheme b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalCoreTests.xcscheme new file mode 100644 index 000000000..14c506584 --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalCoreTests.xcscheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalUserTests.xcscheme b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalUserTests.xcscheme new file mode 100644 index 000000000..a953a4573 --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/OneSignalUserTests.xcscheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOneSignalClient.swift b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOneSignalClient.swift new file mode 100644 index 000000000..163bf465a --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOneSignalClient.swift @@ -0,0 +1,139 @@ +/* + Modified MIT License + Copyright 2024 OneSignal + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + 2. All copies of substantial portions of the Software may only be used in connection + with services provided by OneSignal. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +import Foundation +import OneSignalCore + +/** + This mock client is still adapting, and some logic from the existing OneSignalClientOverrider have been brought to here. + */ +@objc +public class MockOneSignalClient: NSObject, IOneSignalClient { + public let executionQueue: DispatchQueue = DispatchQueue(label: "com.onesignal.execution") + + var mockResponses: [String: [String: Any]] = [:] + public var lastHTTPRequest: OneSignalRequest? + public var networkRequestCount = 0 + public var executedRequests: [OneSignalRequest] = [] + public var executeInstantaneously = true + + var remoteParamsResponse: [String: Any]? + var shouldUseProvisionalAuthorization = false // new in iOS 12 (aka Direct to History) + var remoteParamsOutcomes: [String: Any] = [:] + + /** May add to or change this default remote params response*/ + public func getRemoteParamsResponse() -> [String: Any] { + return remoteParamsResponse ?? [ + IOS_FBA: true, + IOS_USES_PROVISIONAL_AUTHORIZATION: shouldUseProvisionalAuthorization, + IOS_RECEIVE_RECEIPTS_ENABLE: true, + "outcomes": remoteParamsOutcomes + ] + } + + public func enableOutcomes() { + remoteParamsOutcomes = [ + "direct": [ + "enabled": true + ], + "indirect": [ + "notification_attribution": [ + "minutes_since_displayed": 1440, + "limit": 10 + ], + "enabled": true + ], + "unattributed": [ + "enabled": true + ] + ] + } + + // Temp. method to log info while building unit tests + @objc public func logSelfInfo() { + print("๐Ÿงช MockOneSignalClient with executionQueue \(executionQueue)") + } + + public func reset() { + mockResponses = [:] + lastHTTPRequest = nil + networkRequestCount = 0 + executedRequests.removeAll() + executeInstantaneously = true + remoteParamsResponse = nil + shouldUseProvisionalAuthorization = false + remoteParamsOutcomes = [:] + } + + public func execute(_ request: OneSignalRequest, onSuccess successBlock: @escaping OSResultSuccessBlock, onFailure failureBlock: @escaping OSFailureBlock) { + print("๐Ÿงช MockOneSignalClient execute called") + + executedRequests.append(request) + + if executeInstantaneously { + finishExecutingRequest(request, onSuccess: successBlock, onFailure: failureBlock) + } else { + executionQueue.async { + self.finishExecutingRequest(request, onSuccess: successBlock, onFailure: failureBlock) + } + } + } + + func finishExecutingRequest(_ request: OneSignalRequest, onSuccess successBlock: OSResultSuccessBlock, onFailure failureBlock: OSFailureBlock) { + + // TODO: This entire method needs to contained within the equivalent of @synchronized โ—๏ธ + print("๐Ÿงช completing HTTP request: \(request)") + + // TODO: Check for existence of app_id in the request and fail if not. + + self.didCompleteRequest(request) + + // Switch between types of requests with mock responses + if request.isKind(of: OSRequestGetIosParams.self) { + // send a mock remote params response + successBlock(["mockTodo": "responseTodo"]) + } + if (mockResponses[String(describing: request)]) != nil { + successBlock(mockResponses[String(describing: request)]) + } else { + print("๐Ÿงช cannot find a mock response for request: \(request)") + } + } + + func didCompleteRequest(_ request: OneSignalRequest) { + networkRequestCount += 1 + + print("๐Ÿงช didCompleteRequest url(\(networkRequestCount)): \(String(describing: request.urlRequest().url)) params: \(String(describing: request.parameters))") + + lastHTTPRequest = request + } + + /** This is not currently hooked up to anything to run */ + @objc public func runBackgroundThreads() { + // Obj-C implementation: dispatch_sync(executionQueue, ^{}) + executionQueue.sync {} + } + + public func setMockResponseForRequest(request: String, response: [String: Any]) { + mockResponses[request] = response + } +} diff --git a/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.h b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.h new file mode 100644 index 000000000..879be8ca7 --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.h @@ -0,0 +1,32 @@ +/* + Modified MIT License + Copyright 2024 OneSignal + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + 2. All copies of substantial portions of the Software may only be used in connection + with services provided by OneSignal. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ +#import + +//! Project version number for OneSignalCoreMocks. +FOUNDATION_EXPORT double OneSignalCoreMocksVersionNumber; + +//! Project version string for OneSignalCoreMocks. +FOUNDATION_EXPORT const unsigned char OneSignalCoreMocksVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.swift b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.swift new file mode 100644 index 000000000..587eb102b --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/OneSignalCoreMocks.swift @@ -0,0 +1,46 @@ +/* + Modified MIT License + Copyright 2024 OneSignal + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + 2. All copies of substantial portions of the Software may only be used in connection + with services provided by OneSignal. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +import Foundation +import OneSignalCore + +@objc +public class OneSignalCoreMocks: NSObject { + + public static func clearUserDefaults() { + guard let userDefaults = OneSignalUserDefaults.initStandard().userDefaults else { + return + } + let dictionary = userDefaults.dictionaryRepresentation() + for key in dictionary.keys { + userDefaults.removeObject(forKey: key) + } + + guard let sharedUserDefaults = OneSignalUserDefaults.initShared().userDefaults else { + return + } + let sharedDictionary = sharedUserDefaults.dictionaryRepresentation() + for key in sharedDictionary.keys { + sharedUserDefaults.removeObject(forKey: key) + } + } +} diff --git a/iOS_SDK/OneSignalSDK/OneSignalCoreTests/OneSignalCoreTests.swift b/iOS_SDK/OneSignalSDK/OneSignalCoreTests/OneSignalCoreTests.swift new file mode 100644 index 000000000..7187b5f0c --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalCoreTests/OneSignalCoreTests.swift @@ -0,0 +1,76 @@ +/* + Modified MIT License + + Copyright 2023 OneSignal + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + 2. All copies of substantial portions of the Software may only be used in connection + + with services provided by OneSignal. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +import XCTest +import OneSignalCore + +final class OneSignalCoreTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + /** + Pre-existing test on player model. + This test was moved here to set up and test this Core Test module. + */ + func testNotificationJson() throws { + let aps = [ + "aps": [ + "content-available": 1, + "mutable-content": 1, + "alert": "Message Body", + "relevance-score": 0.15, + "interruption-level": "time-sensitive" + ], + "os_data": [ + "i": "notif id", + "ti": "templateId123", + "tn": "Template name" + ]] + let notification: OSNotification = try XCTUnwrap(OSNotification.parse(withApns: aps)) + let json = notification.jsonRepresentation() + + let notificationId: String = try XCTUnwrap(json["notificationId"]) as! String + let contentAvailable: Bool = try XCTUnwrap(json["contentAvailable"]) as! Bool + let mutableContent: Bool = try XCTUnwrap(json["mutableContent"]) as! Bool + let body: String = try XCTUnwrap(json["body"]) as! String + let templateId: String = try XCTUnwrap(json["templateId"]) as! String + let templateName: String = try XCTUnwrap(json["templateName"]) as! String + + XCTAssertEqual(notificationId, "notif id") + XCTAssertEqual(contentAvailable, true) + XCTAssertEqual(mutableContent, true) + XCTAssertEqual(body, "Message Body") + XCTAssertEqual(templateId, "templateId123") + XCTAssertEqual(templateName, "Template name") + } +} diff --git a/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.h b/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.h new file mode 100644 index 000000000..58aaede90 --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.h @@ -0,0 +1,32 @@ +/* + Modified MIT License + Copyright 2024 OneSignal + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + 2. All copies of substantial portions of the Software may only be used in connection + with services provided by OneSignal. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ +#import + +//! Project version number for OneSignalUserMocks. +FOUNDATION_EXPORT double OneSignalUserMocksVersionNumber; + +//! Project version string for OneSignalUserMocks. +FOUNDATION_EXPORT const unsigned char OneSignalUserMocksVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift b/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift new file mode 100644 index 000000000..229a6e27d --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift @@ -0,0 +1,74 @@ +/* + Modified MIT License + + Copyright 2024 OneSignal + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + 2. All copies of substantial portions of the Software may only be used in connection + with services provided by OneSignal. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +import Foundation +import OneSignalOSCore +@testable import OneSignalUser + +@objc +public class OneSignalUserMocks: NSObject { + + // TODO: create mocked server responses to user requests + + public static func reset() { + resetStaticUserExecutor() + resetUserManager() + } + + public static func resetStaticUserExecutor() { + OSUserExecutor.userRequestQueue.removeAll() + OSUserExecutor.transferSubscriptionRequestQueue.removeAll() + OSUserExecutor.identityModels.removeAll() + } + + /** + User Manager needs to reset between tests until we dependency inject the User Manager. + For example, executors it owns may have cached requests or deltas that would have carried over. + This is adapting as more data needs to be considered and reset... + */ + public static func resetUserManager() { + OneSignalUserManagerImpl.sharedInstance.identityModelStore.clearModelsFromStore() + OneSignalUserManagerImpl.sharedInstance.propertiesModelStore.clearModelsFromStore() + OneSignalUserManagerImpl.sharedInstance.subscriptionModelStore.clearModelsFromStore() + OneSignalUserManagerImpl.sharedInstance.pushSubscriptionModelStore.clearModelsFromStore() + + let propertyExecutor = OSPropertyOperationExecutor() + let identityExecutor = OSIdentityOperationExecutor() + let subscriptionExecutor = OSSubscriptionOperationExecutor() + + OneSignalUserManagerImpl.sharedInstance.propertyExecutor = propertyExecutor + OneSignalUserManagerImpl.sharedInstance.identityExecutor = identityExecutor + OneSignalUserManagerImpl.sharedInstance.subscriptionExecutor = subscriptionExecutor + + // TODO: Reset Operation Repo first + // OSCoreMocks.resetOperationRepo() + + OSOperationRepo.sharedInstance.addExecutor(identityExecutor) + OSOperationRepo.sharedInstance.addExecutor(propertyExecutor) + OSOperationRepo.sharedInstance.addExecutor(subscriptionExecutor) + } +} diff --git a/iOS_SDK/OneSignalSDK/OneSignalUserTests/OneSignalUserTests.swift b/iOS_SDK/OneSignalSDK/OneSignalUserTests/OneSignalUserTests.swift new file mode 100644 index 000000000..a53197056 --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalUserTests/OneSignalUserTests.swift @@ -0,0 +1,65 @@ +/* + Modified MIT License + + Copyright 2024 OneSignal + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + 1. The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + 2. All copies of substantial portions of the Software may only be used in connection +with services provided by OneSignal. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +import XCTest +import OneSignalCore +import OneSignalCoreMocks +import OneSignalUserMocks +@testable import OneSignalUser + +final class OneSignalUserTests: XCTestCase { + + override func setUpWithError() throws { + // TODO: Something like the existing [UnitTestCommonMethods beforeEachTest:self]; + // App ID is set because User Manager has guards against nil App ID + OneSignalConfigManager.setAppId("test-app-id") + // Temp. logging to help debug during testing + OneSignalLog.setLogLevel(.LL_VERBOSE) + } + + override func tearDownWithError() throws { + // TODO: Need to clear all data between tests for user manager, models, etc. + OneSignalCoreMocks.clearUserDefaults() + OneSignalUserMocks.reset() + } + + // Comparable to Android test: "externalId is backed by the identity model" + func testLoginSetsExternalId() throws { + /* Setup */ + OneSignalCore.setSharedClient(MockOneSignalClient()) + + /* When */ + OneSignalUserManagerImpl.sharedInstance.login(externalId: "my-external-id", token: nil) + + /* Then */ + let identityModelStoreExternalId = OneSignalUserManagerImpl.sharedInstance.identityModelStore.getModel(key: OS_IDENTITY_MODEL_KEY)?.externalId + let userInstanceExternalId = OneSignalUserManagerImpl.sharedInstance.user.identityModel.externalId + + XCTAssertEqual(identityModelStoreExternalId, "my-external-id") + XCTAssertEqual(userInstanceExternalId, "my-external-id") + } +} From d6102b44b05e40a59175ae81b1547a1fc8b75f95 Mon Sep 17 00:00:00 2001 From: Nan Date: Tue, 13 Feb 2024 20:58:03 -0800 Subject: [PATCH 6/9] Delete old "user model" test files * Delete old "user model" test files `UserModelObjcTests.m and `UserModelSwiftTests.swift` - These weren't real tests --- .../OneSignal.xcodeproj/project.pbxproj | 8 - .../UnitTests/UserModelObjcTests.m | 210 ------------------ .../UnitTests/UserModelSwiftTests.swift | 196 ---------------- 3 files changed, 414 deletions(-) delete mode 100644 iOS_SDK/OneSignalSDK/UnitTests/UserModelObjcTests.m delete mode 100644 iOS_SDK/OneSignalSDK/UnitTests/UserModelSwiftTests.swift diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index 78019bd5b..9194e4a7c 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -67,8 +67,6 @@ 3C14E39F2AFAE39B006ED053 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C14E39E2AFAE39B006ED053 /* PrivacyInfo.xcprivacy */; }; 3C14E3A12AFAE461006ED053 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C14E3A02AFAE461006ED053 /* PrivacyInfo.xcprivacy */; }; 3C14E3A42AFAE54C006ED053 /* OneSignalSwiftInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC08AFF2947D4E900C81DA3 /* OneSignalSwiftInterface.swift */; }; - 3C2C7DC4288E007E0020F9AE /* UserModelSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2C7DC3288E007E0020F9AE /* UserModelSwiftTests.swift */; }; - 3C2C7DC6288E00AA0020F9AE /* UserModelObjcTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2C7DC5288E00AA0020F9AE /* UserModelObjcTests.m */; }; 3C2C7DC8288F3C020020F9AE /* OSSubscriptionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2C7DC7288F3C020020F9AE /* OSSubscriptionModel.swift */; }; 3C2D8A5928B4C4E300BE41F6 /* OSDelta.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2D8A5828B4C4E300BE41F6 /* OSDelta.swift */; }; 3C44673E296D099D0039A49E /* OneSignalMobileProvision.m in Sources */ = {isa = PBXBuildFile; fileRef = 912411FD1E73342200E41FD7 /* OneSignalMobileProvision.m */; }; @@ -947,8 +945,6 @@ 3C14E39E2AFAE39B006ED053 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 3C14E3A02AFAE461006ED053 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 3C2C7DC2288E007E0020F9AE /* UnitTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnitTests-Bridging-Header.h"; sourceTree = ""; }; - 3C2C7DC3288E007E0020F9AE /* UserModelSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserModelSwiftTests.swift; sourceTree = ""; }; - 3C2C7DC5288E00AA0020F9AE /* UserModelObjcTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserModelObjcTests.m; sourceTree = ""; }; 3C2C7DC7288F3C020020F9AE /* OSSubscriptionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSSubscriptionModel.swift; sourceTree = ""; }; 3C2D8A5828B4C4E300BE41F6 /* OSDelta.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSDelta.swift; sourceTree = ""; }; 3C448B9B2936ADFD002F96BC /* OSBackgroundTaskHandlerImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OSBackgroundTaskHandlerImpl.h; sourceTree = ""; }; @@ -1831,8 +1827,6 @@ 911E2CBB1E398AB3003112A4 /* UnitTests */ = { isa = PBXGroup; children = ( - 3C2C7DC5288E00AA0020F9AE /* UserModelObjcTests.m */, - 3C2C7DC3288E007E0020F9AE /* UserModelSwiftTests.swift */, 03CCCC802835D902004BF794 /* UNNotificationCenter */, 7A5A818324899050002E07C8 /* Models */, 03866CBE2378A5ED0009C1D8 /* Asserts */, @@ -3397,7 +3391,6 @@ 91F60F7D1E80E4E400706E60 /* UncaughtExceptionHandler.m in Sources */, 912412201E73342200E41FD7 /* OneSignalJailbreakDetection.m in Sources */, 03E56DD328405F4A006AA1DA /* OneSignalAppDelegateOverrider.m in Sources */, - 3C2C7DC4288E007E0020F9AE /* UserModelSwiftTests.swift in Sources */, 7ABAF9D82457DD620074DFA0 /* SessionManagerTests.m in Sources */, CA85C15320604AEA003AB529 /* RequestTests.m in Sources */, 9D34853A233D2E3600EB81C9 /* OneSignalLocationOverrider.m in Sources */, @@ -3444,7 +3437,6 @@ 912412401E73342200E41FD7 /* UIApplicationDelegate+OneSignal.m in Sources */, CACBAAAA218A65AE000ACAA5 /* InAppMessagingTests.m in Sources */, 3C9AD6D52B22A8C400BC1540 /* OneSignalLiveActivityController.m in Sources */, - 3C2C7DC6288E00AA0020F9AE /* UserModelObjcTests.m in Sources */, 4529DEDB1FA8284E00CEAB1D /* NSDataOverrider.m in Sources */, A662399326850DDE00D52FD8 /* LanguageTest.m in Sources */, DEA4B44E2888AF8900E9FE12 /* OneSignalUNUserNotificationCenterOverrider.m in Sources */, diff --git a/iOS_SDK/OneSignalSDK/UnitTests/UserModelObjcTests.m b/iOS_SDK/OneSignalSDK/UnitTests/UserModelObjcTests.m deleted file mode 100644 index 5d908c1c8..000000000 --- a/iOS_SDK/OneSignalSDK/UnitTests/UserModelObjcTests.m +++ /dev/null @@ -1,210 +0,0 @@ -/* - Modified MIT License - - Copyright 2022 OneSignal - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - 1. The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - 2. All copies of substantial portions of the Software may only be used in connection - with services provided by OneSignal. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ - -#import -#import "OneSignalFramework.h" - -@interface UserModelObjcTests : XCTestCase - -@end - - -@interface OSPushSubscriptionTestObserver: NSObject -- (void)onPushSubscriptionDidChangeWithState:(OSPushSubscriptionChangedState * _Nonnull)state; -@end - -@implementation OSPushSubscriptionTestObserver -- (void)onPushSubscriptionDidChangeWithState:(OSPushSubscriptionChangedState * _Nonnull)state { - NSLog(@"๐Ÿ”ฅ UnitTest:onOSPushSubscriptionChanged :%@ :%@", state.previous, state.current); - -} -@end - -@implementation UserModelObjcTests - -- (void)setUp { - // Put setup code here. This method is called before the invocation of each test method in the class. - [super setUp]; -} - -- (void)tearDown { - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -/** - This test lays out the public APIs of the user model - */ -- (void)testUserModelMethodAccess { - - // User Identity - [OneSignal login:@"foo"]; - [OneSignal login:@"foo" withToken:@"someToken"]; - [OneSignal login:@"foo" withToken:nil]; - - [OneSignal logout]; - - // Aliases - [OneSignal.User addAliasWithLabel:@"foo" id:@"foo1"]; - [OneSignal.User addAliases:@{@"foo": @"foo1", @"bar": @"bar2"}]; - [OneSignal.User removeAlias:@"foo"]; - [OneSignal.User removeAliases:@[@"foo", @"bar"]]; - - // Tags - [OneSignal.User addTagWithKey:@"foo" value:@"bar"]; - [OneSignal.User addTags:@{@"foo": @"foo1", @"bar": @"bar2"}]; - [OneSignal.User removeTag:@"foo"]; - [OneSignal.User removeTags:@[@"foo", @"bar"]]; - - // Email - [OneSignal.User addEmail:@"person@example.com"]; - [OneSignal.User removeEmail:@"person@example.com"]; - - // SMS - [OneSignal.User addSms:@"+15551231234"]; - [OneSignal.User removeSms:@"+15551231234"]; - - // Triggers - [OneSignal.InAppMessages addTrigger:@"foo" withValue:@"bar"]; - [OneSignal.InAppMessages addTriggers:@{@"foo": @"foo1", @"bar": @"bar2"}]; - [OneSignal.InAppMessages removeTrigger:@"foo"]; - [OneSignal.InAppMessages removeTriggers:@[@"foo", @"bar"]]; - [OneSignal.InAppMessages clearTriggers]; -} - -/** - This is to collect things that should not work, but do for now. - */ -- (void)testTheseShouldNotWork { - // Should not be settable - // OneSignal.user.pushSubscription.token = [NSUUID new]; // <- Confirmed that users can't set token - // OneSignal.user.pushSubscription.subscriptionId = [NSUUID new]; // <- Confirmed that users can't set subscriptionId -} - -/** - Test the access of properties and methods, and setting properties related to the push subscription. - */ -- (void)testPushSubscriptionPropertiesAccess { - // TODO: Fix these unit tests -// // Create a user and mock pushSubscription -// id user = OneSignal.user; -// [user testCreatePushSubscriptionWithSubscriptionId:[NSUUID new] token:[NSUUID new] enabled:false]; -// -// // Access properties of the pushSubscription -// NSUUID* subscriptionId = user.pushSubscription.subscriptionId; -// NSUUID* token = user.pushSubscription.token; -// bool enabled = user.pushSubscription.enabled; // BOOL or bool preferred? -// -// // Set the enabled property of the pushSubscription -// user.pushSubscription.enabled = true; -// -// // Create a push subscription observer -// OSPushSubscriptionTestObserver* observer = [OSPushSubscriptionTestObserver new]; - - // Push subscription observers are not user-scoped -// [OneSignal addSubscriptionObserver:observer]; -// [OneSignal removeSubscriptionObserver:observer]; -} - -/** - Test the model repo hook up via a login with external ID and setting alias. - Test the operation repo hookup as well and check the deltas being enqueued and flushed. - */ -- (void)testModelAndOperationRepositoryHookUpWithLoginAndSetAlias { - // login an user with external ID - [OneSignal login:@"user01"]; - - // Check that deltas for alias (Identity) are created correctly and enqueued. - NSLog(@"๐Ÿ”ฅ Unit Tests adding alias label_01: user_01"); - [OneSignal.User addAliasWithLabel:@"label_01" id:@"user_01"]; - [OneSignal.User removeAlias:@"nonexistent"]; - [OneSignal.User removeAlias:@"label_01"]; - [OneSignal.User addAliasWithLabel:@"label_02" id:@"user_02"]; - [OneSignal.User addAliases:@{@"test1": @"user1", @"test2": @"user2", @"test3": @"user3"}]; - [OneSignal.User removeAliases:@[@"test1", @"label_01", @"test2"]]; - - [OneSignal.User addTagWithKey:@"foo" value:@"bar"]; - - // Sleep to allow the flush to be called 1 time. - [NSThread sleepForTimeInterval:6.0f]; -} - -/** - Test login and logout and creation of guest users. - */ -- (void)testLoginLogout { - // A guest user is created when OneSignal.User is accessed - [OneSignal.User addEmail:@"test@email.com"]; - - // ... and more to be added -} - -/** - Test email and sms subscriptions. 2 Deltas are created for each add. - */ -- (void)testEmailAndSmsSubscriptions { - [OneSignal.User addEmail:@"test@example.com"]; - [OneSignal.User addSms:@"+15551231234"]; - - // Sleep to allow the flush to be called 1 time. - [NSThread sleepForTimeInterval:6.0f]; -} - -/** - Test setLocation lat long - */ -- (void)testSetLocation { - [OneSignalUserManagerImpl.sharedInstance setLocationWithLatitude:37.5 longitude:122.3]; -} - -/** - Temp tester. - */ -- (void)testTempTester { - - [OneSignal.Notifications requestPermission:^(BOOL accepted) { - NSLog(@"๐Ÿ”ฅ promptForPushNotificationsWithUserResponse: %d", accepted); - }]; - - [OneSignal.Notifications requestPermission:^(BOOL accepted) { - NSLog(@"๐Ÿ”ฅ promptForPushNotificationsWithUserResponse: %d", accepted); - } fallbackToSettings:true]; - - // IAM Pausing - [OneSignal.InAppMessages paused:true]; - BOOL paused = [OneSignal.InAppMessages paused]; -} - -- (void)testOnJwtExpired { - // TODO: Fix autocompletion. It isn't auto completing parameter names which makes this unreadable - [OneSignal.User onJwtExpiredWithExpiredHandler:^(NSString * _Nonnull externalId, void (^ _Nonnull completion)(NSString * _Nonnull)) { - NSString *newToken = externalId; - completion(newToken); - }]; -} - -@end diff --git a/iOS_SDK/OneSignalSDK/UnitTests/UserModelSwiftTests.swift b/iOS_SDK/OneSignalSDK/UnitTests/UserModelSwiftTests.swift deleted file mode 100644 index 9b9fb5f9b..000000000 --- a/iOS_SDK/OneSignalSDK/UnitTests/UserModelSwiftTests.swift +++ /dev/null @@ -1,196 +0,0 @@ -/* - Modified MIT License - - Copyright 2022 OneSignal - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - 1. The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - 2. All copies of substantial portions of the Software may only be used in connection - with services provided by OneSignal. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ - -import XCTest - -// Non-class type 'OSPushSubscriptionTestObserver' cannot conform to class protocol 'OSPushSubscriptionObserver' -// ^ Cannot use a struct for an OSPushSubscriptionObserver - -class OSPushSubscriptionTestObserver: OSPushSubscriptionObserver { - func onPushSubscriptionDidChange(state: OneSignalUser.OSPushSubscriptionChangedState) { - print("๐Ÿ”ฅ onPushSubscriptionDidChange \(state.previous) -> \(state.current)") - // dump(stateChanges.from) -> uncomment for more verbose log during testing - // dump(stateChanges.to) -> uncomment for more verbose log during testing - } -} - -class UserModelSwiftTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - try super.setUpWithError() - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - try super.tearDownWithError() - } - - /** - This test lays out the public APIs of the user model - */ - func testUserModelMethodAccess() throws { - - // User Identity - OneSignal.login("foo") - OneSignal.login(externalId: "foo", token: "someToken") - OneSignal.login(externalId: "foo", token: nil) - OneSignal.logout() - - // Aliases - OneSignal.User.addAlias(label: "foo", id: "bar") - OneSignal.User.addAliases(["foo": "foo1", "bar": "bar2"]) - OneSignal.User.removeAlias("foo") - OneSignal.User.removeAliases(["foo", "bar"]) - - // Tags - OneSignal.User.addTag(key: "foo", value: "bar") - OneSignal.User.addTags(["foo": "foo1", "bar": "bar2"]) - OneSignal.User.removeTag("foo") - OneSignal.User.removeTags(["foo", "bar"]) - - // Email - OneSignal.User.addEmail("person@example.com") - _ = OneSignal.User.removeEmail("person@example.com") - - // SMS - OneSignal.User.addSms("+15551231234") - _ = OneSignal.User.removeSms("+15551231234") - - // Triggers - OneSignal.InAppMessages.addTrigger("foo", withValue: "bar") - OneSignal.InAppMessages.addTriggers(["foo": "foo1", "bar": "bar2"]) - OneSignal.InAppMessages.removeTrigger("foo") - OneSignal.InAppMessages.removeTriggers(["foo", "bar"]) - OneSignal.InAppMessages.clearTriggers() - - // OneSignal.InAppMessages.addClickListener(listener) - // OneSignal.InAppMessages.addLifecycleListener(listener) - } - - /** - This is to collect things that should not work, but do for now. - */ - func testTheseShouldNotWork() throws { - // Should not be settable - // OneSignal.user.pushSubscription.token = UUID() // <- Confirmed that users can't set token - // OneSignal.user.pushSubscription.subscriptionId = UUID() // <- Confirmed that users can't set subscriptionId - } - - /** - Test the access of properties and methods, and setting properties related to the push subscription. - */ - func testPushSubscriptionPropertiesAccess() throws { - // TODO: Fix these unit tests - -// // Create a user and mock pushSubscription -// let user = OneSignal.user -// user.testCreatePushSubscription(subscriptionId: UUID(), token: UUID(), enabled: false) -// -// // Access properties of the pushSubscription -// _ = user.pushSubscription.subscriptionId -// _ = user.pushSubscription.token -// _ = user.pushSubscription.enabled -// -// // Set the enabled property of the pushSubscription -// user.pushSubscription.enabled = true -// -// // Create a push subscription observer -// let observer = OSPushSubscriptionTestObserver() - - // Push subscription observers are not user-scoped - // TODO: UM The following does not build as of now - // OneSignal.addSubscriptionObserver(observer) - // OneSignal.removeSubscriptionObserver(observer) - } - - /** - Test the model repo hook up via a login with external ID and setting alias. - Test the operation repo hookup as well and check the deltas being enqueued and flushed. - */ - func testModelAndOperationRepositoryHookUpWithLoginAndSetAlias() throws { - // login an user with external ID - OneSignal.login("user01") - - // Check that deltas for alias (Identity) are created correctly and enqueued. - print("๐Ÿ”ฅ Unit Tests adding alias label_01: user_01") - OneSignal.User.addAlias(label: "label_01", id: "user_01") - OneSignal.User.removeAlias("nonexistent") - OneSignal.User.removeAlias("label_01") - OneSignal.User.addAlias(label: "label_02", id: "user_02") - OneSignal.User.addAliases(["test1": "user1", "test2": "user2", "test3": "user3"]) - OneSignal.User.removeAliases(["test1", "label_01", "test2"]) - - OneSignal.User.addTag(key: "foo", value: "bar") - - // Sleep to allow the flush to be called 1 time. - Thread.sleep(forTimeInterval: 6) - } - - /** - Test login and logout and creation of guest users. - */ - func testLoginLogout() throws { - // A guest user is created when OneSignal.User is accessed - OneSignal.User.addEmail("test@email.com") - // ... and more to be added - } - - /** - Test email and sms subscriptions. 2 Deltas are created for each add. - */ - func testEmailAndSmsSubscriptions() throws { - OneSignal.User.addEmail("test@example.com") - OneSignal.User.addSms("+15551231234") - - // Sleep to allow the flush to be called 1 time. - Thread.sleep(forTimeInterval: 6) - } - - /** - Temp test. - */ - func testTempTester() throws { - OneSignal.Notifications.requestPermission { accepted in - print("๐Ÿ”ฅ promptForPushNotificationsWithUserResponse: \(accepted)") - } - OneSignal.Notifications.requestPermission({ accepted in - print("๐Ÿ”ฅ promptForPushNotificationsWithUserResponse: \(accepted)") - }, fallbackToSettings: true) - - // IAM pausing - OneSignal.InAppMessages.paused = true - let paused = OneSignal.InAppMessages.paused - } - - func testJWTTokenExpired() { - OneSignal.User.onJwtExpired { externalId, completion in - let newToken = externalId + "newtokenbasedonexternalid" - completion(newToken) - } - } -} From 144dfd7a48dd4f82d350df468e896c5cedf27261 Mon Sep 17 00:00:00 2001 From: Nan Date: Wed, 14 Feb 2024 13:05:54 -0800 Subject: [PATCH 7/9] [tests] add swiftlint file for tests * We want to use force casts in testing --- iOS_SDK/OneSignalSDK/OneSignalCoreTests/.swiftlint.yml | 3 +++ iOS_SDK/OneSignalSDK/OneSignalUserTests/.swiftlint.yml | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 iOS_SDK/OneSignalSDK/OneSignalCoreTests/.swiftlint.yml create mode 100644 iOS_SDK/OneSignalSDK/OneSignalUserTests/.swiftlint.yml diff --git a/iOS_SDK/OneSignalSDK/OneSignalCoreTests/.swiftlint.yml b/iOS_SDK/OneSignalSDK/OneSignalCoreTests/.swiftlint.yml new file mode 100644 index 000000000..c6778fb1d --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalCoreTests/.swiftlint.yml @@ -0,0 +1,3 @@ +# in tests, we may want to force cast and throw any errors +disabled_rules: + - force_cast diff --git a/iOS_SDK/OneSignalSDK/OneSignalUserTests/.swiftlint.yml b/iOS_SDK/OneSignalSDK/OneSignalUserTests/.swiftlint.yml new file mode 100644 index 000000000..c6778fb1d --- /dev/null +++ b/iOS_SDK/OneSignalSDK/OneSignalUserTests/.swiftlint.yml @@ -0,0 +1,3 @@ +# in tests, we may want to force cast and throw any errors +disabled_rules: + - force_cast From bdb141602cd99b57fcb5892f75a02b69b6b25dd4 Mon Sep 17 00:00:00 2001 From: Nan Date: Wed, 21 Feb 2024 13:31:31 -0800 Subject: [PATCH 8/9] add OneSignalCore as dependency to OneSignalUserTests * Missed adding this --- .../OneSignal.xcodeproj/project.pbxproj | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index 9194e4a7c..9f816ebc1 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -108,6 +108,8 @@ 3C9AD6DC2B22A8E600BC1540 /* OneSignalInAppMessages.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEBAAE282A4211D900BF2C1C /* OneSignalInAppMessages.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3C9AD6DF2B22A8EC00BC1540 /* OneSignalNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEF784292912DEB600A1F3A5 /* OneSignalNotifications.framework */; }; 3C9AD6E02B22A8EC00BC1540 /* OneSignalNotifications.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEF784292912DEB600A1F3A5 /* OneSignalNotifications.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3CA283A92B86A30400097465 /* OneSignalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; }; + 3CA283AA2B86A30400097465 /* OneSignalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3CA6CE0A28E4F19B00CA0585 /* OSUserRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA6CE0928E4F19B00CA0585 /* OSUserRequest.swift */; }; 3CC063942B6D6B6B002BB07F /* OneSignalCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC063932B6D6B6B002BB07F /* OneSignalCore.m */; }; 3CC063A22B6D7A8E002BB07F /* OneSignalCoreMocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CC0639A2B6D7A8C002BB07F /* OneSignalCoreMocks.framework */; }; @@ -575,6 +577,13 @@ remoteGlobalIDString = DEF784282912DEB600A1F3A5; remoteInfo = OneSignalNotifications; }; + 3CA283AB2B86A30400097465 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE7D17E527026B95002D3A5D; + remoteInfo = OneSignalCore; + }; 3CC063A32B6D7A8E002BB07F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 37747F8B19147D6400558FAD /* Project object */; @@ -840,6 +849,7 @@ dstSubfolderSpec = 10; files = ( 3CEE93432B7C4174008440BD /* OneSignalUserMocks.framework in Embed Frameworks */, + 3CA283AA2B86A30400097465 /* OneSignalCore.framework in Embed Frameworks */, 3C7A39C22B7BED900082665E /* OneSignalCoreMocks.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -1383,6 +1393,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3CA283A92B86A30400097465 /* OneSignalCore.framework in Frameworks */, 3C7A39C12B7BED900082665E /* OneSignalCoreMocks.framework in Frameworks */, 3CC063EF2B6D7FE8002BB07F /* OneSignalUser.framework in Frameworks */, 3CEE93422B7C4174008440BD /* OneSignalUserMocks.framework in Frameworks */, @@ -2747,6 +2758,7 @@ 3C7A39C42B7BED900082665E /* PBXTargetDependency */, 3C7A39E02B7C1C8B0082665E /* PBXTargetDependency */, 3CEE93452B7C4174008440BD /* PBXTargetDependency */, + 3CA283AC2B86A30400097465 /* PBXTargetDependency */, ); name = OneSignalUserTests; productName = OneSignalUserTests; @@ -3680,6 +3692,11 @@ target = DEF784282912DEB600A1F3A5 /* OneSignalNotifications */; targetProxy = 3C9AD6E12B22A8ED00BC1540 /* PBXContainerItemProxy */; }; + 3CA283AC2B86A30400097465 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE7D17E527026B95002D3A5D /* OneSignalCore */; + targetProxy = 3CA283AB2B86A30400097465 /* PBXContainerItemProxy */; + }; 3CC063A42B6D7A8E002BB07F /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 3CC063992B6D7A8C002BB07F /* OneSignalCoreMocks */; From 194832ed8b5e8ea06fc844ae525b0475d3421808 Mon Sep 17 00:00:00 2001 From: Nan Date: Fri, 16 Feb 2024 12:51:20 -0800 Subject: [PATCH 9/9] [tests] update UnitTestApp to include the 2 new test modules - ENABLE_TESTABILITY in OneSignalUserTests and OneSignalCoreTests modules updated to match existing UnitTests - UnitTestApp scheme updated to include OneSignalUserTests and OneSignalCoreTests test modules - Now, the CI runs all tests automatically! --- .../OneSignal.xcodeproj/project.pbxproj | 4 ++ .../xcschemes/UnitTestApp.xcscheme | 62 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index 9f816ebc1..434711331 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -4220,6 +4220,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -4322,6 +4323,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -4547,6 +4549,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -4647,6 +4650,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 99SW8E36CT; + ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/UnitTestApp.xcscheme b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/UnitTestApp.xcscheme index d56906b8f..1f563c564 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/UnitTestApp.xcscheme +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/xcshareddata/xcschemes/UnitTestApp.xcscheme @@ -20,6 +20,34 @@ ReferencedContainer = "container:OneSignal.xcodeproj"> + + + + + + + + + + + + + + + + + + + +