From 54b730dc3d86637ea45dd926056b0f817c3708bb Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Tue, 25 Oct 2022 15:42:07 +0530 Subject: [PATCH 01/13] Added Support for DataResidency feature --- .../project.pbxproj | 8 - .../RudderSampleAppObjC/_AppDelegate.h | 5 +- .../RudderSampleAppObjC/_AppDelegate.m | 137 +----------------- .../RudderSampleAppObjC/_ViewController.m | 58 -------- Podfile | 2 - Podfile.lock | 113 +-------------- Rudder.xcodeproj/project.pbxproj | 8 +- Sources/Classes/Public/RSConfig.h | 3 + Sources/Classes/Public/RSConfigBuilder.h | 2 + Sources/Classes/Public/RSEnums.h | 16 ++ Sources/Classes/Public/RSEventRepository.h | 1 + Sources/Classes/Public/RSServerConfigSource.h | 4 + Sources/Classes/Public/Rudder.h | 1 + Sources/Classes/RSConfig.m | 5 +- Sources/Classes/RSConfigBuilder.m | 8 + Sources/Classes/RSEventRepository.m | 12 +- Sources/Classes/RSServerConfigManager.m | 9 ++ Sources/Classes/RSServerConfigSource.m | 13 ++ 18 files changed, 81 insertions(+), 324 deletions(-) create mode 100644 Sources/Classes/Public/RSEnums.h diff --git a/Examples/RudderSampleAppObjC/RudderSampleAppObjC.xcodeproj/project.pbxproj b/Examples/RudderSampleAppObjC/RudderSampleAppObjC.xcodeproj/project.pbxproj index ca0a88f0..4529b019 100644 --- a/Examples/RudderSampleAppObjC/RudderSampleAppObjC.xcodeproj/project.pbxproj +++ b/Examples/RudderSampleAppObjC/RudderSampleAppObjC.xcodeproj/project.pbxproj @@ -212,19 +212,11 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-RudderSampleAppObjC/Pods-RudderSampleAppObjC-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", - "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", - "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", "${BUILT_PRODUCTS_DIR}/Rudder-iOS/Rudder.framework", - "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Rudder.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.h b/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.h index 031cc7df..249da08c 100644 --- a/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.h +++ b/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.h @@ -7,11 +7,8 @@ // @import UIKit; -@import UserNotifications; -@import Firebase; -@import FirebaseMessaging; -@interface _AppDelegate : UIResponder +@interface _AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; diff --git a/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.m b/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.m index 415508b7..7f5943e0 100644 --- a/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.m +++ b/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_AppDelegate.m @@ -31,6 +31,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [builder withRecordScreenViews:YES]; [builder withEnableBackgroundMode:YES]; [builder withDataPlaneUrl:@"http://localhost:8080"]; + [builder withDataResidencyServer:US]; [builder withCustomFactory:[CustomFactory instance]]; [RSClient getInstance:@"1wvsoF3Kx2SczQNlx1dvcqW9ODW" config:[builder build]]; @@ -56,19 +57,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( ]; [[RSClient sharedInstance] alias:@"new_user_id"]; - [FIRApp configure]; - [FIRMessaging messaging].delegate = self; - - [UNUserNotificationCenter currentNotificationCenter].delegate = self; - UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | - UNAuthorizationOptionSound | UNAuthorizationOptionBadge; - [[UNUserNotificationCenter currentNotificationCenter] - requestAuthorizationWithOptions:authOptions - completionHandler:^(BOOL granted, NSError * _Nullable error) { - // ... - }]; - - [application registerForRemoteNotifications]; return YES; } @@ -79,127 +67,4 @@ - (NSString*) getIDFA { - (NSString*) getDeviceToken { return @"example_device_token"; } - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -// [START receive_message] -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo -fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { - // If you are receiving a notification message while your app is in the background, - // this callback will not be fired till the user taps on the notification launching the application. - // TODO: Handle data of notification - - // With swizzling disabled you must let Messaging know about the message, for Analytics - // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; - - // [START_EXCLUDE] - // Print message ID. - if (userInfo[kGCMMessageIDKey]) { - NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]); - } - // [END_EXCLUDE] - - // Print full message. - NSLog(@"%@", userInfo); - - completionHandler(UIBackgroundFetchResultNewData); -} -// [END receive_message] - -// [START ios_10_message_handling] -// Receive displayed notifications for iOS 10 devices. -// Handle incoming notification messages while app is in the foreground. -- (void)userNotificationCenter:(UNUserNotificationCenter *)center - willPresentNotification:(UNNotification *)notification - withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { - NSDictionary *userInfo = notification.request.content.userInfo; - - // With swizzling disabled you must let Messaging know about the message, for Analytics - // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; - - // [START_EXCLUDE] - // Print message ID. - if (userInfo[kGCMMessageIDKey]) { - NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]); - } - // [END_EXCLUDE] - - // Print full message. - NSLog(@"%@", userInfo); - - // Change this to your preferred presentation option - completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert); -} - -// Handle notification messages after display notification is tapped by the user. -- (void)userNotificationCenter:(UNUserNotificationCenter *)center -didReceiveNotificationResponse:(UNNotificationResponse *)response - withCompletionHandler:(void(^)(void))completionHandler { - NSDictionary *userInfo = response.notification.request.content.userInfo; - if (userInfo[kGCMMessageIDKey]) { - NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]); - } - - // With swizzling disabled you must let Messaging know about the message, for Analytics - // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; - - // Print full message. - NSLog(@"%@", userInfo); - - completionHandler(); -} - -// [END ios_10_message_handling] - -// [START refresh_token] -- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken { - NSLog(@"FCM registration token: %@", fcmToken); - // Notify about received token. - NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"]; - [[NSNotificationCenter defaultCenter] postNotificationName: - @"FCMToken" object:nil userInfo:dataDict]; - // TODO: If necessary send token to application server. - // Note: This callback is fired at each app startup and whenever a new token is generated. -} -// [END refresh_token] - -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - NSLog(@"Unable to register for remote notifications: %@", error); -} - -// This function is added here only for debugging purposes, and can be removed if swizzling is enabled. -// If swizzling is disabled then this function must be implemented so that the APNs device token can be paired to -// the FCM registration token. -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - NSLog(@"APNs device token retrieved: %@", deviceToken); - - // With swizzling disabled you must set the APNs device token here. - // [FIRMessaging messaging].APNSToken = deviceToken; -} - @end diff --git a/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_ViewController.m b/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_ViewController.m index 82d4b146..a4d6b347 100644 --- a/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_ViewController.m +++ b/Examples/RudderSampleAppObjC/RudderSampleAppObjC/_ViewController.m @@ -19,64 +19,6 @@ - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. - -// [[RSClient sharedInstance] identify:@"test_user_id" traits:@{ -// @"firstName": @"Test", -// @"lastName": @"Name", -// @"email": @"test_1@gmail.com", -// @"phone": @"+91-986543210", -// @"company": @{ -// @"id": @"test_company_id", -// @"name": @"Test Company", -// @"industry": @"Test Industry", -// @"address": @"Test Location" -// } -// }]; -// -// [[RSClient sharedInstance] alias:@"some_other_id"]; -// -// [[RSClient sharedInstance] track:@"test_event_2" properties:@{ -// @"string_key_1": @"string_value", -// @"string_key_2": @"string_value", -// @"string_key_3": @"string_value", -// @"string_key_4": @"string_value", -// @"bool_key": @YES, -// @"num_key": @1.2, -// @"dict_key": @{ -// @"c_key_1": @"value_1", -// @"c_key_2": @"value_2" -// } -// }]; - -// RSOption *options = [[RSOption alloc] init]; -// [options putExternalId:@"test" withId:@"test"]; -// [[RSClient sharedInstance] screen:@"ViewController"]; -// [[RSClient sharedInstance] screen:@"Main screen name" properties:@{@"prop_key" : @"prop_value"}]; -// [[RSClient sharedInstance] screen:@"test screen" properties:@{@"prop_key" : @"prop_value"} options:options]; - -// dispatch_async(dispatch_get_main_queue(), ^{ -// NSMutableDictionary *traits = [[NSMutableDictionary alloc] initWithDictionary:@{ -// @"firstName": @"Test", -// @"lastName": @"Name", -// @"email": @"test_1@gmail.com", -// @"phone": @"+91-986543210", -// @"company": @{ -// @"id": @"test_company_id", -// @"name": @"Test Company", -// @"industry": @"Test Industry", -// @"address": @"Test Location" -// }, -// @"user_id": [NSNull null] -// }]; -// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ -// [[RSClient sharedInstance] identify:@"test_user_id" traits:@{}]; -// }); - -// [traits removeAllObjects]; -// [traits setValue:@"Kolkata" forKey:@"address"]; -// }); - - } - (void)didReceiveMemoryWarning diff --git a/Podfile b/Podfile index 22780882..6c8e2c8f 100644 --- a/Podfile +++ b/Podfile @@ -15,8 +15,6 @@ target 'RudderSampleAppObjC' do project 'Examples/RudderSampleAppObjC/RudderSampleAppObjC.xcodeproj' platform :ios, '9.0' shared_pods - pod 'Firebase/Analytics' - pod 'Firebase/Messaging' end target 'RudderSampleAppSwift' do diff --git a/Podfile.lock b/Podfile.lock index 7f50bb1b..968df240 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,127 +1,16 @@ PODS: - - Firebase/Analytics (6.34.0): - - Firebase/Core - - Firebase/Core (6.34.0): - - Firebase/CoreOnly - - FirebaseAnalytics (= 6.9.0) - - Firebase/CoreOnly (6.34.0): - - FirebaseCore (= 6.10.4) - - Firebase/Messaging (6.34.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 4.7.1) - - FirebaseAnalytics (6.9.0): - - FirebaseCore (~> 6.10) - - FirebaseInstallations (~> 1.7) - - GoogleAppMeasurement (= 6.9.0) - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/MethodSwizzler (~> 6.7) - - GoogleUtilities/Network (~> 6.7) - - "GoogleUtilities/NSData+zlib (~> 6.7)" - - nanopb (~> 1.30906.0) - - FirebaseCore (6.10.4): - - FirebaseCoreDiagnostics (~> 1.6) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) - - FirebaseCoreDiagnostics (1.7.0): - - GoogleDataTransport (~> 7.4) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) - - nanopb (~> 1.30906.0) - - FirebaseInstallations (1.7.0): - - FirebaseCore (~> 6.10) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - PromisesObjC (~> 1.2) - - FirebaseInstanceID (4.8.0): - - FirebaseCore (~> 6.10) - - FirebaseInstallations (~> 1.6) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - FirebaseMessaging (4.7.1): - - FirebaseCore (~> 6.10) - - FirebaseInstanceID (~> 4.7) - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Reachability (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - Protobuf (>= 3.9.2, ~> 3.9) - - GoogleAppMeasurement (6.9.0): - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/MethodSwizzler (~> 6.7) - - GoogleUtilities/Network (~> 6.7) - - "GoogleUtilities/NSData+zlib (~> 6.7)" - - nanopb (~> 1.30906.0) - - GoogleDataTransport (7.5.1): - - nanopb (~> 1.30906.0) - - GoogleUtilities/AppDelegateSwizzler (6.7.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (6.7.2): - - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (6.7.2): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (6.7.2): - - GoogleUtilities/Logger - - GoogleUtilities/Network (6.7.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (6.7.2)" - - GoogleUtilities/Reachability (6.7.2): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (6.7.2): - - GoogleUtilities/Logger - - nanopb (1.30906.0): - - nanopb/decode (= 1.30906.0) - - nanopb/encode (= 1.30906.0) - - nanopb/decode (1.30906.0) - - nanopb/encode (1.30906.0) - - PromisesObjC (1.2.12) - - Protobuf (3.21.5) - Rudder (1.7.0) DEPENDENCIES: - - Firebase/Analytics - - Firebase/Messaging - Rudder (from `.`) -SPEC REPOS: - trunk: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseInstallations - - FirebaseInstanceID - - FirebaseMessaging - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - - Protobuf - EXTERNAL SOURCES: Rudder: :path: "." SPEC CHECKSUMS: - Firebase: c23a36d9e4cdf7877dfcba8dd0c58add66358999 - FirebaseAnalytics: 3bb096873ee0d7fa4b6c70f5e9166b6da413cc7f - FirebaseCore: d3a978a3cfa3240bf7e4ba7d137fdf5b22b628ec - FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1 - FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2 - FirebaseInstanceID: bd3ffc24367f901a43c063b36c640b345a4a5dd1 - FirebaseMessaging: 5eca4ef173de76253352511aafef774caa1cba2a - GoogleAppMeasurement: a6a3a066369828db64eda428cb2856dc1cdc7c4e - GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833 - GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc - PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97 - Protobuf: 7504b04fffcf6662ad629694db8231f5e744327f Rudder: b87d9230533ca42a5f48d20d605485cee69e663f -PODFILE CHECKSUM: 33b0e9f1b94a028aa8a3b4aecf718a44c9b6265e +PODFILE CHECKSUM: b22a79db44ea2c78e3500063ff2c7312ef613413 COCOAPODS: 1.11.3 diff --git a/Rudder.xcodeproj/project.pbxproj b/Rudder.xcodeproj/project.pbxproj index 32e86ffa..1f8a6f77 100644 --- a/Rudder.xcodeproj/project.pbxproj +++ b/Rudder.xcodeproj/project.pbxproj @@ -178,6 +178,7 @@ ED83FFFF27310B44006F27B3 /* RSECommerceOrder.h in Headers */ = {isa = PBXBuildFile; fileRef = ED83FF5827310B44006F27B3 /* RSECommerceOrder.h */; settings = {ATTRIBUTES = (Public, ); }; }; F623D3AB27954BF10027CBC3 /* RSEventFilteringPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = F623D3AA27954BF10027CBC3 /* RSEventFilteringPlugin.m */; }; F623D3AD27954C010027CBC3 /* RSEventFilteringPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = F623D3AC27954C010027CBC3 /* RSEventFilteringPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F669056F2907EB8800FE4507 /* RSEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = F65E31162907E8BF00B46FB6 /* RSEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; F6A146842769DBC6009EF620 /* WKInterfaceController+RSScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = F6A146832769DBC5009EF620 /* WKInterfaceController+RSScreen.h */; settings = {ATTRIBUTES = (Public, ); }; }; F6A1468A2769E28A009EF620 /* WKInterfaceController+RSScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = F6A146892769E28A009EF620 /* WKInterfaceController+RSScreen.m */; }; /* End PBXBuildFile section */ @@ -363,6 +364,7 @@ ED83FFB627310B44006F27B3 /* RSLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSLogger.m; sourceTree = ""; }; F623D3AA27954BF10027CBC3 /* RSEventFilteringPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSEventFilteringPlugin.m; sourceTree = ""; }; F623D3AC27954C010027CBC3 /* RSEventFilteringPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSEventFilteringPlugin.h; sourceTree = ""; }; + F65E31162907E8BF00B46FB6 /* RSEnums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RSEnums.h; sourceTree = ""; }; F6A146832769DBC5009EF620 /* WKInterfaceController+RSScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WKInterfaceController+RSScreen.h"; sourceTree = ""; }; F6A146892769E28A009EF620 /* WKInterfaceController+RSScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WKInterfaceController+RSScreen.m"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -478,6 +480,7 @@ ED83FF2127310B44006F27B3 /* Public */ = { isa = PBXGroup; children = ( + F65E31162907E8BF00B46FB6 /* RSEnums.h */, ED83FF3427310B44006F27B3 /* RSApp.h */, ED83FF9A27310B44006F27B3 /* RSCartSharedEvent.h */, ED83FF8F27310B44006F27B3 /* RSCartViewedEvent.h */, @@ -646,6 +649,7 @@ ED83FFEC27310B44006F27B3 /* UIViewController+RSScreen.h in Headers */, ED83FFCC27310B44006F27B3 /* RSProperty.h in Headers */, ED83FFCA27310B44006F27B3 /* RSMessageType.h in Headers */, + F669056F2907EB8800FE4507 /* RSEnums.h in Headers */, ED83FFCD27310B44006F27B3 /* RSOption.h in Headers */, ED83FFE327310B44006F27B3 /* RSTraits.h in Headers */, ED83FFD427310B44006F27B3 /* RSPreferenceManager.h in Headers */, @@ -1017,7 +1021,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = GTGKNDBD23; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -1051,7 +1055,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = GTGKNDBD23; + DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; diff --git a/Sources/Classes/Public/RSConfig.h b/Sources/Classes/Public/RSConfig.h index 04ad7044..c27dc2af 100644 --- a/Sources/Classes/Public/RSConfig.h +++ b/Sources/Classes/Public/RSConfig.h @@ -8,12 +8,15 @@ #import #import "RSIntegrationFactory.h" +#import "RSEnums.h" + NS_ASSUME_NONNULL_BEGIN @interface RSConfig : NSObject @property (nonatomic, nonnull) NSString *dataPlaneUrl; +@property (nonatomic) DataResidencyServer dataResidencyServer; @property (nonatomic) int flushQueueSize; @property (nonatomic) int dbCountThreshold; @property (nonatomic) int sleepTimeout; diff --git a/Sources/Classes/Public/RSConfigBuilder.h b/Sources/Classes/Public/RSConfigBuilder.h index 9b559d9a..e1aeb7e3 100644 --- a/Sources/Classes/Public/RSConfigBuilder.h +++ b/Sources/Classes/Public/RSConfigBuilder.h @@ -8,6 +8,7 @@ #import #import "RSConfig.h" +#import "RSEnums.h" NS_ASSUME_NONNULL_BEGIN @@ -21,6 +22,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)withEndPointUrl:(NSString*)endPointUrl __attribute((deprecated("Use withDataPlaneUrl instead."))); - (instancetype)withDataPlaneUrl:(NSString*)dataPlaneUrl; - (instancetype)withDataPlaneURL:(NSURL*)dataPlaneURL; +- (instancetype)withDataResidencyServer:(DataResidencyServer) dataResidencyServer; - (instancetype)withFlushQueueSize:(int)flushQueueSize; - (instancetype)withDebug:(BOOL)debug; - (instancetype)withLoglevel:(int)logLevel; diff --git a/Sources/Classes/Public/RSEnums.h b/Sources/Classes/Public/RSEnums.h new file mode 100644 index 00000000..26a11bf1 --- /dev/null +++ b/Sources/Classes/Public/RSEnums.h @@ -0,0 +1,16 @@ +// +// RSEnums.h +// Rudder +// +// Created by Desu Sai Venkat on 25/10/22. +// + +#ifndef RSEnums_h +#define RSEnums_h + +typedef enum { + EU, + US +} DataResidencyServer; + +#endif /* RSEnums_h */ diff --git a/Sources/Classes/Public/RSEventRepository.h b/Sources/Classes/Public/RSEventRepository.h index 7f264460..6f82cb64 100644 --- a/Sources/Classes/Public/RSEventRepository.h +++ b/Sources/Classes/Public/RSEventRepository.h @@ -20,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN NSString* writeKey; NSString* authToken; NSString* anonymousIdToken; + NSString* dataPlaneUrl; RSConfig* config; #if !TARGET_OS_WATCH UIBackgroundTaskIdentifier backgroundTask; diff --git a/Sources/Classes/Public/RSServerConfigSource.h b/Sources/Classes/Public/RSServerConfigSource.h index 170ea592..bc8cfc85 100644 --- a/Sources/Classes/Public/RSServerConfigSource.h +++ b/Sources/Classes/Public/RSServerConfigSource.h @@ -7,6 +7,7 @@ // #import +#import "RSConfig.h" #import "RSServerDestination.h" NS_ASSUME_NONNULL_BEGIN @@ -18,8 +19,11 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readwrite) BOOL isSourceEnabled; @property (nonatomic, readwrite) NSString *updatedAt; @property (nonatomic, readwrite) NSMutableArray *destinations; +@property (nonatomic, readwrite) NSMutableDictionary* dataResidencyUrls; - (void) addDestination: (RSServerDestination*) destination; +- (void) addDataResidencyUrl:(NSString *)url forResidency:(DataResidencyServer)residency; +- (NSString *) getDataResidencyUrl:(DataResidencyServer) residency; @end diff --git a/Sources/Classes/Public/Rudder.h b/Sources/Classes/Public/Rudder.h index d4bcafd8..f3859246 100644 --- a/Sources/Classes/Public/Rudder.h +++ b/Sources/Classes/Public/Rudder.h @@ -9,6 +9,7 @@ #import "RSConfig.h" #import "RSConfigBuilder.h" +#import "RSEnums.h" #import "RSMessage.h" #import "RSMessageBuilder.h" diff --git a/Sources/Classes/RSConfig.m b/Sources/Classes/RSConfig.m index 7fa935a3..5da2309c 100644 --- a/Sources/Classes/RSConfig.m +++ b/Sources/Classes/RSConfig.m @@ -16,6 +16,7 @@ - (instancetype)init self = [super init]; if (self) { _dataPlaneUrl = RSDataPlaneUrl; + _dataResidencyServer = US; _flushQueueSize = RSFlushQueueSize; _dbCountThreshold = RSDBCountThreshold; _sleepTimeout = RSSleepTimeout; @@ -34,11 +35,12 @@ - (instancetype)init } - (instancetype)init:(NSString *) dataPlaneUrl +withDataResidencyServer: (DataResidencyServer) dataResidencyServer flushQueueSize: (int) flushQueueSize dbCountThreshold: (int) dbCountThreshold sleepTimeOut: (int) sleepTimeout logLevel: (int) logLevel - sessionInActivityTimeOut: (long) sessionInActivityTimeOut +sessionInActivityTimeOut: (long) sessionInActivityTimeOut configRefreshInterval: (int) configRefreshInteval trackLifecycleEvents: (BOOL) trackLifecycleEvents enableBackgroundMode: (BOOL) enableBackgroundMode @@ -49,6 +51,7 @@ - (instancetype)init:(NSString *) dataPlaneUrl self = [super init]; if (self) { _dataPlaneUrl = dataPlaneUrl; + _dataResidencyServer = dataResidencyServer; _flushQueueSize = flushQueueSize; _dbCountThreshold = dbCountThreshold; _sleepTimeout = sleepTimeout; diff --git a/Sources/Classes/RSConfigBuilder.m b/Sources/Classes/RSConfigBuilder.m index 146202b4..fb39650d 100644 --- a/Sources/Classes/RSConfigBuilder.m +++ b/Sources/Classes/RSConfigBuilder.m @@ -46,6 +46,14 @@ - (instancetype)withDataPlaneURL:(NSURL *) dataPlaneURL { return self; } +- (instancetype) withDataResidencyServer:(DataResidencyServer) dataResidencyServer { + if (config == nil) { + config = [[RSConfig alloc] init]; + } + config.dataResidencyServer = dataResidencyServer; + return self; +} + - (instancetype) withFlushQueueSize: (int) flushQueueSize { if (config == nil) { config = [[RSConfig alloc] init]; diff --git a/Sources/Classes/RSEventRepository.m b/Sources/Classes/RSEventRepository.m index ba2d67ce..2a28c33c 100644 --- a/Sources/Classes/RSEventRepository.m +++ b/Sources/Classes/RSEventRepository.m @@ -144,6 +144,7 @@ - (void) __initiateSDK { strongSelf->isSDKEnabled = serverConfig.isSourceEnabled; }); if (strongSelf->isSDKEnabled) { + [self setDataPlaneUrl]; [RSLogger logDebug:@"EventRepository: initiating processor"]; [strongSelf __initiateProcessor]; @@ -238,6 +239,15 @@ - (void) __replayMessageQueue { } } +- (void) setDataPlaneUrl { + RSServerConfigSource *serverConfig = [self->configManager getConfig]; + if([serverConfig getDataResidencyUrl:self->config.dataResidencyServer]) { + self->dataPlaneUrl = [RSUtils appendSlashToUrl:[serverConfig getDataResidencyUrl:self->config.dataResidencyServer]]; + return; + } + self->dataPlaneUrl = [RSUtils appendSlashToUrl:self->config.dataPlaneUrl]; +} + - (void) __initiateProcessor { __weak RSEventRepository *weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @@ -413,7 +423,7 @@ - (int) __flushEventsToServer: (NSString*) payload { dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); int __block respStatus = NETWORKSUCCESS; - NSString *dataPlaneEndPoint = [self->config.dataPlaneUrl stringByAppendingString:@"v1/batch"]; + NSString *dataPlaneEndPoint = [self->dataPlaneUrl stringByAppendingString:@"v1/batch"]; [RSLogger logDebug:[[NSString alloc] initWithFormat:@"endPointToFlush %@", dataPlaneEndPoint]]; NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:dataPlaneEndPoint]]; diff --git a/Sources/Classes/RSServerConfigManager.m b/Sources/Classes/RSServerConfigManager.m index 837c09a8..cd1ca101 100644 --- a/Sources/Classes/RSServerConfigManager.m +++ b/Sources/Classes/RSServerConfigManager.m @@ -114,6 +114,15 @@ - (RSServerConfigSource *)_parseConfig:(NSString *)configStr { destination.destinationConfig = [destinationDict objectForKey:@"config"]; [destinations addObject:destination]; } + + NSDictionary *dataResidencyUrls = [sourceDict objectForKey:@"dataPlaneUrls"]; + for (NSString *key in [dataResidencyUrls allKeys]) { + if([[key lowercaseString] isEqualToString:@"us"]) { + [source addDataResidencyUrl:[dataResidencyUrls objectForKey:key] forResidency:US]; + } else if ([[key lowercaseString] isEqualToString:@"eu"]) { + [source addDataResidencyUrl:[dataResidencyUrls objectForKey:key] forResidency:EU]; + } + } source.destinations = destinations; } else { [RSLogger logError:@"config deserializaion error"]; diff --git a/Sources/Classes/RSServerConfigSource.m b/Sources/Classes/RSServerConfigSource.m index 32d7a8e4..2a8d2704 100644 --- a/Sources/Classes/RSServerConfigSource.m +++ b/Sources/Classes/RSServerConfigSource.m @@ -15,6 +15,7 @@ - (instancetype)init self = [super init]; if (self) { self.destinations = [[NSMutableArray alloc] init]; + self.dataResidencyUrls = [[NSMutableDictionary alloc] init]; } return self; } @@ -23,4 +24,16 @@ - (void)addDestination:(RSServerDestination *)destination { [self.destinations addObject:destination]; } +- (void) addDataResidencyUrl:(NSString *) url forResidency:(DataResidencyServer) residency { + [self.dataResidencyUrls setValue:url forKey:@(residency)]; +} + +- (NSString *) getDataResidencyUrl:(DataResidencyServer) residency { + if([self.dataResidencyUrls objectForKey:@(residency)]) { + return [self.dataResidencyUrls objectForKey:@(residency)]; + } + // defaulted to US + return [self.dataResidencyUrls objectForKey:@(US)]; +} + @end From 0d4097604c2c3edf729733029ac26bfe7c7eb014 Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Tue, 25 Oct 2022 15:44:51 +0530 Subject: [PATCH 02/13] Bumped the version to 1.8.0 --- CHANGELOG.md | 4 ++++ Podfile.lock | 2 +- README.md | 10 +++++----- Rudder.podspec | 2 +- Sources/Classes/RSConstants.m | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80410c32..abe5d553 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,3 +87,7 @@ All notable changes to this project will be documented in this file. ### Feature - Added session tracking. +## Version - 1.8.0 + +### Feature +- Added Data Residency Support. \ No newline at end of file diff --git a/Podfile.lock b/Podfile.lock index 968df240..5bc2100e 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - Rudder (1.7.0) + - Rudder (1.8.0) DEPENDENCIES: - Rudder (from `.`) diff --git a/README.md b/README.md index 3a72ce55..1bcf39e3 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

