Skip to content

Commit 45e7209

Browse files
committed
GULLogger Testing
* Moved over old tests to correct ASLLogger location. * Added new GULLogger tests * Changed version `char *` to `NSString *` * Tidied up some documentation
1 parent 5326872 commit 45e7209

File tree

6 files changed

+203
-180
lines changed

6 files changed

+203
-180
lines changed

GoogleUtilities/Example/Tests/Logger/GULASLLoggerTest.m

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,127 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#import <OCMock/OCMock.h>
1615
#import <XCTest/XCTest.h>
1716

17+
#import <GoogleUtilities/GULASLLogger.h>
1818
#import <GoogleUtilities/GULLogger.h>
1919

2020
#import <asl.h>
2121

22+
static NSString *const kService = @"my service";
23+
static NSString *const kCode = @"I-COR000001";
24+
25+
// Redefine class property as readwrite for testing.
26+
@interface GULLogger (ForTesting)
27+
@property(nonatomic, class, readwrite) id<GULLoggerSystem> logger;
28+
@end
29+
30+
// Surface aslclient and dispatchQueues for tests.
31+
@interface GULASLLogger (ForTesting)
32+
@property(nonatomic) aslclient aslClient;
33+
@property(nonatomic) dispatch_queue_t dispatchQueue;
34+
@end
35+
36+
#pragma mark -
37+
2238
@interface GULASLLoggerTest : XCTestCase
39+
@property(nonatomic) GULASLLogger *logger;
2340
@end
2441

2542
@implementation GULASLLoggerTest
2643

44+
#pragma mark Helper Methods
45+
46+
- (BOOL)messageWasLogged:(NSString *)message {
47+
// Format the message as it's expected.
48+
message = [NSString stringWithFormat:@"%@[%@] %@", kService, kCode, message];
49+
#pragma clang diagnostic push
50+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
51+
aslmsg query = asl_new(ASL_TYPE_QUERY);
52+
asl_set_query(query, ASL_KEY_FACILITY, "com.google.utilities.logger", ASL_QUERY_OP_EQUAL);
53+
aslresponse response = asl_search(self.logger.aslClient, query);
54+
asl_release(query);
55+
aslmsg msg;
56+
const char *responseMsg;
57+
BOOL messageFound = NO;
58+
while ((msg = asl_next(response)) != NULL) {
59+
responseMsg = asl_get(msg, ASL_KEY_MSG);
60+
if ([message isEqualToString:[NSString stringWithUTF8String:responseMsg]]) {
61+
messageFound = YES;
62+
break;
63+
}
64+
}
65+
asl_release(msg);
66+
asl_release(response);
67+
#pragma clang pop
68+
return messageFound;
69+
}
70+
71+
#pragma mark Testing
72+
2773
- (void)setUp {
28-
// Clear out any logger state as though the app just launched.
74+
self.logger = [[GULASLLogger alloc] init];
75+
GULLogger.logger = self.logger;
2976
}
3077

