GULASLLoggerTest.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright 2019 Google
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #import <GoogleUtilities/GULLogger.h>
  15. #import "GULASLLogger.h"
  16. #import <asl.h>
  17. #import <XCTest/XCTest.h>
  18. NS_ASSUME_NONNULL_BEGIN
  19. // TODO(bstpierre): Use a C function redirect to mock asl_* methods like GULOSLoggerTest.
  20. static NSString *const kService = @"my service";
  21. static NSString *const kCode = @"I-COR000001";
  22. // Redefine class property as readwrite for testing.
  23. @interface GULLogger (ForTesting)
  24. @property(nonatomic, nullable, class, readwrite) id<GULLoggerSystem> logger;
  25. @end
  26. // Surface aslclient and dispatchQueues for tests.
  27. @interface GULASLLogger (ForTesting)
  28. @property(nonatomic) aslclient aslClient;
  29. @property(nonatomic) dispatch_queue_t dispatchQueue;
  30. @end
  31. #pragma mark -
  32. @interface GULASLLoggerTest : XCTestCase
  33. @property(nonatomic, nullable) GULASLLogger *logger;
  34. @end
  35. @implementation GULASLLoggerTest
  36. #pragma mark Helper Methods
  37. // TODO(bstpierre): Replace this with a XCTestExpectation like GULOSLoggerTest.
  38. - (BOOL)messageWasLogged:(NSString *)message {
  39. // Format the message as it's expected.
  40. message = [NSString stringWithFormat:@"%@[%@] %@", kService, kCode, message];
  41. #pragma clang diagnostic push
  42. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  43. aslmsg query = asl_new(ASL_TYPE_QUERY);
  44. asl_set_query(query, ASL_KEY_FACILITY, "com.google.utilities.logger", ASL_QUERY_OP_EQUAL);
  45. aslresponse response = asl_search(self.logger.aslClient, query);
  46. asl_release(query);
  47. aslmsg msg;
  48. const char *responseMsg;
  49. BOOL messageFound = NO;
  50. while ((msg = asl_next(response)) != NULL) {
  51. responseMsg = asl_get(msg, ASL_KEY_MSG);
  52. if ([message isEqualToString:[NSString stringWithUTF8String:responseMsg]]) {
  53. messageFound = YES;
  54. break;
  55. }
  56. }
  57. asl_release(msg);
  58. asl_release(response);
  59. #pragma clang pop
  60. return messageFound;
  61. }
  62. #pragma mark Testing
  63. - (void)setUp {
  64. [super setUp];
  65. self.logger = [[GULASLLogger alloc] init];
  66. GULLogger.logger = self.logger;
  67. }
  68. - (void)tearDown {
  69. GULLogger.logger = nil;
  70. self.logger = nil;
  71. [super tearDown];
  72. }
  73. - (void)testMessageCodeFormat {
  74. // Valid case.
  75. XCTAssertNoThrow(GULLogError(kService, NO, @"I-APP000001", @"Message."));
  76. // An extra dash or missing dash should fail.
  77. XCTAssertThrows(GULLogError(kService, NO, @"I-APP-000001", @"Message."));
  78. XCTAssertThrows(GULLogError(kService, NO, @"IAPP000001", @"Message."));
  79. // Wrong number of digits should fail.
  80. XCTAssertThrows(GULLogError(kService, NO, @"I-APP00001", @"Message."));
  81. XCTAssertThrows(GULLogError(kService, NO, @"I-APP0000001", @"Message."));
  82. // Lowercase should fail.
  83. XCTAssertThrows(GULLogError(kService, NO, @"I-app000001", @"Message."));
  84. // nil or empty message code should fail.
  85. #pragma clang diagnostic push
  86. #pragma clang diagnostic ignored "-Wnonnull"
  87. XCTAssertThrows(GULLogError(kService, NO, nil, @"Message."));
  88. #pragma clang diagnostic pop
  89. XCTAssertThrows(GULLogError(kService, NO, @"", @"Message."));
  90. // Android message code should fail.
  91. XCTAssertThrows(GULLogError(kService, NO, @"A-APP000001", @"Message."));
  92. }
  93. - (void)testLoggerInterface {
  94. XCTAssertNoThrow(GULLogError(kService, NO, kCode, @"Message."));
  95. XCTAssertNoThrow(GULLogError(kService, NO, kCode, @"Configure %@.", @"blah"));
  96. XCTAssertNoThrow(GULLogWarning(kService, NO, kCode, @"Message."));
  97. XCTAssertNoThrow(GULLogWarning(kService, NO, kCode, @"Configure %@.", @"blah"));
  98. XCTAssertNoThrow(GULLogNotice(kService, NO, kCode, @"Message."));
  99. XCTAssertNoThrow(GULLogNotice(kService, NO, kCode, @"Configure %@.", @"blah"));
  100. XCTAssertNoThrow(GULLogInfo(kService, NO, kCode, @"Message."));
  101. XCTAssertNoThrow(GULLogInfo(kService, NO, kCode, @"Configure %@.", @"blah"));
  102. XCTAssertNoThrow(GULLogDebug(kService, NO, kCode, @"Message."));
  103. XCTAssertNoThrow(GULLogDebug(kService, NO, kCode, @"Configure %@.", @"blah"));
  104. }
  105. // The GULLoggerLevel enum must match the ASL_LEVEL_* constants, but we manually redefine
  106. // them in GULLoggerLevel.h since we cannot include <asl.h> (see b/34976089 for more details).
  107. // This test ensures the constants match.
  108. - (void)testGULLoggerLevelValues {
  109. XCTAssertEqual(GULLoggerLevelError, ASL_LEVEL_ERR);
  110. XCTAssertEqual(GULLoggerLevelWarning, ASL_LEVEL_WARNING);
  111. XCTAssertEqual(GULLoggerLevelNotice, ASL_LEVEL_NOTICE);
  112. XCTAssertEqual(GULLoggerLevelInfo, ASL_LEVEL_INFO);
  113. XCTAssertEqual(GULLoggerLevelDebug, ASL_LEVEL_DEBUG);
  114. }
  115. // TODO(bstpierre): Add tests for logWithLevel:withService:isForced:withCode:withMessage:
  116. @end
  117. NS_ASSUME_NONNULL_END