From 260557691fae8ba34e262f480c632ab63b5133ee Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Wed, 25 Apr 2018 09:45:36 -0400 Subject: Add counter for errors and warnings logged. (#1168) * Moved writes outside of dispatch_async block. --- Example/Core/Tests/FIRLoggerTest.m | 45 +++++++++++++++++++++++++++++++++----- Firebase/Core/FIRLogger.m | 33 ++++++++++++++++++++++++++++ Firebase/Core/Private/FIRLogger.h | 25 +++++++++++++++++++++ 3 files changed, 98 insertions(+), 5 deletions(-) diff --git a/Example/Core/Tests/FIRLoggerTest.m b/Example/Core/Tests/FIRLoggerTest.m index 31a495d..dfc7cc8 100644 --- a/Example/Core/Tests/FIRLoggerTest.m +++ b/Example/Core/Tests/FIRLoggerTest.m @@ -49,6 +49,8 @@ static NSString *const kMessageCode = @"I-COR000001"; @property(nonatomic) NSString *randomLogString; +@property(nonatomic, strong) id userDefaultsMock; + @end @implementation FIRLoggerTest @@ -56,6 +58,15 @@ static NSString *const kMessageCode = @"I-COR000001"; - (void)setUp { [super setUp]; FIRResetLogger(); + + // Stub NSUserDefaults for tracking the error and warning count. + _userDefaultsMock = OCMPartialMock([NSUserDefaults standardUserDefaults]); +} + +- (void)tearDown { + [super tearDown]; + + [_userDefaultsMock stopMocking]; } // Test some stable variables to make sure they weren't accidently changed. @@ -120,9 +131,9 @@ static NSString *const kMessageCode = @"I-COR000001"; - (void)testInitializeASLForDebugModeWithUserDefaults { // Stub. - id userDefaultsMock = [OCMockObject partialMockForObject:[NSUserDefaults standardUserDefaults]]; NSNumber *debugMode = @YES; - [[[userDefaultsMock stub] andReturnValue:debugMode] boolForKey:kFIRPersistedDebugModeKey]; + OCMStub([self.userDefaultsMock boolForKey:kFIRPersistedDebugModeKey]) + .andReturn(debugMode.boolValue); // Test. FIRLogError(kFIRLoggerCore, kMessageCode, @"Some error."); @@ -131,9 +142,6 @@ static NSString *const kMessageCode = @"I-COR000001"; debugMode = [[NSUserDefaults standardUserDefaults] objectForKey:kFIRPersistedDebugModeKey]; XCTAssertTrue(debugMode.boolValue); XCTAssertTrue(getFIRLoggerDebugMode()); - - // Stop. - [userDefaultsMock stopMocking]; } - (void)testMessageCodeFormat { @@ -231,6 +239,33 @@ static NSString *const kMessageCode = @"I-COR000001"; XCTAssertEqual(FIRLoggerLevelDebug, ASL_LEVEL_DEBUG); } +- (void)testErrorNumberIncrement { + OCMStub([self.userDefaultsMock integerForKey:kFIRLoggerErrorCountKey]).andReturn(10); + OCMExpect([self.userDefaultsMock setInteger:11 forKey:kFIRLoggerErrorCountKey]); + FIRLogError(kFIRLoggerCore, kMessageCode, @"Error."); + + // Use a delay since the logging is async. + OCMVerifyAllWithDelay(self.userDefaultsMock, 1); +} + +- (void)testWarningNumberIncrement { + OCMStub([self.userDefaultsMock integerForKey:kFIRLoggerWarningCountKey]).andReturn(1); + OCMExpect([self.userDefaultsMock setInteger:2 forKey:kFIRLoggerWarningCountKey]); + FIRLogWarning(kFIRLoggerCore, kMessageCode, @"Warning."); + + // Use a delay since the logging is async. + OCMVerifyAllWithDelay(self.userDefaultsMock, 1); +} + +- (void)testResetIssuesCount { + OCMExpect([self.userDefaultsMock setInteger:0 forKey:kFIRLoggerErrorCountKey]); + OCMExpect([self.userDefaultsMock setInteger:0 forKey:kFIRLoggerWarningCountKey]); + FIRResetNumberOfIssuesLogged(); + + // Use a delay since the logging is async. + OCMVerifyAllWithDelay(self.userDefaultsMock, 1); +} + // Helper functions. - (BOOL)logExists { [self drainFIRClientQueue]; diff --git a/Firebase/Core/FIRLogger.m b/Firebase/Core/FIRLogger.m index faa0727..d4de2a0 100644 --- a/Firebase/Core/FIRLogger.m +++ b/Firebase/Core/FIRLogger.m @@ -57,6 +57,10 @@ const char *kFIRLoggerASLClientFacilityName = "com.firebase.app.logger"; const char *kFIRLoggerCustomASLMessageFormat = "$((Time)(J.3)) $(Sender)[$(PID)] <$((Level)(str))> $Message"; +/// Keys for the number of errors and warnings logged. +NSString *const kFIRLoggerErrorCountKey = @"/google/firebase/count_of_errors_logged"; +NSString *const kFIRLoggerWarningCountKey = @"/google/firebase/count_of_warnings_logged"; + static dispatch_once_t sFIRLoggerOnceToken; static aslclient sFIRLoggerClient; @@ -192,6 +196,7 @@ BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent) { #ifdef DEBUG void FIRResetLogger() { sFIRLoggerOnceToken = 0; + FIRResetNumberOfIssuesLogged(); [[NSUserDefaults standardUserDefaults] removeObjectForKey:kFIRPersistedDebugModeKey]; } @@ -238,6 +243,17 @@ void FIRLogBasic(FIRLoggerLevel level, dispatch_async(sFIRClientQueue, ^{ asl_log(sFIRLoggerClient, NULL, level, "%s", logMsg.UTF8String); }); + + // Keep count of how many errors and warnings are triggered. + if (level == FIRLoggerLevelError) { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSInteger errorCount = [defaults integerForKey:kFIRLoggerErrorCountKey]; + [defaults setInteger:errorCount + 1 forKey:kFIRLoggerErrorCountKey]; + } else if (level == FIRLoggerLevelWarning) { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSInteger warningCount = [defaults integerForKey:kFIRLoggerWarningCountKey]; + [defaults setInteger:warningCount + 1 forKey:kFIRLoggerWarningCountKey]; + } } #pragma clang diagnostic pop @@ -265,6 +281,23 @@ FIR_LOGGING_FUNCTION(Debug) #undef FIR_MAKE_LOGGER +#pragma mark - Number of errors and warnings + +NSInteger FIRNumberOfErrorsLogged(void) { + return [[NSUserDefaults standardUserDefaults] integerForKey:kFIRLoggerErrorCountKey]; +} + +NSInteger FIRNumberOfWarningsLogged(void) { + return [[NSUserDefaults standardUserDefaults] integerForKey:kFIRLoggerWarningCountKey]; +} + +void FIRResetNumberOfIssuesLogged(void) { + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:kFIRLoggerErrorCountKey]; + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:kFIRLoggerWarningCountKey]; +} + +#pragma mark - FIRLoggerWrapper + @implementation FIRLoggerWrapper + (void)logWithLevel:(FIRLoggerLevel)level diff --git a/Firebase/Core/Private/FIRLogger.h b/Firebase/Core/Private/FIRLogger.h index 358832f..e095e4e 100644 --- a/Firebase/Core/Private/FIRLogger.h +++ b/Firebase/Core/Private/FIRLogger.h @@ -42,6 +42,16 @@ extern FIRLoggerService kFIRLoggerRemoteConfig; extern FIRLoggerService kFIRLoggerStorage; extern FIRLoggerService kFIRLoggerSwizzler; +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -61,6 +71,21 @@ void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); */ void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); +/** + * Retrieve the number of errors that have been logged since the stat was last reset. + */ +NSInteger FIRNumberOfErrorsLogged(void); + +/** + * Retrieve the number of warnings that have been logged since the stat was last reset. + */ +NSInteger FIRNumberOfWarningsLogged(void); + +/** + * Reset number of errors and warnings that have been logged to 0. + */ +void FIRResetNumberOfIssuesLogged(void); + /** * Checks if the specified logger level is loggable given the current settings. * (required) log level (one of the FIRLoggerLevel enum values). -- cgit v1.2.3