Skip to content

Commit 98cad74

Browse files
committed
Revert "GULLogger - issue count synchronous getters (#2610)"
This reverts commit c6da7d6.
1 parent c3b4c4f commit 98cad74

File tree

3 files changed

+93
-95
lines changed

3 files changed

+93
-95
lines changed

GoogleUtilities/Example/Tests/Logger/GULLoggerTest.m

Lines changed: 65 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@
3232

3333
extern BOOL getGULLoggerDebugMode(void);
3434

35-
extern CFStringRef getGULLoggerUsetDefaultsSuiteName(void);
36-
extern dispatch_queue_t getGULLoggerCounterQueue(void);
35+
extern NSUserDefaults *getGULLoggerUsetDefaults(void);
3736

3837
static NSString *const kMessageCode = @"I-COR000001";
3938

4039
@interface GULLoggerTest : XCTestCase
4140

4241
@property(nonatomic) NSString *randomLogString;
43-
@property(nonatomic) NSUserDefaults *loggerDefaults;
42+
43+
@property(nonatomic, strong) NSUserDefaults *defaults;
4444

4545
@end
4646

@@ -50,18 +50,14 @@ - (void)setUp {
5050
[super setUp];
5151
GULResetLogger();
5252

53-
self.loggerDefaults = [[NSUserDefaults alloc]
54-
initWithSuiteName:CFBridgingRelease(getGULLoggerUsetDefaultsSuiteName())];
53+
// Stub NSUserDefaults for cleaner testing.
54+
_defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.google.logger_test"];
5555
}
5656

5757
- (void)tearDown {
58-
// Make sure all async operations have finished before starting a new test.
59-
[self drainQueue:getGULClientQueue()];
60-
[self drainQueue:getGULLoggerCounterQueue()];
61-
62-
self.loggerDefaults = nil;
63-
6458
[super tearDown];
59+
60+
_defaults = nil;
6561
}
6662