31-
// TODO(bstpierre): Write Tests
78+
- (void)tearDown {
79+
self.logger = nil;
80+
GULLogger.logger = nil;
81+
}
82+
83+
- (void)testMessageCodeFormat {
84+
// Valid case.
85+
XCTAssertNoThrow(GULLogError(kService, NO, @"I-APP000001", @"Message."));
86+
87+
// An extra dash or missing dash should fail.
88+
XCTAssertThrows(GULLogError(kService, NO, @"I-APP-000001", @"Message."));
89+
XCTAssertThrows(GULLogError(kService, NO, @"IAPP000001", @"Message."));
90+
91+
// Wrong number of digits should fail.
92+
XCTAssertThrows(GULLogError(kService, NO, @"I-APP00001", @"Message."));
93+
XCTAssertThrows(GULLogError(kService, NO, @"I-APP0000001", @"Message."));
94+
95+
// Lowercase should fail.
96+
XCTAssertThrows(GULLogError(kService, NO, @"I-app000001", @"Message."));
97+
98+
// nil or empty message code should fail.
99+
#pragma clang diagnostic push
100+
#pragma clang diagnostic ignored "-Wnonnull"
101+
XCTAssertThrows(GULLogError(kService, NO, nil, @"Message."));
102+
#pragma clang diagnostic pop
103+
104+
XCTAssertThrows(GULLogError(kService, NO, @"", @"Message."));
105+
106+
// Android message code should fail.
107+
XCTAssertThrows(GULLogError(kService, NO, @"A-APP000001", @"Message."));
108+
}
109+
110+
- (void)testLoggerInterface {
111+
XCTAssertNoThrow(GULLogError(kService, NO, kCode, @"Message."));
112+
XCTAssertNoThrow(GULLogError(kService, NO, kCode, @"Configure %@.", @"blah"));
113+
114+
XCTAssertNoThrow(GULLogWarning(kService, NO, kCode, @"Message."));
115+
XCTAssertNoThrow(GULLogWarning(kService, NO, kCode, @"Configure %@.", @"blah"));
116+
117+
XCTAssertNoThrow(GULLogNotice(kService, NO, kCode, @"Message."));
118+
XCTAssertNoThrow(GULLogNotice(kService, NO, kCode, @"Configure %@.", @"blah"));
119+
120+
XCTAssertNoThrow(GULLogInfo(kService, NO, kCode, @"Message."));
121+
XCTAssertNoThrow(GULLogInfo(kService, NO, kCode, @"Configure %@.", @"blah"));
122+
123+
XCTAssertNoThrow(GULLogDebug(kService, NO, kCode, @"Message."));
124+
XCTAssertNoThrow(GULLogDebug(kService, NO, kCode, @"Configure %@.", @"blah"));
125+
}
126+
127+
// The GULLoggerLevel enum must match the ASL_LEVEL_* constants, but we manually redefine
128+
// them in GULLoggerLevel.h since we cannot include <asl.h> (see b/34976089 for more details).
129+
// This test ensures the constants match.
130+
- (void)testGULLoggerLevelValues {
131+
XCTAssertEqual(GULLoggerLevelError, ASL_LEVEL_ERR);
132+
XCTAssertEqual(GULLoggerLevelWarning, ASL_LEVEL_WARNING);
133+
XCTAssertEqual(GULLoggerLevelNotice, ASL_LEVEL_NOTICE);
134+
XCTAssertEqual(GULLoggerLevelInfo, ASL_LEVEL_INFO);
135+
XCTAssertEqual(GULLoggerLevelDebug, ASL_LEVEL_DEBUG);
136+
}
32137

33138
@end

GoogleUtilities/Example/Tests/Logger/GULLoggerTest.m

Lines changed: 54 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -12,193 +12,89 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#ifdef DEBUG
16-
// The tests depend upon library methods only built with #ifdef DEBUG
17-
1815
#import <OCMock/OCMock.h>
1916
#import <XCTest/XCTest.h>
2017

2118
#import <GoogleUtilities/GULLogger.h>
2219

23-
@interface GULLoggerTest : XCTestCase
24-
@end
25-
26-
@implementation GULLoggerTest
27-
28-
- (void)setUp {
29-
// Clear out any logger state as though the app just launched.
30-
}
31-
32-
// TODO(bstpierre): Write Tests
33-
20+
static GULLoggerLevel kLogLevel = GULLoggerLevelError;
21+
static NSString *const kService = @"Test Service";
22+
static NSString *const kCode = @"I-COR000001";
23+
static NSString *const kLogMessage = @"Log Message";
24+
static NSString *const kVersionString = @"2";
25+
static char *const kVersionChar = "2";
26+
static const BOOL kForced = NO;
27+
28+
// Redefine class property as readwrite for testing.
29+
@interface GULLogger (ForTesting)
30+
@property(nonatomic, class, readwrite) id<GULLoggerSystem> logger;
3431
@end
3532

