Skip to content

Commit d7f6b62

Browse files
authored
Emt-2337 setAnonID API (#1519)
Added API setAnnonID and Unit Tests for it.
1 parent e29ddd9 commit d7f6b62

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

Branch-TestBed/Branch-SDK-Tests/BranchClassTests.m

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,5 +261,102 @@ - (void)testSetConsumerProtectionAttributionLevel {
261261

262262
}
263263

264+
- (void)testSetAnonID {
265+
NSString *expectedAnonID = @"static-test-anon-id-12345";
266+
267+
[Branch setAnonID:expectedAnonID];
268+
269+
NSString *actualAnonID = [BNCPreferenceHelper sharedInstance].anonID;
270+
XCTAssertEqualObjects(actualAnonID, expectedAnonID, @"setAnonID should set valid string");
271+
}
272+
273+
- (void)testSetAnonID_UpdateExistingValue {
274+
NSString *initialAnonID = @"initial-anon-id";
275+
NSString *updatedAnonID = @"updated-anon-id";
276+
277+
[Branch setAnonID:initialAnonID];
278+
XCTAssertEqualObjects([BNCPreferenceHelper sharedInstance].anonID, initialAnonID);
279+
280+
[Branch setAnonID:updatedAnonID];
281+
XCTAssertEqualObjects([BNCPreferenceHelper sharedInstance].anonID, updatedAnonID);
282+
}
283+
284+
- (void)testSetAnonID_NilValue {
285+
NSString *initialAnonID = @"initial-anon-id";
286+
287+
[Branch setAnonID:initialAnonID];
288+
XCTAssertEqualObjects([BNCPreferenceHelper sharedInstance].anonID, initialAnonID);
289+
290+
[Branch setAnonID:nil];
291+
XCTAssertEqualObjects([BNCPreferenceHelper sharedInstance].anonID, initialAnonID);
292+
}
293+
294+
- (void)testSetAnonID_EmptyString {
295+
NSString *emptyAnonID = @"";
296+
297+
[Branch setAnonID:emptyAnonID];
298+
299+
NSString *actualAnonID = [BNCPreferenceHelper sharedInstance].anonID;
300+
XCTAssertEqualObjects(actualAnonID, emptyAnonID, @"Static setAnonID should accept empty string");
301+
}
302+
303+
- (void)testSetAnonID_NonStringObject {
304+
NSString *initialAnonID = @"initial-anon-id";
305+
306+
[Branch setAnonID:initialAnonID];
307+
XCTAssertEqualObjects([BNCPreferenceHelper sharedInstance].anonID, initialAnonID);
308+
309+
// Try to set with a non-string object (NSNumber)
310+
NSNumber *nonStringValue = @123;
311+
[Branch setAnonID:(NSString *)nonStringValue];
312+
313+
XCTAssertEqualObjects([BNCPreferenceHelper sharedInstance].anonID, initialAnonID);
314+
}
315+
316+
- (void)testSetAnonID_LongString {
317+
NSString *longAnonID = @"very-long-anon-id-with-many-characters-to-test-string-handling-1234567890-abcdefghijklmnopqrstuvwxyz";
318+
319+
[Branch setAnonID:longAnonID];
320+
321+
NSString *actualAnonID = [BNCPreferenceHelper sharedInstance].anonID;
322+
XCTAssertEqualObjects(actualAnonID, longAnonID, @"setAnonID should handle long strings");
323+
}
324+
325+
- (void)testSetAnonID_SpecialCharacters {
326+
NSString *specialCharAnonID = @"static-anon-id-with-special-chars-!@#$%^&*()_+-=[]{}|;:,.<>?";
327+
328+
[Branch setAnonID:specialCharAnonID];
329+
330+
NSString *actualAnonID = [BNCPreferenceHelper sharedInstance].anonID;
331+
XCTAssertEqualObjects(actualAnonID, specialCharAnonID, @"setAnonID should handle special characters");
332+
}
333+
334+
- (void)testSetAnonID_ThreadSafety {
335+
NSString *anonID1 = @"thread-test-anon-id-1";
336+
NSString *anonID2 = @"thread-test-anon-id-2";
337+
338+
// Test that the method is thread-safe by calling it from different queues
339+
dispatch_group_t group = dispatch_group_create();
340+
341+
dispatch_group_enter(group);
342+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
343+
[Branch setAnonID:anonID1];
344+
dispatch_group_leave(group);
345+
});
346+
347+
dispatch_group_enter(group);
348+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
349+
[Branch setAnonID:anonID2];
350+
dispatch_group_leave(group);
351+
});
352+
353+
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
354+
355+
// Verify that one of the values was set (we can't predict which due to concurrency)
356+
NSString *finalAnonID = [BNCPreferenceHelper sharedInstance].anonID;
357+
XCTAssertTrue([finalAnonID isEqualToString:anonID1] || [finalAnonID isEqualToString:anonID2],
358+
@"One of the anonID values should be set");
359+
}
360+
264361

265362
@end

Sources/BranchSDK/Branch.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,16 @@ + (void)setODMInfo:(NSString *)odmInfo andFirstOpenTimestamp:(NSDate *) firstOpe
605605

606606
}
607607

608+
+ (void)setAnonID:(NSString *)anonID {
609+
@synchronized (self) {
610+
if (anonID && [anonID isKindOfClass:[NSString class]]) {
611+
[BNCPreferenceHelper sharedInstance].anonID = anonID;
612+
} else {
613+
[[BranchLogger shared] logWarning:@"Invalid anonID provided. Must be a non-nil NSString." error:nil];
614+
}
615+
}
616+
}
617+
608618
- (void)setConsumerProtectionAttributionLevel:(BranchAttributionLevel)level {
609619
self.preferenceHelper.attributionLevel = level;
610620

Sources/BranchSDK/Public/Branch.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,12 @@ Sets a custom base safetrack URL for non-linking calls to the Branch API.
836836

837837
+ (void)setODMInfo:(NSString *)odmInfo andFirstOpenTimestamp:(NSDate *) firstOpenTimestamp;
838838

839+
/**
840+
Sets a custom Meta Anon ID for the current user.
841+
@param anonID The custom Meta Anon ID to be used by Branch.
842+
*/
843+
+ (void)setAnonID:(NSString *)anonID;
844+
839845
/**
840846
* Enumeration representing different levels of consumer protection attribution levels
841847
*/

0 commit comments

Comments
 (0)