diff --git a/GoogleUtilities/Example/Tests/Logger/GULLoggerTest.m b/GoogleUtilities/Example/Tests/Logger/GULLoggerTest.m index 62abd5aa9e1..9483bbcb5f9 100644 --- a/GoogleUtilities/Example/Tests/Logger/GULLoggerTest.m +++ b/GoogleUtilities/Example/Tests/Logger/GULLoggerTest.m @@ -32,15 +32,13 @@ extern BOOL getGULLoggerDebugMode(void); -extern CFStringRef getGULLoggerUserDefaultsSuiteName(void); -extern dispatch_queue_t getGULLoggerCounterQueue(void); - static NSString *const kMessageCode = @"I-COR000001"; @interface GULLoggerTest : XCTestCase @property(nonatomic) NSString *randomLogString; -@property(nonatomic) NSUserDefaults *loggerDefaults; + +@property(nonatomic, strong) NSUserDefaults *defaults; @end @@ -50,18 +48,14 @@ - (void)setUp { [super setUp]; GULResetLogger(); - self.loggerDefaults = [[NSUserDefaults alloc] - initWithSuiteName:CFBridgingRelease(getGULLoggerUserDefaultsSuiteName())]; + // Stub NSUserDefaults for cleaner testing. + _defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.google.logger_test"]; } - (void)tearDown { - // Make sure all async operations have finished before starting a new test. - [self drainQueue:getGULClientQueue()]; - [self drainQueue:getGULLoggerCounterQueue()]; - - self.loggerDefaults = nil; - [super tearDown]; + + _defaults = nil; } - (void)testMessageCodeFormat { @@ -159,61 +153,17 @@ - (void)testGULLoggerLevelValues { XCTAssertEqual(GULLoggerLevelDebug, ASL_LEVEL_DEBUG); } -- (void)testGetErrorWarningNumberBeforeLogDontCrash { - GULResetLogger(); - - XCTAssertNoThrow(GULNumberOfErrorsLogged()); - XCTAssertNoThrow(GULNumberOfWarningsLogged()); -} - -- (void)testErrorNumberIncrement { - [self.loggerDefaults setInteger:10 forKey:kGULLoggerErrorCountKey]; - - GULLogError(@"my service", NO, kMessageCode, @"Message."); - - [self drainQueue:getGULLoggerCounterQueue()]; - XCTAssertEqual(GULNumberOfErrorsLogged(), 11); -} - -- (void)testWarningNumberIncrement { - [self.loggerDefaults setInteger:5 forKey:kGULLoggerWarningCountKey]; - - GULLogWarning(@"my service", NO, kMessageCode, @"Message."); - - [self drainQueue:getGULLoggerCounterQueue()]; - XCTAssertEqual(GULNumberOfWarningsLogged(), 6); -} - -- (void)testResetIssuesCount { - [self.loggerDefaults setInteger:3 forKey:kGULLoggerErrorCountKey]; - [self.loggerDefaults setInteger:4 forKey:kGULLoggerWarningCountKey]; - - GULResetNumberOfIssuesLogged(); - - XCTAssertEqual(GULNumberOfErrorsLogged(), 0); - XCTAssertEqual(GULNumberOfWarningsLogged(), 0); -} - -- (void)testNumberOfIssuesLoggedNoDeadlock { - [self dispatchSyncNestedDispatchCount:100 - queue:getGULLoggerCounterQueue() - block:^{ - XCTAssertNoThrow(GULNumberOfErrorsLogged()); - XCTAssertNoThrow(GULNumberOfWarningsLogged()); - }]; -} - // Helper functions. - (BOOL)logExists { - [self drainQueue:getGULClientQueue()]; + [self drainGULClientQueue]; NSString *correctMsg = [NSString stringWithFormat:@"%@[%@] %@", @"my service", kMessageCode, self.randomLogString]; return [self messageWasLogged:correctMsg]; } -- (void)drainQueue:(dispatch_queue_t)queue { +- (void)drainGULClientQueue { dispatch_semaphore_t workerSemaphore = dispatch_semaphore_create(0); - dispatch_barrier_async(queue, ^{ + dispatch_async(getGULClientQueue(), ^{ dispatch_semaphore_signal(workerSemaphore); }); dispatch_semaphore_wait(workerSemaphore, DISPATCH_TIME_FOREVER); @@ -241,19 +191,5 @@ - (BOOL)messageWasLogged:(NSString *)message { #pragma clang pop } -- (void)dispatchSyncNestedDispatchCount:(NSInteger)count - queue:(dispatch_queue_t)queue - block:(dispatch_block_t)block { - if (count < 0) { - return; - } - - dispatch_sync(queue, ^{ - [self dispatchSyncNestedDispatchCount:count - 1 queue:queue block:block]; - block(); - NSLog(@"%@, depth: %ld", NSStringFromSelector(_cmd), (long)count); - }); -} - @end #endif diff --git a/GoogleUtilities/Logger/GULLogger.m b/GoogleUtilities/Logger/GULLogger.m index d92ec673372..495e5830bb0 100644 --- a/GoogleUtilities/Logger/GULLogger.m +++ b/GoogleUtilities/Logger/GULLogger.m @@ -19,9 +19,6 @@ #import #import "Public/GULLoggerLevel.h" -NSString *const kGULLoggerErrorCountKey = @"kGULLoggerErrorCountKey"; -NSString *const kGULLoggerWarningCountKey = @"kGULLoggerWarningCountKey"; - /// ASL client facility name used by GULLogger. const char *kGULLoggerASLClientFacilityName = "com.google.utilities.logger"; @@ -46,8 +43,6 @@ static NSRegularExpression *sMessageCodeRegex; #endif -void GULIncrementLogCountForLevel(GULLoggerLevel level); - void GULLoggerInitializeASL(void) { dispatch_once(&sGULLoggerOnceToken, ^{ NSInteger majorOSVersion = [[GULAppEnvironmentUtil systemVersion] integerValue]; @@ -154,10 +149,6 @@ void GULLogBasic(GULLoggerLevel level, NSString *message, va_list args_ptr) { GULLoggerInitializeASL(); - - // Keep count of how many errors and warnings are triggered. - GULIncrementLogCountForLevel(level); - if (!(level <= sGULLoggerMaximumLevel || sGULLoggerDebugMode || forceLog)) { return; } @@ -203,85 +194,6 @@ void GULLogBasic(GULLoggerLevel level, #undef GUL_MAKE_LOGGER -#pragma mark - User defaults - -// NSUserDefaults cannot be used due to a bug described in GULUserDefaults -// GULUserDefaults cannot be used because GULLogger is a dependency for GULUserDefaults -// We have to use C API direclty here - -CFStringRef getGULLoggerUserDefaultsSuiteName(void) { - return (__bridge CFStringRef) @"GoogleUtilities.Logger.GULLogger"; -} - -NSInteger GULGetUserDefaultsIntegerForKey(NSString *key) { - id value = (__bridge_transfer id)CFPreferencesCopyAppValue((__bridge CFStringRef)key, - getGULLoggerUserDefaultsSuiteName()); - if (![value isKindOfClass:[NSNumber class]]) { - return 0; - } - - return [(NSNumber *)value integerValue]; -} - -void GULLoggerUserDefaultsSetIntegerForKey(NSInteger count, NSString *key) { - NSNumber *countNumber = @(count); - CFPreferencesSetAppValue((__bridge CFStringRef)key, (__bridge CFNumberRef)countNumber, - getGULLoggerUserDefaultsSuiteName()); - CFPreferencesAppSynchronize(getGULLoggerUserDefaultsSuiteName()); -} - -#pragma mark - Number of errors and warnings - -dispatch_queue_t getGULLoggerCounterQueue(void) { - static dispatch_queue_t queue; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - queue = - dispatch_queue_create("GoogleUtilities.GULLogger.counterQueue", DISPATCH_QUEUE_CONCURRENT); - }); - - return queue; -} - -NSInteger GULSyncGetUserDefaultsIntegerForKey(NSString *key) { - __block NSInteger integerValue = 0; - dispatch_sync(getGULLoggerCounterQueue(), ^{ - integerValue = GULGetUserDefaultsIntegerForKey(key); - }); - - return integerValue; -} - -NSInteger GULNumberOfErrorsLogged(void) { - return GULSyncGetUserDefaultsIntegerForKey(kGULLoggerErrorCountKey); -} - -NSInteger GULNumberOfWarningsLogged(void) { - return GULSyncGetUserDefaultsIntegerForKey(kGULLoggerWarningCountKey); -} - -void GULResetNumberOfIssuesLogged(void) { - dispatch_barrier_async(getGULLoggerCounterQueue(), ^{ - GULLoggerUserDefaultsSetIntegerForKey(0, kGULLoggerErrorCountKey); - GULLoggerUserDefaultsSetIntegerForKey(0, kGULLoggerWarningCountKey); - }); -} - -void GULIncrementUserDefaultsIntegerForKey(NSString *key) { - NSInteger value = GULGetUserDefaultsIntegerForKey(key); - GULLoggerUserDefaultsSetIntegerForKey(value + 1, key); -} - -void GULIncrementLogCountForLevel(GULLoggerLevel level) { - dispatch_barrier_async(getGULLoggerCounterQueue(), ^{ - if (level == GULLoggerLevelError) { - GULIncrementUserDefaultsIntegerForKey(kGULLoggerErrorCountKey); - } else if (level == GULLoggerLevelWarning) { - GULIncrementUserDefaultsIntegerForKey(kGULLoggerWarningCountKey); - } - }); -} - #pragma mark - GULLoggerWrapper @implementation GULLoggerWrapper diff --git a/GoogleUtilities/Logger/Private/GULLogger.h b/GoogleUtilities/Logger/Private/GULLogger.h index 167f24c4caa..ff425768681 100644 --- a/GoogleUtilities/Logger/Private/GULLogger.h +++ b/GoogleUtilities/Logger/Private/GULLogger.h @@ -25,16 +25,6 @@ NS_ASSUME_NONNULL_BEGIN */ typedef NSString *const GULLoggerService; -/** - * The key used to store the logger's error count. - */ -extern NSString *const kGULLoggerErrorCountKey; - -/** - * The key used to store the logger's warning count. - */ -extern NSString *const kGULLoggerWarningCountKey; - #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -139,23 +129,6 @@ extern void GULLogDebug(GULLoggerService service, NSString *message, ...) NS_FORMAT_FUNCTION(4, 5); -/** - * Retrieve the number of errors that have been logged since the stat was last reset. - * Calling this method can be comparably expensive, so it should not be called from main thread. - */ -extern NSInteger GULNumberOfErrorsLogged(void); - -/** - * Retrieve the number of warnings that have been logged since the stat was last reset. - * Calling this method can be comparably expensive, so it should not be called from main thread. - */ -extern NSInteger GULNumberOfWarningsLogged(void); - -/** - * Reset number of errors and warnings that have been logged to 0. - */ -extern void GULResetNumberOfIssuesLogged(void); - #ifdef __cplusplus } // extern "C" #endif // __cplusplus