Skip to content

Commit d4ef623

Browse files
authored
feat: SDKE-64 Improve mParticle.m test coverage in swift (#406)
* - extract executor code to call it from mParticle file, old code still available because it is used from different places * - use executor instead dispatch_async * - move executor in separate files
1 parent 0ca4964 commit d4ef623

File tree

4 files changed

+190
-118
lines changed

4 files changed

+190
-118
lines changed

mParticle-Apple-SDK.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
351308202E6729DA002A3AD6 /* MPKitContainerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3513081E2E6729D0002A3AD6 /* MPKitContainerMock.swift */; };
1212
351308242E676F18002A3AD6 /* MPPersistenceControllerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351308232E676F12002A3AD6 /* MPPersistenceControllerMock.swift */; };
1313
351308252E676F18002A3AD6 /* MPPersistenceControllerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351308232E676F12002A3AD6 /* MPPersistenceControllerMock.swift */; };
14+
351308412E6B28F5002A3AD6 /* Executor.h in Headers */ = {isa = PBXBuildFile; fileRef = 3513083F2E6B28F5002A3AD6 /* Executor.h */; };
15+
351308422E6B28F5002A3AD6 /* Executor.m in Sources */ = {isa = PBXBuildFile; fileRef = 351308402E6B28F5002A3AD6 /* Executor.m */; };
16+
351308432E6B28F5002A3AD6 /* Executor.h in Headers */ = {isa = PBXBuildFile; fileRef = 3513083F2E6B28F5002A3AD6 /* Executor.h */; };
17+
351308442E6B28F5002A3AD6 /* Executor.m in Sources */ = {isa = PBXBuildFile; fileRef = 351308402E6B28F5002A3AD6 /* Executor.m */; };
1418
35329FE92E54C38C009AC4FD /* MPNetworkOptions+MParticlePrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 35329FE82E54C38C009AC4FD /* MPNetworkOptions+MParticlePrivate.m */; };
1519
35329FEA2E54C38C009AC4FD /* MPNetworkOptions+MParticlePrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 35329FE82E54C38C009AC4FD /* MPNetworkOptions+MParticlePrivate.m */; };
1620
35329FEC2E54C483009AC4FD /* MPNetworkOptions+MParticlePrivateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35329FEB2E54C480009AC4FD /* MPNetworkOptions+MParticlePrivateTests.swift */; };
@@ -571,6 +575,8 @@
571575
/* Begin PBXFileReference section */
572576
3513081E2E6729D0002A3AD6 /* MPKitContainerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPKitContainerMock.swift; sourceTree = "<group>"; };
573577
351308232E676F12002A3AD6 /* MPPersistenceControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPersistenceControllerMock.swift; sourceTree = "<group>"; };
578+
3513083F2E6B28F5002A3AD6 /* Executor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Executor.h; sourceTree = "<group>"; };
579+
351308402E6B28F5002A3AD6 /* Executor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Executor.m; sourceTree = "<group>"; };
574580
35329FE82E54C38C009AC4FD /* MPNetworkOptions+MParticlePrivate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "MPNetworkOptions+MParticlePrivate.m"; sourceTree = "<group>"; };
575581
35329FEB2E54C480009AC4FD /* MPNetworkOptions+MParticlePrivateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MPNetworkOptions+MParticlePrivateTests.swift"; sourceTree = "<group>"; };
576582
35329FEE2E54CA49009AC4FD /* MParticleOptions+MParticlePrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MParticleOptions+MParticlePrivate.h"; sourceTree = "<group>"; };
@@ -937,6 +943,8 @@
937943
53A79A7B29CCCD6400E7489F /* mParticle-Apple-SDK */ = {
938944
isa = PBXGroup;
939945
children = (
946+
3513083F2E6B28F5002A3AD6 /* Executor.h */,
947+
351308402E6B28F5002A3AD6 /* Executor.m */,
940948
53A79C2229CDFB4800E7489F /* Include */,
941949
53A79B3629CDFB1F00E7489F /* mParticle.m */,
942950
359BAFF82E56330200A8A704 /* SettingsProvider.h */,
@@ -1428,6 +1436,7 @@
14281436
53A79BE929CDFB2000E7489F /* MPApplication.h in Headers */,
14291437
D30CD0CB2CFF5FB100F5148A /* MPStateMachine.h in Headers */,
14301438
53A79BF329CDFB2000E7489F /* MPCustomModulePreference.h in Headers */,
1439+
351308412E6B28F5002A3AD6 /* Executor.h in Headers */,
14311440
53A79B8C29CDFB2000E7489F /* MPDataModelProtocol.h in Headers */,
14321441
53A79BFB29CDFB2100E7489F /* MPAppDelegateProxy.h in Headers */,
14331442
359BAFFA2E56330200A8A704 /* SettingsProvider.h in Headers */,
@@ -1523,6 +1532,7 @@
15231532
53A79D2729CE23F700E7489F /* MPApplication.h in Headers */,
15241533
53A79D2829CE23F700E7489F /* MPCustomModulePreference.h in Headers */,
15251534
53A79D2929CE23F700E7489F /* MPDataModelProtocol.h in Headers */,
1535+
351308432E6B28F5002A3AD6 /* Executor.h in Headers */,
15261536
53A79D2A29CE23F700E7489F /* MPAppDelegateProxy.h in Headers */,
15271537
53A79D2C29CE23F700E7489F /* MPIConstants.h in Headers */,
15281538
359BAFF92E56330200A8A704 /* SettingsProvider.h in Headers */,
@@ -1854,6 +1864,7 @@
18541864
530D24802CFF70B0000FE7E3 /* MPUserIdentityInstance.swift in Sources */,
18551865
5399DDB82CA727E5006526E1 /* MPZip.swift in Sources */,
18561866
53A79B8329CDFB2000E7489F /* MPPersistenceController.mm in Sources */,
1867+
351308422E6B28F5002A3AD6 /* Executor.m in Sources */,
18571868
53A79BEB29CDFB2000E7489F /* NSNumber+MPFormatter.swift in Sources */,
18581869
53A79B6D29CDFB2000E7489F /* FilteredMParticleUser.m in Sources */,
18591870
53A79C0729CDFB2100E7489F /* MPBaseEvent.m in Sources */,
@@ -2046,6 +2057,7 @@
20462057
530D247F2CFF70B0000FE7E3 /* MPUserIdentityInstance.swift in Sources */,
20472058
5399DDB92CA727E5006526E1 /* MPZip.swift in Sources */,
20482059
53A79D7129CE23F700E7489F /* MPPersistenceController.mm in Sources */,
2060+
351308442E6B28F5002A3AD6 /* Executor.m in Sources */,
20492061
53A79D7329CE23F700E7489F /* FilteredMParticleUser.m in Sources */,
20502062
53A79D7429CE23F700E7489F /* MPBaseEvent.m in Sources */,
20512063
53A79D7529CE23F700E7489F /* MPAttributeProjection.m in Sources */,

mParticle-Apple-SDK/Executor.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#import <Foundation/Foundation.h>
2+
3+
@protocol ExecutorProtocol
4+
- (dispatch_queue_t)messageQueue;
5+
- (BOOL)isMessageQueue;
6+
- (void)executeOnMessage:(void(^)(void))block;
7+
- (void)executeOnMessageSync:(void(^)(void))block;
8+
- (void)executeOnMain:(void(^)(void))block;
9+
- (void)executeOnMainSync:(void(^)(void))block;
10+
@end
11+
12+
@interface Executor : NSObject<ExecutorProtocol>
13+
- (dispatch_queue_t)messageQueue;
14+
- (BOOL)isMessageQueue;
15+
- (void)executeOnMessage:(void(^)(void))block;
16+
- (void)executeOnMessageSync:(void(^)(void))block;
17+
- (void)executeOnMain:(void(^)(void))block;
18+
- (void)executeOnMainSync:(void(^)(void))block;
19+
@end

mParticle-Apple-SDK/Executor.m

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#import "Executor.h"
2+
3+
@implementation Executor
4+
5+
static dispatch_queue_t messageQueue = nil;
6+
static void *messageQueueKey = "mparticle message queue key";
7+
static void *messageQueueToken = "mparticle message queue token";
8+
9+
- (instancetype)init {
10+
self = [super init];
11+
if (!self) {
12+
return nil;
13+
}
14+
messageQueue = dispatch_queue_create("com.mparticle.messageQueue", DISPATCH_QUEUE_SERIAL);
15+
dispatch_queue_set_specific(messageQueue, messageQueueKey, messageQueueToken, nil);
16+
17+
return self;
18+
}
19+
20+
- (dispatch_queue_t)messageQueue {
21+
return messageQueue;
22+
}
23+
24+
- (BOOL)isMessageQueue {
25+
void *token = dispatch_get_specific(messageQueueKey);
26+
BOOL isMessage = token == messageQueueToken;
27+
return isMessage;
28+
}
29+
30+
- (void)executeOnMessage:(void(^)(void))block {
31+
if (self.isMessageQueue) {
32+
block();
33+
} else {
34+
dispatch_async(self.messageQueue, block);
35+
}
36+
}
37+
38+
- (void)executeOnMessageSync:(void(^)(void))block {
39+
if (self.isMessageQueue) {
40+
block();
41+
} else {
42+
dispatch_sync(self.messageQueue, block);
43+
}
44+
}
45+
46+
- (void)executeOnMain:(void(^)(void))block {
47+
if ([NSThread isMainThread]) {
48+
block();
49+
} else {
50+
dispatch_async(dispatch_get_main_queue(), block);
51+
}
52+
}
53+
54+
- (void)executeOnMainSync:(void(^)(void))block {
55+
if ([NSThread isMainThread]) {
56+
block();
57+
} else {
58+
dispatch_sync(dispatch_get_main_queue(), block);
59+
}
60+
}
61+
62+
@end

0 commit comments

Comments
 (0)