|
12 | 12 | // See the License for the specific language governing permissions and
|
13 | 13 | // limitations under the License.
|
14 | 14 |
|
15 |
| -#ifdef DEBUG |
16 |
| -// The tests depend upon library methods only built with #ifdef DEBUG |
17 |
| - |
18 | 15 | #import <OCMock/OCMock.h>
|
19 | 16 | #import <XCTest/XCTest.h>
|
20 | 17 |
|
21 | 18 | #import <GoogleUtilities/GULLogger.h>
|
22 | 19 |
|
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; |
34 | 31 | @end
|
35 | 32 |
|
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 - |
60 | 34 |
|
| 35 | +@interface GULLoggerTest : XCTestCase |
| 36 | +@property(nonatomic) id loggerSystemMock; |
61 | 37 | @end
|
62 | 38 |
|
63 |
| -@implementation GULOldLoggerTest |
| 39 | +@implementation GULLoggerTest |
64 | 40 |
|
65 | 41 | - (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; |
71 | 44 | }
|
72 | 45 |
|
73 | 46 | - (void)tearDown {
|
74 |
| - [super tearDown]; |
75 |
| -
|
76 |
| - _defaults = nil; |
| 47 | + GULLogger.logger = nil; |
77 | 48 | }
|
78 | 49 |
|
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 |
90 | 51 |
|
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]; |
104 | 56 | }
|
105 | 57 |
|
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 | +} |
115 | 64 |
|
116 |
| - XCTAssertNoThrow(GULLogInfo(@"my service", NO, kMessageCode, @"Message.")); |
117 |
| - XCTAssertNoThrow(GULLogInfo(@"my service", NO, kMessageCode, @"Configure %@.", @"blah")); |
| 65 | +#pragma mark Forwarded Call Tests |
118 | 66 |
|
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]; |
121 | 71 | }
|
122 | 72 |
|
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]; |
161 | 77 | }
|
162 | 78 |
|
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]; |
172 | 83 | }
|
173 | 84 |
|
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]; |
179 | 89 | }
|
180 | 90 |
|
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]; |
201 | 95 | }
|
202 | 96 |
|
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