36-
#pragma mark - Old Tests
37-
38-
// TODO(bstpierre): Move all following tests to GULLASLLoggerTest
39-
/**
40-
41-
#import <asl.h>
42-
43-
extern const char *kGULLoggerASLClientFacilityName;
44-
45-
extern void GULResetLogger(void);
46-
47-
extern aslclient getGULLoggerClient(void);
48-
49-
extern dispatch_queue_t getGULClientQueue(void);
50-
51-
extern BOOL getGULLoggerDebugMode(void);
52-
53-
static NSString *const kMessageCode = @"I-COR000001";
54-
55-
@interface GULOldLoggerTest : XCTestCase
56-
57-
@property(nonatomic) NSString *randomLogString;
58-
59-
@property(nonatomic, strong) NSUserDefaults *defaults;
33+
#pragma mark -
6034

35+
@interface GULLoggerTest : XCTestCase
36+
@property(nonatomic) id loggerSystemMock;
6137
@end
6238

63-
@implementation GULOldLoggerTest
39+
@implementation GULLoggerTest
6440

6541
- (void)setUp {
66-
[super setUp];
67-
GULResetLogger();
68-
69-
// Stub NSUserDefaults for cleaner testing.
70-
_defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.google.logger_test"];
42+
self.loggerSystemMock = OCMProtocolMock(@protocol(GULLoggerSystem));
43+
GULLogger.logger = self.loggerSystemMock;
7144
}
7245

7346
- (void)tearDown {
74-
[super tearDown];
75-
76-
_defaults = nil;
47+
GULLogger.logger = nil;
7748
}
7849

79-
- (void)testMessageCodeFormat {
80-
// Valid case.
81-
XCTAssertNoThrow(GULLogError(@"my service", NO, @"I-APP000001", @"Message."));
82-
83-
// An extra dash or missing dash should fail.
84-
XCTAssertThrows(GULLogError(@"my service", NO, @"I-APP-000001", @"Message."));
85-
XCTAssertThrows(GULLogError(@"my service", NO, @"IAPP000001", @"Message."));
86-
87-
// Wrong number of digits should fail.
88-
XCTAssertThrows(GULLogError(@"my service", NO, @"I-APP00001", @"Message."));
89-
XCTAssertThrows(GULLogError(@"my service", NO, @"I-APP0000001", @"Message."));
50+
#pragma mark Initialization Tests
9051

91-
// Lowercase should fail.
92-
XCTAssertThrows(GULLogError(@"my service", NO, @"I-app000001", @"Message."));
93-
94-
// nil or empty message code should fail.
95-
#pragma clang diagnostic push
96-
#pragma clang diagnostic ignored "-Wnonnull"
97-
XCTAssertThrows(GULLogError(@"my service", NO, nil, @"Message."));
98-
#pragma clang diagnostic pop
99-
100-
XCTAssertThrows(GULLogError(@"my service", NO, @"", @"Message."));
101-
102-
// Android message code should fail.
103-
XCTAssertThrows(GULLogError(@"my service", NO, @"A-APP000001", @"Message."));
52+
- (void)testInitializeEmpty {
53+
[[self.loggerSystemMock expect] initializeLogger];
54+
GULLoggerInitialize();
55+
[self.loggerSystemMock verify];
10456
}
10557

106-
- (void)testLoggerInterface {
107-
XCTAssertNoThrow(GULLogError(@"my service", NO, kMessageCode, @"Message."));
108-
XCTAssertNoThrow(GULLogError(@"my service", NO, kMessageCode, @"Configure %@.", @"blah"));
109-
110-
XCTAssertNoThrow(GULLogWarning(@"my service", NO, kMessageCode, @"Message."));
111-
XCTAssertNoThrow(GULLogWarning(@"my service", NO, kMessageCode, @"Configure %@.", @"blah"));
112-
113-
XCTAssertNoThrow(GULLogNotice(@"my service", NO, kMessageCode, @"Message."));
114-
XCTAssertNoThrow(GULLogNotice(@"my service", NO, kMessageCode, @"Configure %@.", @"blah"));
58+
- (void)testInitializeTwice {
59+
[[self.loggerSystemMock expect] initializeLogger];
60+
GULLoggerInitialize();
61+
GULLoggerInitialize();
62+
[self.loggerSystemMock verify];
63+
}
11564

116-
XCTAssertNoThrow(GULLogInfo(@"my service", NO, kMessageCode, @"Message."));
117-
XCTAssertNoThrow(GULLogInfo(@"my service", NO, kMessageCode, @"Configure %@.", @"blah"));
65+
#pragma mark Forwarded Call Tests
11866

119-
XCTAssertNoThrow(GULLogDebug(@"my service", NO, kMessageCode, @"Message."));
120-
XCTAssertNoThrow(GULLogDebug(@"my service", NO, kMessageCode, @"Configure %@.", @"blah"));
67+
- (void)testForceDebug {
68+
[[self.loggerSystemMock expect] setForcedDebug:YES];
69+
GULLoggerForceDebug();
70+
[self.loggerSystemMock verify];
12171
}
12272

123-
// asl_set_filter does not perform as expected in unit test environment with simulator. The
124-
// following test only checks whether the logs have been sent to system with the default settings in
125-
// the unit test environment.
126-
- (void)testSystemLogWithDefaultStatus {
127-
#if !(BUG128) // Disable until https://github.com/firebase/firebase-ios-sdk/issues/128 is fixed
128-
// Test fails on device and iOS 9 simulators - b/38130372
129-
return;
130-
#else
131-
// Sets the time interval that we need to wait in order to fetch all the logs.
132-
NSTimeInterval timeInterval = 0.1f;
133-
// Generates a random string each time and check whether it has been logged.
134-
// Log messages with Notice level and below should be logged to system/device by default.
135-
self.randomLogString = [NSUUID UUID].UUIDString;
136-
GULLogError(@"my service", NO, kMessageCode, @"%@", self.randomLogString);
137-
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]];
138-
XCTAssertTrue([self logExists]);
139-
140-
self.randomLogString = [NSUUID UUID].UUIDString;
141-
GULLogWarning(@"my service", kMessageCode, @"%@", self.randomLogString);
142-
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]];
143-
XCTAssertTrue([self logExists]);
144-
145-
self.randomLogString = [NSUUID UUID].UUIDString;
146-
GULLogNotice(@"my service", kMessageCode, @"%@", self.randomLogString);
147-
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]];
148-
XCTAssertTrue([self logExists]);
149-
150-
// Log messages with Info level and above should NOT be logged to system/device by default.
151-
self.randomLogString = [NSUUID UUID].UUIDString;
152-
GULLogInfo(@"my service", kMessageCode, @"%@", self.randomLogString);
153-
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]];
154-
XCTAssertFalse([self logExists]);
155-
156-
self.randomLogString = [NSUUID UUID].UUIDString;
157-
GULLogDebug(@"my service", kMessageCode, @"%@", self.randomLogString);
158-
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]];
159-
XCTAssertFalse([self logExists]);
160-
#endif
73+
- (void)testEnableSTDERR {
74+
[[self.loggerSystemMock expect] printToSTDERR];
75+
GULLoggerEnableSTDERR();
76+
[self.loggerSystemMock verify];
16177
}
16278

163-
// The GULLoggerLevel enum must match the ASL_LEVEL_* constants, but we manually redefine
164-
// them in GULLoggerLevel.h since we cannot include <asl.h> (see b/34976089 for more details).
165-
// This test ensures the constants match.
166-
- (void)testGULLoggerLevelValues {
167-
XCTAssertEqual(GULLoggerLevelError, ASL_LEVEL_ERR);
168-
XCTAssertEqual(GULLoggerLevelWarning, ASL_LEVEL_WARNING);
169-
XCTAssertEqual(GULLoggerLevelNotice, ASL_LEVEL_NOTICE);
170-
XCTAssertEqual(GULLoggerLevelInfo, ASL_LEVEL_INFO);
171-
XCTAssertEqual(GULLoggerLevelDebug, ASL_LEVEL_DEBUG);
79+
- (void)testSetLoggerLevel {
80+
[[self.loggerSystemMock expect] setLogLevel:kLogLevel];
81+
GULSetLoggerLevel(kLogLevel);
82+
[self.loggerSystemMock verify];
17283
}
17384

174-
// Helper functions.
175-
- (BOOL)logExists {
176-
NSString *correctMsg =
177-
[NSString stringWithFormat:@"%@[%@] %@", @"my service", kMessageCode, self.randomLogString];
178-
return [self messageWasLogged:correctMsg];
85+
- (void)testIsLoggableLevel {
86+
[[self.loggerSystemMock expect] isLoggableLevel:kLogLevel];
87+
GULIsLoggableLevel(kLogLevel);
88+
[self.loggerSystemMock verify];
17989
}
18090

181-
- (BOOL)messageWasLogged:(NSString *)message {
182-
#pragma clang diagnostic push
183-
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
184-
aslmsg query = asl_new(ASL_TYPE_QUERY);
185-
asl_set_query(query, ASL_KEY_FACILITY, kGULLoggerASLClientFacilityName, ASL_QUERY_OP_EQUAL);
186-
aslresponse r = asl_search(getGULLoggerClient(), query);
187-
asl_free(query);
188-
aslmsg m;
189-
const char *val;
190-
NSMutableArray *allMsg = [[NSMutableArray alloc] init];
191-
while ((m = asl_next(r)) != NULL) {
192-
val = asl_get(m, ASL_KEY_MSG);
193-
if (val) {
194-
[allMsg addObject:[NSString stringWithUTF8String:val]];
195-
}
196-
}
197-
asl_free(m);
198-
asl_release(r);
199-
return [allMsg containsObject:message];
200-
#pragma clang pop
91+
- (void)testRegisterVersion {
92+
[[self.loggerSystemMock expect] setVersion:kVersionString];
93+
GULLoggerRegisterVersion(kVersionChar);
94+
[self.loggerSystemMock verify];
20195
}
20296

203-
@end */
204-
#endif
97+
// TODO(bstpierre): Test that LogBasic calls are piped through. OCMock does not currently support
98+
// the mocking of methods with variadic parameters: https://github.com/erikdoe/ocmock/issues/191
99+
100+
@end

0 commit comments

Comments
 (0)