- +

@@ -39,7 +39,7 @@ The iOS SDK is available through [**CocoaPods**](https://cocoapods.org), [**Cart To install the SDK, simply add the following line to your Podfile: ```xcode -pod 'Rudder', '1.7.0' +pod 'Rudder', '1.8.0' ``` ### Carthage @@ -47,7 +47,7 @@ pod 'Rudder', '1.7.0' For Carthage support, add the following line to your `Cartfile`: ```xcode -github "rudderlabs/rudder-sdk-ios" "v1.7.0" +github "rudderlabs/rudder-sdk-ios" "v1.8.0" ``` > Remember to include the following code in all `.m` and `.h` files where you want to refer to or use the RudderStack SDK classes, as shown: @@ -71,7 +71,7 @@ You can also add the RudderStack iOS SDK via Swift Package Mangaer, via one of t * Enter the package repository (`git@github.com:rudderlabs/rudder-sdk-ios.git`) in the search bar. -* In **Dependency Rule**, select **Up to Next Major Version** and enter `1.7.0` as the value, as shown: +* In **Dependency Rule**, select **Up to Next Major Version** and enter `1.8.0` as the value, as shown: ![Setting dependency](https://user-images.githubusercontent.com/59817155/145574696-8c849749-13e0-40d5-aacb-3fccb5c8e67d.png) @@ -99,7 +99,7 @@ let package = Package( ], dependencies: [ // Dependencies declare other packages that this package depends on. - .package(url: "git@github.com:rudderlabs/rudder-sdk-ios.git", from: "1.7.0") + .package(url: "git@github.com:rudderlabs/rudder-sdk-ios.git", from: "1.8.0") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. diff --git a/Rudder.podspec b/Rudder.podspec index 126da2c5..3127a35e 100644 --- a/Rudder.podspec +++ b/Rudder.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Rudder' - s.version = "1.7.0" + s.version = "1.8.0" s.summary = "Privacy and Security focused Segment-alternative. iOS ,tvOS and watchOS SDK" s.description = <<-DESC Rudder is a platform for collecting, storing and routing customer event data to dozens of tools. Rudder is open-source, can run in your cloud environment (AWS, GCP, Azure or even your data-centre) and provides a powerful transformation framework to process your event data on the fly. diff --git a/Sources/Classes/RSConstants.m b/Sources/Classes/RSConstants.m index 70a47dd5..9995db0e 100644 --- a/Sources/Classes/RSConstants.m +++ b/Sources/Classes/RSConstants.m @@ -21,7 +21,7 @@ @implementation RSConstants bool const RSRecordScreenViews = NO; bool const RSEnableBackgroundMode = NO; bool const RSAutomaticSessionTracking = YES; -NSString *const RS_VERSION = @"1.7.0"; +NSString *const RS_VERSION = @"1.8.0"; NSString* const DISABLE = @"disable"; NSString* const WHITELISTED_EVENTS = @"whitelistedEvents"; NSString* const BLACKLISTED_EVENTS = @"blacklistedEvents"; From d42a48145a82f8ea7e5f1f5bf41840a47b8fd06a Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Wed, 26 Oct 2022 17:01:00 +0530 Subject: [PATCH 03/13] Added Unit TestCases for the Data-Residency Feature --- Podfile.lock | 2 +- Rudder.xcodeproj/project.pbxproj | 133 +++++++ RudderTests/RudderTests.swift | 326 ++++++++++++++++++ .../Classes/Public/RSServerConfigManager.h | 1 + Sources/Classes/Public/RSUtils.h | 3 + Sources/Classes/RSEventRepository.m | 11 +- Sources/Classes/RSUtils.m | 7 + 7 files changed, 472 insertions(+), 11 deletions(-) create mode 100644 RudderTests/RudderTests.swift diff --git a/Podfile.lock b/Podfile.lock index 5bc2100e..bd3bb7d9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -9,7 +9,7 @@ EXTERNAL SOURCES: :path: "." SPEC CHECKSUMS: - Rudder: b87d9230533ca42a5f48d20d605485cee69e663f + Rudder: 0a5272646aa3b89295526cea2bf54d092044848a PODFILE CHECKSUM: b22a79db44ea2c78e3500063ff2c7312ef613413 diff --git a/Rudder.xcodeproj/project.pbxproj b/Rudder.xcodeproj/project.pbxproj index 1f8a6f77..c9dd4376 100644 --- a/Rudder.xcodeproj/project.pbxproj +++ b/Rudder.xcodeproj/project.pbxproj @@ -179,10 +179,22 @@ F623D3AB27954BF10027CBC3 /* RSEventFilteringPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = F623D3AA27954BF10027CBC3 /* RSEventFilteringPlugin.m */; }; F623D3AD27954C010027CBC3 /* RSEventFilteringPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = F623D3AC27954C010027CBC3 /* RSEventFilteringPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; F669056F2907EB8800FE4507 /* RSEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = F65E31162907E8BF00B46FB6 /* RSEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F69E95AB29093E630016E5C9 /* RudderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F69E95AA29093E630016E5C9 /* RudderTests.swift */; }; + F69E95AC29093E630016E5C9 /* Rudder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06CABB842630C3CA0097BEFF /* Rudder.framework */; }; F6A146842769DBC6009EF620 /* WKInterfaceController+RSScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = F6A146832769DBC5009EF620 /* WKInterfaceController+RSScreen.h */; settings = {ATTRIBUTES = (Public, ); }; }; F6A1468A2769E28A009EF620 /* WKInterfaceController+RSScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = F6A146892769E28A009EF620 /* WKInterfaceController+RSScreen.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + F69E95AD29093E630016E5C9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 06CABB7B2630C3CA0097BEFF /* Project object */; + proxyType = 1; + remoteGlobalIDString = 06CABB832630C3CA0097BEFF; + remoteInfo = Rudder; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 06CABB842630C3CA0097BEFF /* Rudder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Rudder.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 06CABC2E2630C6660097BEFF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/System/iOSSupport/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; @@ -365,6 +377,8 @@ F623D3AA27954BF10027CBC3 /* RSEventFilteringPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSEventFilteringPlugin.m; sourceTree = ""; }; F623D3AC27954C010027CBC3 /* RSEventFilteringPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSEventFilteringPlugin.h; sourceTree = ""; }; F65E31162907E8BF00B46FB6 /* RSEnums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RSEnums.h; sourceTree = ""; }; + F69E95A829093E630016E5C9 /* RudderTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RudderTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + F69E95AA29093E630016E5C9 /* RudderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RudderTests.swift; sourceTree = ""; }; F6A146832769DBC5009EF620 /* WKInterfaceController+RSScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WKInterfaceController+RSScreen.h"; sourceTree = ""; }; F6A146892769E28A009EF620 /* WKInterfaceController+RSScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WKInterfaceController+RSScreen.m"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -379,6 +393,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F69E95A529093E630016E5C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F69E95AC29093E630016E5C9 /* Rudder.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -393,6 +415,7 @@ ED83FDB22731019F006F27B3 /* release.sh */, ED83FDB02731019F006F27B3 /* Rudder.podspec */, ED83FDB32731019F006F27B3 /* Sources */, + F69E95A929093E630016E5C9 /* RudderTests */, 06CABB852630C3CA0097BEFF /* Products */, 06CABC2D2630C6660097BEFF /* Frameworks */, ); @@ -402,6 +425,7 @@ isa = PBXGroup; children = ( 06CABB842630C3CA0097BEFF /* Rudder.framework */, + F69E95A829093E630016E5C9 /* RudderTests.xctest */, ); name = Products; sourceTree = ""; @@ -635,6 +659,14 @@ path = Events; sourceTree = ""; }; + F69E95A929093E630016E5C9 /* RudderTests */ = { + isa = PBXGroup; + children = ( + F69E95AA29093E630016E5C9 /* RudderTests.swift */, + ); + path = RudderTests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -754,18 +786,40 @@ productReference = 06CABB842630C3CA0097BEFF /* Rudder.framework */; productType = "com.apple.product-type.framework"; }; + F69E95A729093E630016E5C9 /* RudderTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F69E95B129093E630016E5C9 /* Build configuration list for PBXNativeTarget "RudderTests" */; + buildPhases = ( + F69E95A429093E630016E5C9 /* Sources */, + F69E95A529093E630016E5C9 /* Frameworks */, + F69E95A629093E630016E5C9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F69E95AE29093E630016E5C9 /* PBXTargetDependency */, + ); + name = RudderTests; + productName = RudderTests; + productReference = F69E95A829093E630016E5C9 /* RudderTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 06CABB7B2630C3CA0097BEFF /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 1400; LastUpgradeCheck = 1300; TargetAttributes = { 06CABB832630C3CA0097BEFF = { CreatedOnToolsVersion = 12.3; LastSwiftMigration = 1310; }; + F69E95A729093E630016E5C9 = { + CreatedOnToolsVersion = 14.0.1; + }; }; }; buildConfigurationList = 06CABB7E2630C3CA0097BEFF /* Build configuration list for PBXProject "Rudder" */; @@ -782,6 +836,7 @@ projectRoot = ""; targets = ( 06CABB832630C3CA0097BEFF /* Rudder */, + F69E95A729093E630016E5C9 /* RudderTests */, ); }; /* End PBXProject section */ @@ -794,6 +849,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F69E95A629093E630016E5C9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -888,8 +950,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F69E95A429093E630016E5C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F69E95AB29093E630016E5C9 /* RudderTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + F69E95AE29093E630016E5C9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 06CABB832630C3CA0097BEFF /* Rudder */; + targetProxy = F69E95AD29093E630016E5C9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 06CABB962630C3CA0097BEFF /* Debug */ = { isa = XCBuildConfiguration; @@ -1078,6 +1156,52 @@ }; name = Release; }; + F69E95AF29093E630016E5C9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = GTGKNDBD23; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MACOSX_DEPLOYMENT_TARGET = 12.3; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.rudderstack.RudderTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + F69E95B029093E630016E5C9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = GTGKNDBD23; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MACOSX_DEPLOYMENT_TARGET = 12.3; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.rudderstack.RudderTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1099,6 +1223,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + F69E95B129093E630016E5C9 /* Build configuration list for PBXNativeTarget "RudderTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F69E95AF29093E630016E5C9 /* Debug */, + F69E95B029093E630016E5C9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 06CABB7B2630C3CA0097BEFF /* Project object */; diff --git a/RudderTests/RudderTests.swift b/RudderTests/RudderTests.swift new file mode 100644 index 00000000..6f0c26ad --- /dev/null +++ b/RudderTests/RudderTests.swift @@ -0,0 +1,326 @@ +// +// RudderTests.swift +// RudderTests +// +// Created by Desu Sai Venkat on 26/10/22. +// + +import XCTest +@testable import Rudder + +class RudderTests: XCTestCase { + + let writeKey = "123@23456" + var rsConfig: RSConfig! + var rsServerConfigManager: RSServerConfigManager! + var rsServerConfigSource: RSServerConfigSource! + var configJson: String! + + + 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. + + } + + func testWithBothResidenciesInSourceConfig() { + + configJson = """ +{ + "isHosted": true, + "source": { + "config": { + "statsCollection": { + "errorReports": { + "enabled": false + }, + "metrics": { + "enabled": false + } + } + }, + "liveEventsConfig": { + + }, + "dataPlaneUrls": { + "eu": "https://rudderstacgwyx-eu.dataplane.rudderstack.com", + "us": "https://rudderstacgwyx-us.dataplane.rudderstack.com" + }, + "id": "2GcaJMDRDWtZsZdeusASLcpyamz", + "name": "Android Dev 2", + "writeKey": "2GcaJLm1a8cSKbfCZdKNGn5XDcO", + "enabled": true, + "sourceDefinitionId": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "createdBy": "2FkbV0e3wAJaiqxfFkWVqDrtT7I", + "workspaceId": "2FkbaBpkwsVa3A3B4ZMZ365BVC3", + "deleted": false, + "transient": false, + "secretVersion": null, + "createdAt": "2022-10-25T09:30:52.830Z", + "updatedAt": "2022-10-25T09:30:52.830Z", + "connections": [ + { + "id": "2GcaQeqMFrit8Wju1xDuEA5KgU6", + "sourceId": "2GcaJMDRDWtZsZdeusASLcpyamz", + "destinationId": "2GcaQQ7ce7kPlhvnbQiINUXOa0h", + "enabled": true, + "deleted": false, + "createdAt": "2022-10-25T09:31:50.331Z", + "updatedAt": "2022-10-25T09:31:50.331Z" + } + ], + "destinations": [ + + ], + "sourceDefinition": { + "options": null, + "config": null, + "configSchema": null, + "uiConfig": null, + "id": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "name": "Android", + "displayName": "Android", + "category": null, + "createdAt": "2019-09-02T08:08:08.373Z", + "updatedAt": "2020-06-18T11:54:00.449Z" + } + } +} +""" + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); + rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-eu.dataplane.rudderstack.com/") + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") + } + + func testWithOnlyUSInSourceConfig() { + + configJson = """ +{ + "isHosted": true, + "source": { + "config": { + "statsCollection": { + "errorReports": { + "enabled": false + }, + "metrics": { + "enabled": false + } + } + }, + "liveEventsConfig": { + + }, + "dataPlaneUrls": { + "us": "https://rudderstacgwyx-us.dataplane.rudderstack.com" + }, + "id": "2GcaJMDRDWtZsZdeusASLcpyamz", + "name": "Android Dev 2", + "writeKey": "2GcaJLm1a8cSKbfCZdKNGn5XDcO", + "enabled": true, + "sourceDefinitionId": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "createdBy": "2FkbV0e3wAJaiqxfFkWVqDrtT7I", + "workspaceId": "2FkbaBpkwsVa3A3B4ZMZ365BVC3", + "deleted": false, + "transient": false, + "secretVersion": null, + "createdAt": "2022-10-25T09:30:52.830Z", + "updatedAt": "2022-10-25T09:30:52.830Z", + "connections": [ + { + "id": "2GcaQeqMFrit8Wju1xDuEA5KgU6", + "sourceId": "2GcaJMDRDWtZsZdeusASLcpyamz", + "destinationId": "2GcaQQ7ce7kPlhvnbQiINUXOa0h", + "enabled": true, + "deleted": false, + "createdAt": "2022-10-25T09:31:50.331Z", + "updatedAt": "2022-10-25T09:31:50.331Z" + } + ], + "destinations": [ + + ], + "sourceDefinition": { + "options": null, + "config": null, + "configSchema": null, + "uiConfig": null, + "id": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "name": "Android", + "displayName": "Android", + "category": null, + "createdAt": "2019-09-02T08:08:08.373Z", + "updatedAt": "2020-06-18T11:54:00.449Z" + } + } +} +""" + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); + rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") + } + + func testWithOnlyEUInSourceConfig() { + + configJson = """ +{ + "isHosted": true, + "source": { + "config": { + "statsCollection": { + "errorReports": { + "enabled": false + }, + "metrics": { + "enabled": false + } + } + }, + "liveEventsConfig": { + + }, + "dataPlaneUrls": { + "eu": "https://rudderstacgwyx-eu.dataplane.rudderstack.com" + }, + "id": "2GcaJMDRDWtZsZdeusASLcpyamz", + "name": "Android Dev 2", + "writeKey": "2GcaJLm1a8cSKbfCZdKNGn5XDcO", + "enabled": true, + "sourceDefinitionId": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "createdBy": "2FkbV0e3wAJaiqxfFkWVqDrtT7I", + "workspaceId": "2FkbaBpkwsVa3A3B4ZMZ365BVC3", + "deleted": false, + "transient": false, + "secretVersion": null, + "createdAt": "2022-10-25T09:30:52.830Z", + "updatedAt": "2022-10-25T09:30:52.830Z", + "connections": [ + { + "id": "2GcaQeqMFrit8Wju1xDuEA5KgU6", + "sourceId": "2GcaJMDRDWtZsZdeusASLcpyamz", + "destinationId": "2GcaQQ7ce7kPlhvnbQiINUXOa0h", + "enabled": true, + "deleted": false, + "createdAt": "2022-10-25T09:31:50.331Z", + "updatedAt": "2022-10-25T09:31:50.331Z" + } + ], + "destinations": [ + + ], + "sourceDefinition": { + "options": null, + "config": null, + "configSchema": null, + "uiConfig": null, + "id": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "name": "Android", + "displayName": "Android", + "category": null, + "createdAt": "2019-09-02T08:08:08.373Z", + "updatedAt": "2020-06-18T11:54:00.449Z" + } + } +} +""" + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); + rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-eu.dataplane.rudderstack.com/") + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") + } + + func testWhenNoUrlInSourceConfig() { + configJson = """ +{ + "isHosted": true, + "source": { + "config": { + "statsCollection": { + "errorReports": { + "enabled": false + }, + "metrics": { + "enabled": false + } + } + }, + "liveEventsConfig": { + + }, + "id": "2GcaJMDRDWtZsZdeusASLcpyamz", + "name": "Android Dev 2", + "writeKey": "2GcaJLm1a8cSKbfCZdKNGn5XDcO", + "enabled": true, + "sourceDefinitionId": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "createdBy": "2FkbV0e3wAJaiqxfFkWVqDrtT7I", + "workspaceId": "2FkbaBpkwsVa3A3B4ZMZ365BVC3", + "deleted": false, + "transient": false, + "secretVersion": null, + "createdAt": "2022-10-25T09:30:52.830Z", + "updatedAt": "2022-10-25T09:30:52.830Z", + "connections": [ + { + "id": "2GcaQeqMFrit8Wju1xDuEA5KgU6", + "sourceId": "2GcaJMDRDWtZsZdeusASLcpyamz", + "destinationId": "2GcaQQ7ce7kPlhvnbQiINUXOa0h", + "enabled": true, + "deleted": false, + "createdAt": "2022-10-25T09:31:50.331Z", + "updatedAt": "2022-10-25T09:31:50.331Z" + } + ], + "destinations": [ + + ], + "sourceDefinition": { + "options": null, + "config": null, + "configSchema": null, + "uiConfig": null, + "id": "1QGzOQGVLM35GgtteFH1vYCE0WT", + "name": "Android", + "displayName": "Android", + "category": null, + "createdAt": "2019-09-02T08:08:08.373Z", + "updatedAt": "2020-06-18T11:54:00.449Z" + } + } +} +""" + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); + rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") + + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") + + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") + + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataPlaneUrl("https::/somerandomdataplanecom").build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://hosted.rudderlabs.com/") + + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).build() + XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://hosted.rudderlabs.com/") + + } +} diff --git a/Sources/Classes/Public/RSServerConfigManager.h b/Sources/Classes/Public/RSServerConfigManager.h index 8678ed73..fda2077f 100644 --- a/Sources/Classes/Public/RSServerConfigManager.h +++ b/Sources/Classes/Public/RSServerConfigManager.h @@ -20,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN @property RSPreferenceManager *preferenceManager; - (instancetype)init: (NSString*) writeKey rudderConfig:(RSConfig*) rudderConfig; +- (RSServerConfigSource *)_parseConfig:(NSString *)configStr; - (RSServerConfigSource*) getConfig; - (int) getError; diff --git a/Sources/Classes/Public/RSUtils.h b/Sources/Classes/Public/RSUtils.h index cbdce116..d3c8693f 100644 --- a/Sources/Classes/Public/RSUtils.h +++ b/Sources/Classes/Public/RSUtils.h @@ -8,6 +8,8 @@ #import #import "RSDBMessage.h" +#import "RSServerConfigSource.h" +#import "RSConfig.h" NS_ASSUME_NONNULL_BEGIN @@ -26,6 +28,7 @@ NS_ASSUME_NONNULL_BEGIN + (NSMutableArray*) getBatch:(NSMutableArray*) messageDetails withQueueSize: (int) queueSize; + (BOOL) isValidURL:(NSURL*) url; + (NSString*) appendSlashToUrl:(NSString*) url; ++ (NSString *) getDataPlaneUrlFrom:(RSServerConfigSource *) serverConfig andRSConfig:(RSConfig *) rsConfig; extern unsigned int MAX_EVENT_SIZE; extern unsigned int MAX_BATCH_SIZE; diff --git a/Sources/Classes/RSEventRepository.m b/Sources/Classes/RSEventRepository.m index 2a28c33c..5ff6f8ee 100644 --- a/Sources/Classes/RSEventRepository.m +++ b/Sources/Classes/RSEventRepository.m @@ -144,7 +144,7 @@ - (void) __initiateSDK { strongSelf->isSDKEnabled = serverConfig.isSourceEnabled; }); if (strongSelf->isSDKEnabled) { - [self setDataPlaneUrl]; + self->dataPlaneUrl = [RSUtils getDataPlaneUrlFrom:serverConfig andRSConfig:self->config]; [RSLogger logDebug:@"EventRepository: initiating processor"]; [strongSelf __initiateProcessor]; @@ -239,15 +239,6 @@ - (void) __replayMessageQueue { } } -- (void) setDataPlaneUrl { - RSServerConfigSource *serverConfig = [self->configManager getConfig]; - if([serverConfig getDataResidencyUrl:self->config.dataResidencyServer]) { - self->dataPlaneUrl = [RSUtils appendSlashToUrl:[serverConfig getDataResidencyUrl:self->config.dataResidencyServer]]; - return; - } - self->dataPlaneUrl = [RSUtils appendSlashToUrl:self->config.dataPlaneUrl]; -} - - (void) __initiateProcessor { __weak RSEventRepository *weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ diff --git a/Sources/Classes/RSUtils.m b/Sources/Classes/RSUtils.m index cc6fe553..897fc6f2 100644 --- a/Sources/Classes/RSUtils.m +++ b/Sources/Classes/RSUtils.m @@ -147,6 +147,13 @@ + (NSString*) appendSlashToUrl:(NSString*) url { return [url stringByAppendingString:@"/"]; } ++ (NSString *) getDataPlaneUrlFrom:(RSServerConfigSource *) serverConfig andRSConfig:(RSConfig *) rsConfig { + if([serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer]) { + return [RSUtils appendSlashToUrl:[serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer]]; + } + return [RSUtils appendSlashToUrl:rsConfig.dataPlaneUrl]; +} + unsigned int MAX_EVENT_SIZE = 32 * 1024; // 32 KB unsigned int MAX_BATCH_SIZE = 500 * 1024; // 500 KB From 3d35c79eba25fdef9dde32c6bad99eb9e68dffed Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Thu, 27 Oct 2022 15:11:14 +0530 Subject: [PATCH 04/13] Refactored DataResidencyServer to RSDataResidencyServer --- Sources/Classes/Public/RSConfig.h | 2 +- Sources/Classes/Public/RSConfigBuilder.h | 2 +- Sources/Classes/Public/RSEnums.h | 2 +- Sources/Classes/Public/RSServerConfigSource.h | 4 ++-- Sources/Classes/RSConfig.m | 2 +- Sources/Classes/RSConfigBuilder.m | 2 +- Sources/Classes/RSServerConfigSource.m | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/Classes/Public/RSConfig.h b/Sources/Classes/Public/RSConfig.h index c27dc2af..f736085d 100644 --- a/Sources/Classes/Public/RSConfig.h +++ b/Sources/Classes/Public/RSConfig.h @@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN @interface RSConfig : NSObject @property (nonatomic, nonnull) NSString *dataPlaneUrl; -@property (nonatomic) DataResidencyServer dataResidencyServer; +@property (nonatomic) RSDataResidencyServer dataResidencyServer; @property (nonatomic) int flushQueueSize; @property (nonatomic) int dbCountThreshold; @property (nonatomic) int sleepTimeout; diff --git a/Sources/Classes/Public/RSConfigBuilder.h b/Sources/Classes/Public/RSConfigBuilder.h index e1aeb7e3..65360e84 100644 --- a/Sources/Classes/Public/RSConfigBuilder.h +++ b/Sources/Classes/Public/RSConfigBuilder.h @@ -22,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)withEndPointUrl:(NSString*)endPointUrl __attribute((deprecated("Use withDataPlaneUrl instead."))); - (instancetype)withDataPlaneUrl:(NSString*)dataPlaneUrl; - (instancetype)withDataPlaneURL:(NSURL*)dataPlaneURL; -- (instancetype)withDataResidencyServer:(DataResidencyServer) dataResidencyServer; +- (instancetype)withDataResidencyServer:(RSDataResidencyServer) dataResidencyServer; - (instancetype)withFlushQueueSize:(int)flushQueueSize; - (instancetype)withDebug:(BOOL)debug; - (instancetype)withLoglevel:(int)logLevel; diff --git a/Sources/Classes/Public/RSEnums.h b/Sources/Classes/Public/RSEnums.h index 26a11bf1..1223eb82 100644 --- a/Sources/Classes/Public/RSEnums.h +++ b/Sources/Classes/Public/RSEnums.h @@ -11,6 +11,6 @@ typedef enum { EU, US -} DataResidencyServer; +} RSDataResidencyServer; #endif /* RSEnums_h */ diff --git a/Sources/Classes/Public/RSServerConfigSource.h b/Sources/Classes/Public/RSServerConfigSource.h index bc8cfc85..d95d248d 100644 --- a/Sources/Classes/Public/RSServerConfigSource.h +++ b/Sources/Classes/Public/RSServerConfigSource.h @@ -22,8 +22,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readwrite) NSMutableDictionary* dataResidencyUrls; - (void) addDestination: (RSServerDestination*) destination; -- (void) addDataResidencyUrl:(NSString *)url forResidency:(DataResidencyServer)residency; -- (NSString *) getDataResidencyUrl:(DataResidencyServer) residency; +- (void) addDataResidencyUrl:(NSString *)url forResidency:(RSDataResidencyServer)residency; +- (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency; @end diff --git a/Sources/Classes/RSConfig.m b/Sources/Classes/RSConfig.m index 5da2309c..f6c2171c 100644 --- a/Sources/Classes/RSConfig.m +++ b/Sources/Classes/RSConfig.m @@ -35,7 +35,7 @@ - (instancetype)init } - (instancetype)init:(NSString *) dataPlaneUrl -withDataResidencyServer: (DataResidencyServer) dataResidencyServer +withDataResidencyServer: (RSDataResidencyServer) dataResidencyServer flushQueueSize: (int) flushQueueSize dbCountThreshold: (int) dbCountThreshold sleepTimeOut: (int) sleepTimeout diff --git a/Sources/Classes/RSConfigBuilder.m b/Sources/Classes/RSConfigBuilder.m index fb39650d..9bcb55b9 100644 --- a/Sources/Classes/RSConfigBuilder.m +++ b/Sources/Classes/RSConfigBuilder.m @@ -46,7 +46,7 @@ - (instancetype)withDataPlaneURL:(NSURL *) dataPlaneURL { return self; } -- (instancetype) withDataResidencyServer:(DataResidencyServer) dataResidencyServer { +- (instancetype) withDataResidencyServer:(RSDataResidencyServer) dataResidencyServer { if (config == nil) { config = [[RSConfig alloc] init]; } diff --git a/Sources/Classes/RSServerConfigSource.m b/Sources/Classes/RSServerConfigSource.m index 2a8d2704..5429f151 100644 --- a/Sources/Classes/RSServerConfigSource.m +++ b/Sources/Classes/RSServerConfigSource.m @@ -24,11 +24,11 @@ - (void)addDestination:(RSServerDestination *)destination { [self.destinations addObject:destination]; } -- (void) addDataResidencyUrl:(NSString *) url forResidency:(DataResidencyServer) residency { +- (void) addDataResidencyUrl:(NSString *) url forResidency:(RSDataResidencyServer) residency { [self.dataResidencyUrls setValue:url forKey:@(residency)]; } -- (NSString *) getDataResidencyUrl:(DataResidencyServer) residency { +- (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency { if([self.dataResidencyUrls objectForKey:@(residency)]) { return [self.dataResidencyUrls objectForKey:@(residency)]; } From 5ef98ad8a4026139287c0a1cd36a5724c9fd5cef Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Mon, 31 Oct 2022 10:55:28 +0530 Subject: [PATCH 05/13] Minor improvements in the constructor of RSConfig --- Sources/Classes/RSConfig.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Classes/RSConfig.m b/Sources/Classes/RSConfig.m index f6c2171c..3859c815 100644 --- a/Sources/Classes/RSConfig.m +++ b/Sources/Classes/RSConfig.m @@ -35,7 +35,7 @@ - (instancetype)init } - (instancetype)init:(NSString *) dataPlaneUrl -withDataResidencyServer: (RSDataResidencyServer) dataResidencyServer +dataResidencyServer: (RSDataResidencyServer) dataResidencyServer flushQueueSize: (int) flushQueueSize dbCountThreshold: (int) dbCountThreshold sleepTimeOut: (int) sleepTimeout From b7ca2b17b6a4deb1cc1f05c8884de917d2010270 Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Mon, 31 Oct 2022 11:32:50 +0530 Subject: [PATCH 06/13] Addressed comments for parsing data residency URL's from sourceConfig --- Sources/Classes/Public/RSServerConfigSource.h | 1 - Sources/Classes/RSServerConfigManager.m | 9 +-------- Sources/Classes/RSServerConfigSource.m | 15 +++++++-------- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/Sources/Classes/Public/RSServerConfigSource.h b/Sources/Classes/Public/RSServerConfigSource.h index d95d248d..e2a37610 100644 --- a/Sources/Classes/Public/RSServerConfigSource.h +++ b/Sources/Classes/Public/RSServerConfigSource.h @@ -22,7 +22,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readwrite) NSMutableDictionary* dataResidencyUrls; - (void) addDestination: (RSServerDestination*) destination; -- (void) addDataResidencyUrl:(NSString *)url forResidency:(RSDataResidencyServer)residency; - (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency; @end diff --git a/Sources/Classes/RSServerConfigManager.m b/Sources/Classes/RSServerConfigManager.m index cd1ca101..39274b59 100644 --- a/Sources/Classes/RSServerConfigManager.m +++ b/Sources/Classes/RSServerConfigManager.m @@ -115,14 +115,7 @@ - (RSServerConfigSource *)_parseConfig:(NSString *)configStr { [destinations addObject:destination]; } - NSDictionary *dataResidencyUrls = [sourceDict objectForKey:@"dataPlaneUrls"]; - for (NSString *key in [dataResidencyUrls allKeys]) { - if([[key lowercaseString] isEqualToString:@"us"]) { - [source addDataResidencyUrl:[dataResidencyUrls objectForKey:key] forResidency:US]; - } else if ([[key lowercaseString] isEqualToString:@"eu"]) { - [source addDataResidencyUrl:[dataResidencyUrls objectForKey:key] forResidency:EU]; - } - } + source.dataResidencyUrls = [sourceDict objectForKey:@"dataPlaneUrls"]; source.destinations = destinations; } else { [RSLogger logError:@"config deserializaion error"]; diff --git a/Sources/Classes/RSServerConfigSource.m b/Sources/Classes/RSServerConfigSource.m index 5429f151..526f2674 100644 --- a/Sources/Classes/RSServerConfigSource.m +++ b/Sources/Classes/RSServerConfigSource.m @@ -24,16 +24,15 @@ - (void)addDestination:(RSServerDestination *)destination { [self.destinations addObject:destination]; } -- (void) addDataResidencyUrl:(NSString *) url forResidency:(RSDataResidencyServer) residency { - [self.dataResidencyUrls setValue:url forKey:@(residency)]; -} - - (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency { - if([self.dataResidencyUrls objectForKey:@(residency)]) { - return [self.dataResidencyUrls objectForKey:@(residency)]; + switch(residency) { + case EU: + if([self.dataResidencyUrls objectForKey:@"eu"] != nil) { + return [self.dataResidencyUrls objectForKey:@"eu"]; + } + default: + return [self.dataResidencyUrls objectForKey:@"us"]; } - // defaulted to US - return [self.dataResidencyUrls objectForKey:@(US)]; } @end From 57af23b0f437bae801c6e896e7a2c2cbee7c7d54 Mon Sep 17 00:00:00 2001 From: Pallab Maiti Date: Mon, 7 Nov 2022 11:55:22 +0530 Subject: [PATCH 07/13] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e9245fc..e7209ff7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -145,4 +145,3 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes * Removed User agent ->>>>>>> 0aec3ca84a075f921feeb96213068190112325e9 From be30f3be9dbd284cb540193854c0b576e7de913b Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Wed, 9 Nov 2022 15:09:12 +0530 Subject: [PATCH 08/13] chore: Added the support for parsing Multiple Data Plane URL's for each Data Residency Region --- Podfile.lock | 4 +-- Rudder.xcodeproj/project.pbxproj | 16 ++++----- RudderTests/RudderTests.swift | 34 +++++++++++++++---- Sources/Classes/Public/RSServerConfigSource.h | 2 +- Sources/Classes/RSServerConfigManager.m | 2 +- Sources/Classes/RSServerConfigSource.m | 21 +++++++++--- 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index bd3bb7d9..ba79d7c4 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - Rudder (1.8.0) + - Rudder (1.7.1) DEPENDENCIES: - Rudder (from `.`) @@ -9,7 +9,7 @@ EXTERNAL SOURCES: :path: "." SPEC CHECKSUMS: - Rudder: 0a5272646aa3b89295526cea2bf54d092044848a + Rudder: 61568212171ddc2efe7785d0a6a0de589d181370 PODFILE CHECKSUM: b22a79db44ea2c78e3500063ff2c7312ef613413 diff --git a/Rudder.xcodeproj/project.pbxproj b/Rudder.xcodeproj/project.pbxproj index a6ef0e9a..14d9c227 100644 --- a/Rudder.xcodeproj/project.pbxproj +++ b/Rudder.xcodeproj/project.pbxproj @@ -660,14 +660,6 @@ path = Events; sourceTree = ""; }; - F69E95A929093E630016E5C9 /* RudderTests */ = { - isa = PBXGroup; - children = ( - F69E95AA29093E630016E5C9 /* RudderTests.swift */, - ); - path = RudderTests; - sourceTree = ""; - }; ED857DEE2912750900B7BFCE /* Others */ = { isa = PBXGroup; children = ( @@ -686,6 +678,14 @@ name = Others; sourceTree = ""; }; + F69E95A929093E630016E5C9 /* RudderTests */ = { + isa = PBXGroup; + children = ( + F69E95AA29093E630016E5C9 /* RudderTests.swift */, + ); + path = RudderTests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ diff --git a/RudderTests/RudderTests.swift b/RudderTests/RudderTests.swift index 6f0c26ad..dd596af7 100644 --- a/RudderTests/RudderTests.swift +++ b/RudderTests/RudderTests.swift @@ -45,9 +45,19 @@ class RudderTests: XCTestCase { "liveEventsConfig": { }, - "dataPlaneUrls": { - "eu": "https://rudderstacgwyx-eu.dataplane.rudderstack.com", - "us": "https://rudderstacgwyx-us.dataplane.rudderstack.com" + "dataplanes": { + "EU": [ + { + "url": "https://rudderstacgwyx-eu.dataplane.rudderstack.com", + "default": true + } + ], + "US": [ + { + "url": "https://rudderstacgwyx-us.dataplane.rudderstack.com", + "default": true + } + ] }, "id": "2GcaJMDRDWtZsZdeusASLcpyamz", "name": "Android Dev 2", @@ -119,8 +129,13 @@ class RudderTests: XCTestCase { "liveEventsConfig": { }, - "dataPlaneUrls": { - "us": "https://rudderstacgwyx-us.dataplane.rudderstack.com" + "dataplanes": { + "US": [ + { + "url": "https://rudderstacgwyx-us.dataplane.rudderstack.com", + "default": true + } + ] }, "id": "2GcaJMDRDWtZsZdeusASLcpyamz", "name": "Android Dev 2", @@ -192,8 +207,13 @@ class RudderTests: XCTestCase { "liveEventsConfig": { }, - "dataPlaneUrls": { - "eu": "https://rudderstacgwyx-eu.dataplane.rudderstack.com" + "dataplanes": { + "EU": [ + { + "url": "https://rudderstacgwyx-eu.dataplane.rudderstack.com", + "default": true + } + ] }, "id": "2GcaJMDRDWtZsZdeusASLcpyamz", "name": "Android Dev 2", diff --git a/Sources/Classes/Public/RSServerConfigSource.h b/Sources/Classes/Public/RSServerConfigSource.h index e2a37610..1714eac8 100644 --- a/Sources/Classes/Public/RSServerConfigSource.h +++ b/Sources/Classes/Public/RSServerConfigSource.h @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readwrite) BOOL isSourceEnabled; @property (nonatomic, readwrite) NSString *updatedAt; @property (nonatomic, readwrite) NSMutableArray *destinations; -@property (nonatomic, readwrite) NSMutableDictionary* dataResidencyUrls; +@property (nonatomic, readwrite) NSMutableDictionary* dataPlanes; - (void) addDestination: (RSServerDestination*) destination; - (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency; diff --git a/Sources/Classes/RSServerConfigManager.m b/Sources/Classes/RSServerConfigManager.m index 39274b59..06796f7d 100644 --- a/Sources/Classes/RSServerConfigManager.m +++ b/Sources/Classes/RSServerConfigManager.m @@ -115,7 +115,7 @@ - (RSServerConfigSource *)_parseConfig:(NSString *)configStr { [destinations addObject:destination]; } - source.dataResidencyUrls = [sourceDict objectForKey:@"dataPlaneUrls"]; + source.dataPlanes = [sourceDict objectForKey:@"dataplanes"]; source.destinations = destinations; } else { [RSLogger logError:@"config deserializaion error"]; diff --git a/Sources/Classes/RSServerConfigSource.m b/Sources/Classes/RSServerConfigSource.m index 526f2674..fb588f7f 100644 --- a/Sources/Classes/RSServerConfigSource.m +++ b/Sources/Classes/RSServerConfigSource.m @@ -15,7 +15,7 @@ - (instancetype)init self = [super init]; if (self) { self.destinations = [[NSMutableArray alloc] init]; - self.dataResidencyUrls = [[NSMutableDictionary alloc] init]; + self.dataPlanes = [[NSMutableDictionary alloc] init]; } return self; } @@ -25,14 +25,25 @@ - (void)addDestination:(RSServerDestination *)destination { } - (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency { + NSArray * residenceDataPlanes; switch(residency) { case EU: - if([self.dataResidencyUrls objectForKey:@"eu"] != nil) { - return [self.dataResidencyUrls objectForKey:@"eu"]; - } + residenceDataPlanes = [self.dataPlanes objectForKey:@"EU"]; default: - return [self.dataResidencyUrls objectForKey:@"us"]; + if (residenceDataPlanes != nil) + break; + residenceDataPlanes = [self.dataPlanes objectForKey:@"US"]; } + + if(residenceDataPlanes == nil) + return nil; + for (NSDictionary* residenceDataPlane in residenceDataPlanes) { + if([[residenceDataPlane objectForKey:@"default"] boolValue]) { + NSLog(@"Data type is %@",[[residenceDataPlane objectForKey:@"default"] class]); + return [residenceDataPlane objectForKey:@"url"]; + } + } + return nil; } @end From cb98d738a6cea598ede2ca9a85609c191fe33e3b Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Thu, 10 Nov 2022 12:17:30 +0530 Subject: [PATCH 09/13] fix: Fixed Issues related to returning a nil type from functions --- Sources/Classes/Public/RSServerConfigManager.h | 2 +- Sources/Classes/Public/RSServerConfigSource.h | 2 +- Sources/Classes/RSServerConfigManager.m | 2 +- Sources/Classes/RSServerConfigSource.m | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Classes/Public/RSServerConfigManager.h b/Sources/Classes/Public/RSServerConfigManager.h index fda2077f..e93a39c9 100644 --- a/Sources/Classes/Public/RSServerConfigManager.h +++ b/Sources/Classes/Public/RSServerConfigManager.h @@ -20,7 +20,7 @@ NS_ASSUME_NONNULL_BEGIN @property RSPreferenceManager *preferenceManager; - (instancetype)init: (NSString*) writeKey rudderConfig:(RSConfig*) rudderConfig; -- (RSServerConfigSource *)_parseConfig:(NSString *)configStr; +- (RSServerConfigSource *_Nullable)_parseConfig:(NSString *)configStr; - (RSServerConfigSource*) getConfig; - (int) getError; diff --git a/Sources/Classes/Public/RSServerConfigSource.h b/Sources/Classes/Public/RSServerConfigSource.h index 1714eac8..4a0a9e1a 100644 --- a/Sources/Classes/Public/RSServerConfigSource.h +++ b/Sources/Classes/Public/RSServerConfigSource.h @@ -22,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readwrite) NSMutableDictionary* dataPlanes; - (void) addDestination: (RSServerDestination*) destination; -- (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency; +- (NSString *_Nullable) getDataResidencyUrl:(RSDataResidencyServer) residency; @end diff --git a/Sources/Classes/RSServerConfigManager.m b/Sources/Classes/RSServerConfigManager.m index 06796f7d..577494f7 100644 --- a/Sources/Classes/RSServerConfigManager.m +++ b/Sources/Classes/RSServerConfigManager.m @@ -67,7 +67,7 @@ - (RSServerConfigSource* _Nullable) _retrieveConfig { } } -- (RSServerConfigSource *)_parseConfig:(NSString *)configStr { +- (RSServerConfigSource *_Nullable)_parseConfig:(NSString *)configStr { NSError *error; NSDictionary *configDict = [NSJSONSerialization JSONObjectWithData:[configStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&error]; diff --git a/Sources/Classes/RSServerConfigSource.m b/Sources/Classes/RSServerConfigSource.m index fb588f7f..ebf4a698 100644 --- a/Sources/Classes/RSServerConfigSource.m +++ b/Sources/Classes/RSServerConfigSource.m @@ -24,11 +24,12 @@ - (void)addDestination:(RSServerDestination *)destination { [self.destinations addObject:destination]; } -- (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency { +- (NSString *_Nullable) getDataResidencyUrl:(RSDataResidencyServer) residency { NSArray * residenceDataPlanes; switch(residency) { case EU: residenceDataPlanes = [self.dataPlanes objectForKey:@"EU"]; + // If EU is missing from the sourceConfig response we should fallback to the US, hence the break is not added here. default: if (residenceDataPlanes != nil) break; @@ -39,7 +40,6 @@ - (NSString *) getDataResidencyUrl:(RSDataResidencyServer) residency { return nil; for (NSDictionary* residenceDataPlane in residenceDataPlanes) { if([[residenceDataPlane objectForKey:@"default"] boolValue]) { - NSLog(@"Data type is %@",[[residenceDataPlane objectForKey:@"default"] class]); return [residenceDataPlane objectForKey:@"url"]; } } From 92ac1e97a58deb9b1d5fb2c6c2aa953bc1b58d41 Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Thu, 10 Nov 2022 13:22:47 +0530 Subject: [PATCH 10/13] fix: Checking if the residencyURL is nil before using it --- Sources/Classes/RSUtils.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Classes/RSUtils.m b/Sources/Classes/RSUtils.m index 897fc6f2..66ecaa08 100644 --- a/Sources/Classes/RSUtils.m +++ b/Sources/Classes/RSUtils.m @@ -148,7 +148,7 @@ + (NSString*) appendSlashToUrl:(NSString*) url { } + (NSString *) getDataPlaneUrlFrom:(RSServerConfigSource *) serverConfig andRSConfig:(RSConfig *) rsConfig { - if([serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer]) { + if([serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer] != nil) { return [RSUtils appendSlashToUrl:[serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer]]; } return [RSUtils appendSlashToUrl:rsConfig.dataPlaneUrl]; From a44eac287c8ff607932789fa3c479d4f59191128 Mon Sep 17 00:00:00 2001 From: Pallab Maiti Date: Sat, 19 Nov 2022 11:30:28 +0530 Subject: [PATCH 11/13] made the enum swift compatible --- Sources/Classes/Public/RSEnums.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/Classes/Public/RSEnums.h b/Sources/Classes/Public/RSEnums.h index 1223eb82..7e3a399e 100644 --- a/Sources/Classes/Public/RSEnums.h +++ b/Sources/Classes/Public/RSEnums.h @@ -8,9 +8,9 @@ #ifndef RSEnums_h #define RSEnums_h -typedef enum { - EU, - US -} RSDataResidencyServer; +typedef NS_ENUM(NSInteger, RSDataResidencyServer) { + EU, + US +}; #endif /* RSEnums_h */ From 51102e62b606836efc9b3e80791c7d2bcc1993c2 Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Mon, 21 Nov 2022 14:49:17 +0530 Subject: [PATCH 12/13] test: updated enum access in unit tests --- RudderTests/RudderTests.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/RudderTests/RudderTests.swift b/RudderTests/RudderTests.swift index dd596af7..3182863c 100644 --- a/RudderTests/RudderTests.swift +++ b/RudderTests/RudderTests.swift @@ -104,9 +104,9 @@ class RudderTests: XCTestCase { rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.EU).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-eu.dataplane.rudderstack.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.US).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") } @@ -182,9 +182,9 @@ class RudderTests: XCTestCase { rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.EU).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.US).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-us.dataplane.rudderstack.com/") } @@ -260,9 +260,9 @@ class RudderTests: XCTestCase { rsServerConfigManager = RSServerConfigManager(writeKey, rudderConfig: rsConfig); rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.EU).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://rudderstacgwyx-eu.dataplane.rudderstack.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.US).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") } @@ -330,10 +330,10 @@ class RudderTests: XCTestCase { rsServerConfigSource = rsServerConfigManager._parseConfig(configJson) XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(EU).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.EU).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") - rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(US).withDataPlaneUrl("https://some.random.dataplane.com").build() + rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataResidencyServer(RSDataResidencyServer.US).withDataPlaneUrl("https://some.random.dataplane.com").build() XCTAssertEqual(RSUtils.getDataPlaneUrl(from: rsServerConfigSource, andRSConfig: rsConfig), "https://some.random.dataplane.com/") rsConfig = RSConfigBuilder().withLoglevel(RSLogLevelVerbose).withDataPlaneUrl("https::/somerandomdataplanecom").build() From c99acaf06529eafd0bc0d7c4a9f72457ddb3a70b Mon Sep 17 00:00:00 2001 From: Desu Sai Venkat Date: Wed, 23 Nov 2022 12:06:25 +0530 Subject: [PATCH 13/13] fix: made changes as per sonarcloud bug --- Sources/Classes/RSUtils.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/Classes/RSUtils.m b/Sources/Classes/RSUtils.m index 66ecaa08..72aa0879 100644 --- a/Sources/Classes/RSUtils.m +++ b/Sources/Classes/RSUtils.m @@ -148,10 +148,11 @@ + (NSString*) appendSlashToUrl:(NSString*) url { } + (NSString *) getDataPlaneUrlFrom:(RSServerConfigSource *) serverConfig andRSConfig:(RSConfig *) rsConfig { - if([serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer] != nil) { - return [RSUtils appendSlashToUrl:[serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer]]; + NSString* dataResidencyUrl = [serverConfig getDataResidencyUrl:rsConfig.dataResidencyServer]; + if(dataResidencyUrl == nil) { + return [RSUtils appendSlashToUrl:rsConfig.dataPlaneUrl]; } - return [RSUtils appendSlashToUrl:rsConfig.dataPlaneUrl]; + return [RSUtils appendSlashToUrl:dataResidencyUrl]; } unsigned int MAX_EVENT_SIZE = 32 * 1024; // 32 KB