Skip to content

Commit c1dd056

Browse files
authored
Merge pull request #885 from akvelon/fix/disabled-core
Fix state of services and internal classes when AppCenter started as disabled
2 parents 023a0bd + 63b760e commit c1dd056

File tree

5 files changed

+118
-60
lines changed

5 files changed

+118
-60
lines changed

AppCenter/AppCenter/Internals/Channel/MSChannelDefault.m

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ - (instancetype)init {
1616
_pendingBatchQueueFull = NO;
1717
_availableBatchFromStorage = NO;
1818
_enabled = YES;
19+
_suspended = NO;
20+
_discardLogs = NO;
1921

2022
_delegates = [NSHashTable weakObjectsHashTable];
2123
}
@@ -109,6 +111,11 @@ - (void)enqueueItem:(id<MSLog>)item withCompletion:(enqueueCompletionBlock)compl
109111
}
110112

111113
- (void)flushQueue {
114+
115+
// Don't flush while disabled.
116+
if (!self.enabled) {
117+
return;
118+
}
112119

113120
// Cancel any timer.
114121
[self resetTimer];
@@ -232,8 +239,16 @@ - (void)flushQueue {
232239
#pragma mark - Timer
233240

234241
- (void)startTimer {
242+
243+
// Don't start timer while disabled.
244+
if (!self.enabled) {
245+
return;
246+
}
247+
248+
// Cancel any timer.
235249
[self resetTimer];
236-
250+
251+
// Create new timer.
237252
self.timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.logsDispatchQueue);
238253

239254
/**

AppCenter/AppCenter/Internals/Sender/MSHttpSender.m

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,16 +193,19 @@ - (void)resume {
193193

194194
- (void)sendCallAsync:(MSSenderCall *)call {
195195
@synchronized(self) {
196-
if (self.suspended)
196+
if (self.suspended || !self.enabled) {
197197
return;
198+
}
198199

199-
if (!call)
200+
if (!call) {
200201
return;
202+
}
201203

202204
// Create the request.
203205
NSURLRequest *request = [self createRequest:call.data];
204-
if (!request)
206+
if (!request) {
205207
return;
208+
}
206209

207210
// Create a task for the request.
208211
NSURLSessionDataTask *task = [self.session

AppCenter/AppCenter/MSAppCenter.m

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,7 @@ - (BOOL)configure:(NSString *)appSecret {
194194

195195
// Init the main pipeline.
196196
[self initializeLogManager];
197-
198-
// Enable pipeline as needed.
199-
if (self.isEnabled) {
200-
[self applyPipelineEnabledState:self.isEnabled];
201-
}
202-
197+
[self applyPipelineEnabledState:self.isEnabled];
203198
self.sdkConfigured = YES;
204199

205200
/*
@@ -291,6 +286,13 @@ - (BOOL)startService:(Class)clazz andSendLog:(BOOL)sendLog {
291286

292287
// Start service with log manager.
293288
[service startWithLogManager:self.logManager appSecret:self.appSecret];
289+
290+
// Disable service if AppCenter is disabled.
291+
if ([clazz isEnabled] && !self.isEnabled) {
292+
self.enabledStateUpdating = YES;
293+
[clazz setEnabled:NO];
294+
self.enabledStateUpdating = NO;
295+
}
294296

295297
// Send start service log.
296298
if (sendLog) {

AppCenter/AppCenterTests/MSAppCenterTests.m

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#import "MSAppCenterInternal.h"
88
#import "MSAppCenterPrivate.h"
99
#import "MSLogManagerDefault.h"
10+
#import "MSHttpSenderPrivate.h"
1011
#import "MSMockService.h"
1112
#import "MSMockSecondService.h"
1213
#import "MSMockUserDefaults.h"
@@ -135,16 +136,48 @@ - (void)testInstallIdPersistency {
135136
assertThat([installId1 UUIDString], is([installId2 UUIDString]));
136137
}
137138

139+
- (void)testSetEnabled {
140+
141+
// If
142+
[MSAppCenter start:MS_UUID_STRING withServices:@[MSMockService.class]];
143+
144+
// When
145+
[self.settingsMock setObject:@NO forKey:kMSAppCenterIsEnabledKey];
146+
147+
// Then
148+
XCTAssertFalse([MSAppCenter isEnabled]);
149+
150+
// When
151+
[self.settingsMock setObject:@YES forKey:kMSAppCenterIsEnabledKey];
152+
153+
// Then
154+
XCTAssertTrue([MSAppCenter isEnabled]);
155+
156+
// When
157+
[MSAppCenter setEnabled:NO];
158+
159+
// Then
160+
XCTAssertFalse([MSAppCenter isEnabled]);
161+
XCTAssertFalse([MSMockService isEnabled]);
162+
XCTAssertFalse(((NSNumber *)[self.settingsMock objectForKey:kMSAppCenterIsEnabledKey]).boolValue);
163+
164+
// When
165+
[MSAppCenter setEnabled:YES];
166+
167+
// Then
168+
XCTAssertTrue([MSAppCenter isEnabled]);
169+
XCTAssertTrue([MSMockService isEnabled]);
170+
XCTAssertTrue(((NSNumber *)[self.settingsMock objectForKey:kMSAppCenterIsEnabledKey]).boolValue);
171+
}
172+
138173
- (void)testSetLogUrl {
139-
[MSAppCenter resetSharedInstance];
140174
NSString *fakeUrl = @"http://testUrl:1234";
141175
[MSAppCenter setLogUrl:fakeUrl];
142176
[MSAppCenter start:MS_UUID_STRING withServices:nil];
143177
XCTAssertTrue([[[MSAppCenter sharedInstance] logUrl] isEqualToString:fakeUrl]);
144178
}
145179

146180
- (void)testDefaultLogUrl {
147-
[MSAppCenter resetSharedInstance];
148181
[MSAppCenter start:MS_UUID_STRING withServices:nil];
149182
XCTAssertTrue([[[MSAppCenter sharedInstance] logUrl] isEqualToString:@"https://in.appcenter.ms"]);
150183
}
@@ -293,6 +326,34 @@ - (void)testStartServiceLogIsSentAfterStartService {
293326
OCMVerify([logManager processLog:[OCMArg isKindOfClass:[MSStartServiceLog class]] forGroupId:OCMOCK_ANY]);
294327
}
295328

329+
- (void)testDisabledCoreStatus {
330+
331+
// When
332+
[MSAppCenter start:MS_UUID_STRING withServices:@[MSMockService.class]];
333+
[MSAppCenter setEnabled:NO];
334+
335+
// Then
336+
MSLogManagerDefault *logManager = [MSAppCenter sharedInstance].logManager;
337+
XCTAssertFalse(logManager.enabled);
338+
XCTAssertFalse(logManager.sender.enabled);
339+
XCTAssertFalse([MSMockService isEnabled]);
340+
}
341+
342+
- (void)testDisabledCorePersistedStatus {
343+
344+
// If
345+
[self.settingsMock setObject:@NO forKey:kMSAppCenterIsEnabledKey];
346+
347+
// When
348+
[MSAppCenter start:MS_UUID_STRING withServices:@[MSMockService.class]];
349+
350+
// Then
351+
MSLogManagerDefault *logManager = [MSAppCenter sharedInstance].logManager;
352+
XCTAssertFalse(logManager.enabled);
353+
XCTAssertFalse(logManager.sender.enabled);
354+
XCTAssertFalse([MSMockService isEnabled]);
355+
}
356+
296357
- (void)testStartServiceLogWithDisabledCore {
297358

298359
// If
@@ -315,6 +376,8 @@ - (void)testStartServiceLogWithDisabledCore {
315376

316377
// Then
317378
assertThatInteger(logsProcessed, equalToInteger(0));
379+
XCTAssertFalse([MSMockService isEnabled]);
380+
XCTAssertFalse([MSMockSecondService isEnabled]);
318381
XCTAssertNil(log);
319382

320383
// When

AppCenter/AppCenterTests/MSChannelDefaultTests.m

Lines changed: 23 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ - (void)testNewInstanceWasInitialisedCorrectly {
6969

7070
- (void)testLogsSentWithSuccess {
7171

72-
/*
73-
* If
74-
*/
72+
// If
7573
[self initChannelEndJobExpectation];
7674
id delegateMock = OCMProtocolMock(@protocol(MSChannelDelegate));
7775
__block MSSendAsyncCompletionHandler senderBlock;
@@ -120,26 +118,23 @@ - (void)testLogsSentWithSuccess {
120118
OCMExpect([delegateMock channel:sut didSucceedSendingLog:expectedLog]);
121119
OCMExpect([storageMock deleteLogsWithBatchId:expectedBatchId groupId:kMSTestGroupId]);
122120

123-
/*
124-
* When
125-
*/
121+
// When
126122
[sut enqueueItem:[self getValidMockLog] withCompletion:nil];
127123

128124
// Try to release one batch.
129125
dispatch_async(self.logsDispatchQueue, ^{
130-
senderBlock([@(1) stringValue], 200, nil, nil);
126+
XCTAssertNotNil(senderBlock);
127+
if (senderBlock) {
128+
senderBlock([@(1) stringValue], 200, nil, nil);
129+
}
131130

132-
/*
133-
* Then
134-
*/
131+
// Then
135132
dispatch_async(self.logsDispatchQueue, ^{
136133
[self enqueueChannelEndJobExpectation];
137134
});
138135
});
139136

140-
/*
141-
* Then
142-
*/
137+
// Then
143138
[self waitForExpectationsWithTimeout:1
144139
handler:^(NSError *error) {
145140

@@ -158,9 +153,7 @@ - (void)testLogsSentWithSuccess {
158153

159154
- (void)testLogsSentWithFailure {
160155

161-
/*
162-
* If
163-
*/
156+
// If
164157
[self initChannelEndJobExpectation];
165158
id delegateMock = OCMProtocolMock(@protocol(MSChannelDelegate));
166159
__block MSSendAsyncCompletionHandler senderBlock;
@@ -209,26 +202,23 @@ - (void)testLogsSentWithFailure {
209202
OCMReject([delegateMock channel:sut didSucceedSendingLog:OCMOCK_ANY]);
210203
OCMExpect([storageMock deleteLogsWithBatchId:expectedBatchId groupId:kMSTestGroupId]);
211204

212-
/*
213-
* When
214-
*/
205+
// When
215206
[sut enqueueItem:[self getValidMockLog] withCompletion:nil];
216207

217208
// Try to release one batch.
218209
dispatch_async(self.logsDispatchQueue, ^{
219-
senderBlock([@(1) stringValue], 300, nil, nil);
210+
XCTAssertNotNil(senderBlock);
211+
if (senderBlock) {
212+
senderBlock([@(1) stringValue], 300, nil, nil);
213+
}
220214

221-
/*
222-
* Then
223-
*/
215+
// Then
224216
dispatch_async(self.logsDispatchQueue, ^{
225217
[self enqueueChannelEndJobExpectation];
226218
});
227219
});
228220

229-
/*
230-
* Then
231-
*/
221+
// Then
232222
[self waitForExpectationsWithTimeout:1
233223
handler:^(NSError *error) {
234224

@@ -370,9 +360,7 @@ - (void)testBatchQueueLimit {
370360

371361
- (void)testNextBatchSentIfPendingQueueGotRoomAgain {
372362

373-
/*
374-
* If
375-
*/
363+
// If
376364
[self initChannelEndJobExpectation];
377365
XCTestExpectation *oneLogSentExpectation = [self expectationWithDescription:@"One log sent"];
378366
__block MSSendAsyncCompletionHandler senderBlock;
@@ -415,38 +403,29 @@ - (void)testNextBatchSentIfPendingQueueGotRoomAgain {
415403
configuration:config
416404
logsDispatchQueue:dispatch_get_main_queue()];
417405

418-
/*
419-
* When
420-
*/
406+
// When
421407
[sut enqueueItem:[self getValidMockLog] withCompletion:nil];
422408

423409
// Try to release one batch.
424410
dispatch_async(self.logsDispatchQueue, ^{
425411
senderBlock([@(1) stringValue], 200, nil, nil);
426412

427-
/*
428-
* Then
429-
*/
413+
// Then
430414
dispatch_async(self.logsDispatchQueue, ^{
431415

432416
// Batch queue should not be full;
433417
assertThatBool(sut.pendingBatchQueueFull, isFalse());
434418
[oneLogSentExpectation fulfill];
435419

436-
/*
437-
* When
438-
*/
439-
420+
// When
440421
// Send another batch.
441422
currentBatchId++;
442423
[sut enqueueItem:[self getValidMockLog] withCompletion:nil];
443424
[self enqueueChannelEndJobExpectation];
444425
});
445426
});
446427

447-
/*
448-
* Then
449-
*/
428+
// Then
450429
[self waitForExpectationsWithTimeout:1
451430
handler:^(NSError *error) {
452431

@@ -482,16 +461,12 @@ - (void)testDontForwardLogsToSenderOnDisabled {
482461
storage:storageMock
483462
configuration:config
484463
logsDispatchQueue:dispatch_get_main_queue()];
485-
/*
486-
* When
487-
*/
464+
// When
488465
[sut setEnabled:NO andDeleteDataOnDisabled:NO];
489466
[sut enqueueItem:mockLog withCompletion:nil];
490467
[self enqueueChannelEndJobExpectation];
491468

492-
/*
493-
* Then
494-
*/
469+
// Then
495470
[self waitForExpectationsWithTimeout:1
496471
handler:^(NSError *error) {
497472
OCMVerifyAll(senderMock);

0 commit comments

Comments
 (0)