6763
- (void)testMessageCodeFormat {
@@ -162,58 +158,93 @@ - (void)testGULLoggerLevelValues {
162158
- (void)testGetErrorWarningNumberBeforeLogDontCrash {
163159
GULResetLogger();
164160

165-
XCTAssertNoThrow(GULNumberOfErrorsLogged());
166-
XCTAssertNoThrow(GULNumberOfWarningsLogged());
161+
XCTestExpectation *getErrorCountExpectation =
162+
[self expectationWithDescription:@"getErrorCountExpectation"];
163+
XCTestExpectation *getWarningsCountExpectation =
164+
[self expectationWithDescription:@"getWarningsCountExpectation"];
165+
166+
GULNumberOfErrorsLogged(^(NSInteger count) {
167+
[getErrorCountExpectation fulfill];
168+
});
169+
170+
GULNumberOfWarningsLogged(^(NSInteger count) {
171+
[getWarningsCountExpectation fulfill];
172+
});
173+
174+
[self waitForExpectations:@[ getErrorCountExpectation, getWarningsCountExpectation ]
175+
timeout:0.5
176+
enforceOrder:YES];
167177
}
168178

169179
- (void)testErrorNumberIncrement {
170-
[self.loggerDefaults setInteger:10 forKey:kGULLoggerErrorCountKey];
180+
[getGULLoggerUsetDefaults() setInteger:10 forKey:kGULLoggerErrorCountKey];
171181

172182
GULLogError(@"my service", NO, kMessageCode, @"Message.");
173183

174-
[self drainQueue:getGULLoggerCounterQueue()];
175-
XCTAssertEqual(GULNumberOfErrorsLogged(), 11);
184+
XCTestExpectation *getErrorCountExpectation =
185+
[self expectationWithDescription:@"getErrorCountExpectation"];
186+
187+
GULNumberOfErrorsLogged(^(NSInteger count) {
188+
[getErrorCountExpectation fulfill];
189+
XCTAssertEqual(count, 11);
190+
});
191+
192+
[self waitForExpectationsWithTimeout:0.5 handler:NULL];
176193
}
177194

178195
- (void)testWarningNumberIncrement {
179-
[self.loggerDefaults setInteger:5 forKey:kGULLoggerWarningCountKey];
196+
[getGULLoggerUsetDefaults() setInteger:5 forKey:kGULLoggerWarningCountKey];
180197

181198
GULLogWarning(@"my service", NO, kMessageCode, @"Message.");
182199

183-
[self drainQueue:getGULLoggerCounterQueue()];
184-
XCTAssertEqual(GULNumberOfWarningsLogged(), 6);
200+
XCTestExpectation *getWarningsCountExpectation =
201+
[self expectationWithDescription:@"getWarningsCountExpectation"];
202+
203+
GULNumberOfWarningsLogged(^(NSInteger count) {
204+
[getWarningsCountExpectation fulfill];
205+
XCTAssertEqual(count, 6);
206+
});
207+
208+
[self waitForExpectationsWithTimeout:0.5 handler:NULL];
185209
}
186210

187211
- (void)testResetIssuesCount {
188-
[self.loggerDefaults setInteger:3 forKey:kGULLoggerErrorCountKey];
189-
[self.loggerDefaults setInteger:4 forKey:kGULLoggerWarningCountKey];
212+
[getGULLoggerUsetDefaults() setInteger:3 forKey:kGULLoggerErrorCountKey];
213+
[getGULLoggerUsetDefaults() setInteger:4 forKey:kGULLoggerWarningCountKey];
190214

191215
GULResetNumberOfIssuesLogged();
192216

193-
XCTAssertEqual(GULNumberOfErrorsLogged(), 0);
194-
XCTAssertEqual(GULNumberOfWarningsLogged(), 0);
195-
}
217+
XCTestExpectation *getErrorCountExpectation =
218+
[self expectationWithDescription:@"getErrorCountExpectation"];
219+
XCTestExpectation *getWarningsCountExpectation =
220+
[self expectationWithDescription:@"getWarningsCountExpectation"];
221+
222+
GULNumberOfErrorsLogged(^(NSInteger count) {
223+
[getErrorCountExpectation fulfill];
224+
XCTAssertEqual(count, 0);
225+
});
226+
227+
GULNumberOfWarningsLogged(^(NSInteger count) {
228+
[getWarningsCountExpectation fulfill];
229+
XCTAssertEqual(count, 0);
230+
});
196231

197-
- (void)testNumberOfIssuesLoggedNoDeadlock {
198-
[self dispatchSyncNestedDispatchCount:100
199-
queue:getGULLoggerCounterQueue()
200-
block:^{
201-
XCTAssertNoThrow(GULNumberOfErrorsLogged());
202-
XCTAssertNoThrow(GULNumberOfWarningsLogged());
203-
}];
232+
[self waitForExpectations:@[ getErrorCountExpectation, getWarningsCountExpectation ]
233+
timeout:0.5
234+
enforceOrder:YES];
204235
}
205236

206237
// Helper functions.
207238
- (BOOL)logExists {
208-
[self drainQueue:getGULClientQueue()];
239+
[self drainGULClientQueue];
209240
NSString *correctMsg =
210241
[NSString stringWithFormat:@"%@[%@] %@", @"my service", kMessageCode, self.randomLogString];
211242
return [self messageWasLogged:correctMsg];
212243
}
213244

214-
- (void)drainQueue:(dispatch_queue_t)queue {
245+
- (void)drainGULClientQueue {
215246
dispatch_semaphore_t workerSemaphore = dispatch_semaphore_create(0);
216-
dispatch_barrier_async(queue, ^{
247+
dispatch_async(getGULClientQueue(), ^{
217248
dispatch_semaphore_signal(workerSemaphore);
218249
});
219250
dispatch_semaphore_wait(workerSemaphore, DISPATCH_TIME_FOREVER);
@@ -241,19 +272,5 @@ - (BOOL)messageWasLogged:(NSString *)message {
241272
#pragma clang pop
242273
}
243274

244-
- (void)dispatchSyncNestedDispatchCount:(NSInteger)count
245-
queue:(dispatch_queue_t)queue
246-
block:(dispatch_block_t)block {
247-
if (count < 0) {
248-
return;
249-
}
250-
251-
dispatch_sync(queue, ^{
252-
[self dispatchSyncNestedDispatchCount:count - 1 queue:queue block:block];
253-
block();
254-
NSLog(@"%@, depth: %ld", NSStringFromSelector(_cmd), (long)count);
255-
});
256-
}
257-
258275
@end
259276
#endif

GoogleUtilities/Logger/GULLogger.m

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -203,79 +203,62 @@ void GULLogBasic(GULLoggerLevel level,
203203

204204
#undef GUL_MAKE_LOGGER
205205

206-
#pragma mark - User defaults
207-
208-
// NSUserDefaults cannot be used due to a bug described in GULUserDefaults
209-
// GULUserDefaults cannot be used because GULLogger is a dependency for GULUserDefaults
210-
// We have to use C API deireclty here
211-
212-
CFStringRef getGULLoggerUsetDefaultsSuiteName(void) {
213-
return (__bridge CFStringRef) @"GoogleUtilities.Logger.GULLogger";
214-
}
215-
216-
NSInteger GULGetUserDefaultsIntegerForKey(NSString *key) {
217-
id value = (__bridge_transfer id)CFPreferencesCopyAppValue((__bridge CFStringRef)key,
218-
getGULLoggerUsetDefaultsSuiteName());
219-
if (![value isKindOfClass:[NSNumber class]]) {
220-
return 0;
221-
}
206+
#pragma mark - Number of errors and warnings
222207

223-
return [(NSNumber *)value integerValue];
224-
}
208+
NSUserDefaults *getGULLoggerUsetDefaults(void) {
209+
static NSUserDefaults *_userDefaults = nil;
210+
static dispatch_once_t onceToken;
211+
dispatch_once(&onceToken, ^{
212+
_userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"GoogleUtilities.Logger.GULLogger"];
213+
});
225214

226-
void GULLoggerUserDefaultsSetIntegerForKey(NSInteger count, NSString *key) {
227-
NSNumber *countNumber = @(count);
228-
CFPreferencesSetAppValue((__bridge CFStringRef)key, (__bridge CFNumberRef)countNumber,
229-
getGULLoggerUsetDefaultsSuiteName());
230-
CFPreferencesAppSynchronize(getGULLoggerUsetDefaultsSuiteName());
215+
return _userDefaults;
231216
}
232217

233-
#pragma mark - Number of errors and warnings
234-
235218
dispatch_queue_t getGULLoggerCounterQueue(void) {
236219
static dispatch_queue_t queue;
237220
static dispatch_once_t onceToken;
238221
dispatch_once(&onceToken, ^{
239-
queue =
240-
dispatch_queue_create("GoogleUtilities.GULLogger.counterQueue", DISPATCH_QUEUE_CONCURRENT);
222+
queue = dispatch_queue_create("GoogleUtilities.GULLogger.counterQueue", DISPATCH_QUEUE_SERIAL);
241223
dispatch_set_target_queue(queue,
242224
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0));
243225
});
244226

245227
return queue;
246228
}
247229

248-
NSInteger GULSyncGetUserDefaultsIntegerForKey(NSString *key) {
249-
__block NSInteger integerValue = 0;
250-
dispatch_sync(getGULLoggerCounterQueue(), ^{
251-
integerValue = GULGetUserDefaultsIntegerForKey(key);
230+
void GULAsyncGetUserDefaultsIntegerForKey(NSString *key, void (^completion)(NSInteger)) {
231+
dispatch_async(getGULLoggerCounterQueue(), ^{
232+
NSInteger count = [getGULLoggerUsetDefaults() integerForKey:key];
233+
dispatch_async(dispatch_get_main_queue(), ^{
234+
completion(count);
235+
});
252236
});
253-
254-
return integerValue;
255237
}
256238

257-
NSInteger GULNumberOfErrorsLogged(void) {
258-
return GULSyncGetUserDefaultsIntegerForKey(kGULLoggerErrorCountKey);
239+
void GULNumberOfErrorsLogged(void (^completion)(NSInteger)) {
240+
GULAsyncGetUserDefaultsIntegerForKey(kGULLoggerErrorCountKey, completion);
259241
}
260242

261-
NSInteger GULNumberOfWarningsLogged(void) {
262-
return GULSyncGetUserDefaultsIntegerForKey(kGULLoggerWarningCountKey);
243+
void GULNumberOfWarningsLogged(void (^completion)(NSInteger)) {
244+
GULAsyncGetUserDefaultsIntegerForKey(kGULLoggerWarningCountKey, completion);
263245
}
264246

265247
void GULResetNumberOfIssuesLogged(void) {
266-
dispatch_barrier_async(getGULLoggerCounterQueue(), ^{
267-
GULLoggerUserDefaultsSetIntegerForKey(0, kGULLoggerErrorCountKey);
268-
GULLoggerUserDefaultsSetIntegerForKey(0, kGULLoggerWarningCountKey);
248+
dispatch_async(getGULLoggerCounterQueue(), ^{
249+
[getGULLoggerUsetDefaults() setInteger:0 forKey:kGULLoggerErrorCountKey];
250+
[getGULLoggerUsetDefaults() setInteger:0 forKey:kGULLoggerWarningCountKey];
269251
});
270252
}
271253

272254
void GULIncrementUserDefaultsIntegerForKey(NSString *key) {
273-
NSInteger value = GULGetUserDefaultsIntegerForKey(key);
274-
GULLoggerUserDefaultsSetIntegerForKey(value + 1, key);
255+
NSUserDefaults *defaults = getGULLoggerUsetDefaults();
256+
NSInteger errorCount = [defaults integerForKey:key];
257+
[defaults setInteger:errorCount + 1 forKey:key];
275258
}
276259

277260
void GULIncrementLogCountForLevel(GULLoggerLevel level) {
278-
dispatch_barrier_async(getGULLoggerCounterQueue(), ^{
261+
dispatch_async(getGULLoggerCounterQueue(), ^{
279262
if (level == GULLoggerLevelError) {
280263
GULIncrementUserDefaultsIntegerForKey(kGULLoggerErrorCountKey);
281264
} else if (level == GULLoggerLevelWarning) {

GoogleUtilities/Logger/Private/GULLogger.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,13 @@ extern void GULLogDebug(GULLoggerService service,
141141

142142
/**
143143
* Retrieve the number of errors that have been logged since the stat was last reset.
144-
* Calling this method can be comparably expensive, so it should not be called from main thread.
145144
*/
146-
extern NSInteger GULNumberOfErrorsLogged(void);
145+
extern void GULNumberOfErrorsLogged(void (^completion)(NSInteger));
147146

148147
/**
149148
* Retrieve the number of warnings that have been logged since the stat was last reset.
150-
* Calling this method can be comparably expensive, so it should not be called from main thread.
151149
*/
152-
extern NSInteger GULNumberOfWarningsLogged(void);
150+
extern void GULNumberOfWarningsLogged(void (^completion)(NSInteger));
153151

154152
/**
155153
* Reset number of errors and warnings that have been logged to 0.

0 commit comments

Comments
 (0)