Skip to content

Commit 580d41d

Browse files
authored
Merge pull request #46 from optimizely/josh.wang/project_config/fix_nil_error_handler
Fix Nil Error Handler
2 parents caac102 + ac0f214 commit 580d41d

File tree

5 files changed

+70
-56
lines changed

5 files changed

+70
-56
lines changed

OptimizelySDKCore/OptimizelySDKCore/OPTLYBuilder.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ - (id)initWithBlock:(OPTLYBuilderBlock)block {
5050
}
5151

5252
_config = [OPTLYProjectConfig initWithBuilderBlock:^(OPTLYProjectConfigBuilder * _Nullable builder) {
53-
builder.datafile = _datafile;
54-
builder.userProfile = _userProfile;
55-
builder.logger = _logger;
56-
builder.errorHandler = _errorHandler;
53+
builder.datafile = self.datafile;
54+
builder.userProfile = self.userProfile;
55+
builder.logger = self.logger;
56+
builder.errorHandler = self.errorHandler;
5757
}];
5858

5959
if (_config == nil) {

OptimizelySDKCore/OptimizelySDKCore/OPTLYProjectConfig.m

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -54,82 +54,88 @@ + (nullable instancetype)initWithBuilderBlock:(nonnull OPTLYProjectConfigBuilder
5454
}
5555

5656
- (instancetype)initWithBuilder:(OPTLYProjectConfigBuilder *)builder {
57-
58-
if (!builder.datafile) {
59-
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
60-
code:OPTLYErrorTypesDatafileInvalid
61-
userInfo:@{NSLocalizedDescriptionKey :
62-
NSLocalizedString(OPTLYErrorHandlerMessagesDataFileInvalid, nil)}];
63-
[_errorHandler handleError:error];
64-
65-
NSString *logMessage = OPTLYErrorHandlerMessagesDataFileInvalid;
66-
[_logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
67-
return nil;
68-
}
69-
70-
NSError *datafileError;
71-
@try {
72-
self = [super initWithData:builder.datafile error:&datafileError];
73-
}
74-
@catch (NSException *datafileException) {
75-
[_errorHandler handleException:datafileException];
76-
}
77-
78-
if (datafileError)
79-
{
80-
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
81-
code:OPTLYErrorTypesDatafileInvalid
82-
userInfo:datafileError.userInfo];
83-
[_errorHandler handleError:error];
84-
return nil;
85-
}
86-
57+
// check for valid error handler
8758
if (builder.errorHandler) {
88-
if ([OPTLYErrorHandler conformsToOPTLYErrorHandlerProtocol:[builder.errorHandler class]]) {
89-
_errorHandler = (id<OPTLYErrorHandler, Ignore>)builder.errorHandler;
90-
} else {
91-
_errorHandler = [OPTLYErrorHandlerDefault new];
59+
if (![OPTLYErrorHandler conformsToOPTLYErrorHandlerProtocol:[builder.errorHandler class]]) {
9260
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
9361
code:OPTLYErrorTypesErrorHandlerInvalid
9462
userInfo:@{NSLocalizedDescriptionKey :
9563
NSLocalizedString(OPTLYErrorHandlerMessagesErrorHandlerInvalid, nil)}];
96-
[_errorHandler handleError:error];
64+
[[[OPTLYErrorHandlerNoOp alloc] init] handleError:error];
9765

9866
NSString *logMessage = OPTLYErrorHandlerMessagesErrorHandlerInvalid;
99-
[_logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
67+
[[[OPTLYLoggerDefault alloc] initWithLogLevel:OptimizelyLogLevelAll] logMessage:logMessage withLevel:OptimizelyLogLevelError];
68+
return nil;
10069
}
10170
}
10271

72+
// check for valid logger
10373
if (builder.logger) {
104-
if ([builder.logger conformsToProtocol:@protocol(OPTLYLogger)]) {
105-
_logger = (id<OPTLYLogger, Ignore>)builder.logger;
106-
} else {
107-
_logger = [OPTLYLoggerDefault new];
74+
if (![builder.logger conformsToProtocol:@protocol(OPTLYLogger)]) {
75+
builder.logger = [OPTLYLoggerDefault new];
10876
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
10977
code:OPTLYErrorTypesLoggerInvalid
11078
userInfo:@{NSLocalizedDescriptionKey :
11179
NSLocalizedString(OPTLYErrorHandlerMessagesLoggerInvalid, nil)}];
112-
[_errorHandler handleError:error];
80+
[builder.errorHandler handleError:error];
11381

11482
NSString *logMessage = OPTLYErrorHandlerMessagesLoggerInvalid;
115-
[_logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
83+
[builder.logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
84+
return nil;
11685
}
11786
}
11887

88+
// check that datafile exists
89+
if (!builder.datafile) {
90+
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
91+
code:OPTLYErrorTypesDatafileInvalid
92+
userInfo:@{NSLocalizedDescriptionKey :
93+
NSLocalizedString(OPTLYErrorHandlerMessagesDataFileInvalid, nil)}];
94+
[builder.errorHandler handleError:error];
95+
96+
NSString *logMessage = OPTLYErrorHandlerMessagesDataFileInvalid;
97+
[builder.logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
98+
return nil;
99+
}
100+
101+
// check for valid user profile
119102
if (builder.userProfile) {
120-
if ([OPTLYUserProfileUtility conformsToOPTLYUserProfileProtocol:[builder.userProfile class]]) {
121-
_userProfile = (id<OPTLYUserProfile, Ignore>)builder.userProfile;
122-
} else {
103+
if (![OPTLYUserProfileUtility conformsToOPTLYUserProfileProtocol:[builder.userProfile class]]) {
123104
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
124105
code:OPTLYErrorTypesUserProfile
125106
userInfo:@{NSLocalizedDescriptionKey :
126107
NSLocalizedString(OPTLYErrorHandlerMessagesUserProfileInvalid, nil)}];
127-
[_errorHandler handleError:error];
108+
[builder.errorHandler handleError:error];
128109

129110
NSString *logMessage = OPTLYErrorHandlerMessagesUserProfileInvalid;
130-
[_logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
111+
[builder.logger logMessage:logMessage withLevel:OptimizelyLogLevelError];
112+
return nil;
113+
}
114+
}
115+
116+
// check datafile is valid
117+
@try {
118+
NSError *datafileError;
119+
OPTLYProjectConfig *projectConfig = [[OPTLYProjectConfig alloc] initWithData:builder.datafile error:&datafileError];
120+
if (datafileError)
121+
{
122+
NSError *error = [NSError errorWithDomain:OPTLYErrorHandlerMessagesDomain
123+
code:OPTLYErrorTypesDatafileInvalid
124+
userInfo:datafileError.userInfo];
125+
[builder.errorHandler handleError:error];
126+
return nil;
127+
}
128+
else {
129+
self = projectConfig;
131130
}
132131
}
132+
@catch (NSException *datafileException) {
133+
[builder.errorHandler handleException:datafileException];
134+
}
135+
136+
_errorHandler = (id<OPTLYErrorHandler, Ignore>)builder.errorHandler;
137+
_logger = (id<OPTLYLogger, Ignore>)builder.logger;
138+
_userProfile = (id<OPTLYUserProfile, Ignore>)builder.userProfile;
133139
return self;
134140
}
135141

OptimizelySDKCore/OptimizelySDKCore/OPTLYProjectConfigBuilder.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ - (id)initWithBlock:(OPTLYProjectConfigBuilderBlock)block {
3030
self = [super init];
3131
if (self != nil) {
3232
block(self);
33+
if (!_datafile) {
34+
return nil;
35+
}
3336
}
3437
return self;
3538
}

OptimizelySDKCore/OptimizelySDKCoreTests/OPTLYBuilderTest.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,11 @@ - (void)testInitializationWithoutBuilder {
112112
XCTAssertNil(optimizely);
113113
}
114114

115+
- (void)testBuilderReturnsNilWithBadDatafile {
116+
Optimizely *optimizely = [Optimizely initWithBuilderBlock:^(OPTLYBuilder * _Nullable builder) {
117+
builder.datafile = [[NSData alloc] init];
118+
}];
119+
XCTAssertNil(optimizely);
120+
}
121+
115122
@end

OptimizelySDKCore/OptimizelySDKCoreTests/OPTLYProjectConfigTest.m

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ - (void)testInitWithBuilderBlockNoDatafile
7474
XCTAssertNil(projectConfig, @"project config should be nil.");
7575
}
7676

77-
- (void)testInitWithBuilderBlockInvalidModules {
77+
- (void)testInitWithBuilderBlockInvalidModulesFails {
7878
NSData *datafile = [OPTLYTestHelper loadJSONDatafileIntoDataObject:kDataModelDatafileName];
7979

8080
id<OPTLYUserProfile> userProfile = [NSObject new];
@@ -88,10 +88,7 @@ - (void)testInitWithBuilderBlockInvalidModules {
8888
builder.errorHandler = errorHandler;
8989
}];
9090

91-
XCTAssertNotNil(projectConfig, @"project config should not be nil.");
92-
XCTAssertNil(projectConfig.userProfile, @"userProfile should be nil.");
93-
XCTAssert(projectConfig.logger, @"logger should not be nil."); // default logger is set
94-
XCTAssert(projectConfig.errorHandler, @"error handler should not be nil."); // default error handler is set
91+
XCTAssertNil(projectConfig, @"project config should not be able to be created with invalid modules.");
9592
}
9693

9794
- (void)testInitWithDatafile
@@ -150,4 +147,5 @@ - (void)checkProjectConfigProperties:(OPTLYProjectConfig *)projectConfig
150147
NSAssert([event isKindOfClass:[OPTLYEvent class]], @"deserializeJSONArray failed to deserialize the event object in project config.");
151148
}
152149
}
150+
153151
@end

0 commit comments

Comments
 (0)