|
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 |
| -#import "FIRTestCase.h" |
19 |
| - |
20 |
| -// TODO - FIRLoggerTest should be split into a separate FIRLoggerTest and GULLoggerTest. |
21 |
| -// No test should include both includes. |
22 | 15 | #import <FirebaseCore/FIRLogger.h>
|
23 |
| -#import <GoogleUtilities/GULLogger.h> |
24 |
| - |
25 |
| -#import <asl.h> |
26 |
| - |
27 |
| -// The following constants are exposed from FIRLogger for unit tests. |
28 |
| -extern NSString *const kFIRDisableDebugModeApplicationArgument; |
29 |
| -extern NSString *const kFIREnableDebugModeApplicationArgument; |
30 |
| - |
31 |
| -/// Key for the debug mode bit in NSUserDefaults. |
32 |
| -extern NSString *const kFIRPersistedDebugModeKey; |
33 |
| - |
34 |
| -extern const char *kGULLoggerASLClientFacilityName; |
35 | 16 |
|
36 |
| -extern void FIRResetLogger(void); |
37 |
| - |
38 |
| -extern void FIRSetLoggerUserDefaults(NSUserDefaults *defaults); |
39 |
| - |
40 |
| -extern aslclient getGULLoggerClient(void); |
41 |
| - |
42 |
| -extern dispatch_queue_t getGULClientQueue(void); |
43 |
| - |
44 |
| -extern BOOL getGULLoggerDebugMode(void); |
45 |
| - |
46 |
| -static NSString *const kMessageCode = @"I-COR000001"; |
| 17 | +#import "FIRTestCase.h" |
47 | 18 |
|
48 | 19 | @interface FIRLoggerTest : FIRTestCase
|
49 |
| - |
50 |
| -@property(nonatomic) NSString *randomLogString; |
51 |
| - |
52 |
| -@property(nonatomic, strong) NSUserDefaults *defaults; |
53 |
| - |
54 | 20 | @end
|
55 | 21 |
|
56 | 22 | @implementation FIRLoggerTest
|
57 |
| - |
58 |
| -- (void)setUp { |
59 |
| - [super setUp]; |
60 |
| - FIRResetLogger(); |
61 |
| - |
62 |
| - // Stub NSUserDefaults for cleaner testing. |
63 |
| - _defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.firebase.logger_test"]; |
64 |
| - FIRSetLoggerUserDefaults(_defaults); |
65 |
| -} |
66 |
| - |
67 |
| -- (void)tearDown { |
68 |
| - [super tearDown]; |
69 |
| - |
70 |
| - _defaults = nil; |
71 |
| -} |
72 |
| - |
73 |
| -// Test some stable variables to make sure they weren't accidently changed. |
74 |
| -- (void)testStableVariables { |
75 |
| - // Strings of type FIRLoggerServices. |
76 |
| - XCTAssertEqualObjects(kFIRLoggerABTesting, @"[Firebase/ABTesting]"); |
77 |
| - XCTAssertEqualObjects(kFIRLoggerAdMob, @"[Firebase/AdMob]"); |
78 |
| - XCTAssertEqualObjects(kFIRLoggerAnalytics, @"[Firebase/Analytics]"); |
79 |
| - XCTAssertEqualObjects(kFIRLoggerAuth, @"[Firebase/Auth]"); |
80 |
| - XCTAssertEqualObjects(kFIRLoggerCore, @"[Firebase/Core]"); |
81 |
| - XCTAssertEqualObjects(kFIRLoggerCrash, @"[Firebase/Crash]"); |
82 |
| - XCTAssertEqualObjects(kFIRLoggerDatabase, @"[Firebase/Database]"); |
83 |
| - XCTAssertEqualObjects(kFIRLoggerDynamicLinks, @"[Firebase/DynamicLinks]"); |
84 |
| - XCTAssertEqualObjects(kFIRLoggerInstanceID, @"[Firebase/InstanceID]"); |
85 |
| - XCTAssertEqualObjects(kFIRLoggerInvites, @"[Firebase/Invites]"); |
86 |
| - XCTAssertEqualObjects(kFIRLoggerMLKit, @"[Firebase/MLKit]"); |
87 |
| - XCTAssertEqualObjects(kFIRLoggerMessaging, @"[Firebase/Messaging]"); |
88 |
| - XCTAssertEqualObjects(kFIRLoggerRemoteConfig, @"[Firebase/RemoteConfig]"); |
89 |
| - XCTAssertEqualObjects(kFIRLoggerStorage, @"[Firebase/Storage]"); |
90 |
| -} |
91 |
| - |
92 |
| -- (void)testInitializeASLForNonDebugMode { |
93 |
| - // Stub. |
94 |
| - id processInfoMock = [OCMockObject partialMockForObject:[NSProcessInfo processInfo]]; |
95 |
| - NSArray *arguments = @[ kFIRDisableDebugModeApplicationArgument ]; |
96 |
| - [[[processInfoMock stub] andReturn:arguments] arguments]; |
97 |
| - |
98 |
| - // Test. |
99 |
| - FIRLogError(kFIRLoggerCore, kMessageCode, @"Some error."); |
100 |
| - |
101 |
| - // Assert. |
102 |
| -#if MAKE_THREAD_SAFE |
103 |
| - NSNumber *debugMode = [self.defaults objectForKey:kFIRPersistedDebugModeKey]; |
104 |
| - XCTAssertNil(debugMode); |
105 |
| - XCTAssertFalse(getGULLoggerDebugMode()); |
106 |
| -#endif |
107 |
| - |
108 |
| - // Stop. |
109 |
| - [processInfoMock stopMocking]; |
110 |
| -} |
111 |
| - |
112 |
| -- (void)testInitializeASLForDebugModeWithArgument { |
113 |
| - // Stub. |
114 |
| - id processInfoMock = [OCMockObject partialMockForObject:[NSProcessInfo processInfo]]; |
115 |
| - NSArray *arguments = @[ kFIREnableDebugModeApplicationArgument ]; |
116 |
| - [[[processInfoMock stub] andReturn:arguments] arguments]; |
117 |
| - |
118 |
| - // Test. |
119 |
| - FIRLogError(kFIRLoggerCore, kMessageCode, @"Some error."); |
120 |
| - |
121 |
| -#ifdef MAKE_THREAD_SAFE |
122 |
| - // Assert. |
123 |
| - NSNumber *debugMode = [self.defaults objectForKey:kGULPersistedDebugModeKey]; |
124 |
| - XCTAssertTrue(debugMode.boolValue); |
125 |
| - XCTAssertTrue(getGULLoggerDebugMode()); |
126 |
| -#endif |
127 |
| - |
128 |
| - // Stop. |
129 |
| - [processInfoMock stopMocking]; |
130 |
| -} |
131 |
| - |
132 |
| -- (void)testInitializeASLForDebugModeWithUserDefaults { |
133 |
| - // Stub. |
134 |
| - NSNumber *debugMode = @YES; |
135 |
| - [self.defaults setBool:debugMode.boolValue forKey:kFIRPersistedDebugModeKey]; |
136 |
| - |
137 |
| - // Test. |
138 |
| - GULLogError(@"my service", NO, kMessageCode, @"Some error."); |
139 |
| - |
140 |
| - // Assert. |
141 |
| - debugMode = [self.defaults objectForKey:kFIRPersistedDebugModeKey]; |
142 |
| - XCTAssertTrue(debugMode.boolValue); |
143 |
| -} |
144 |
| - |
145 |
| -- (void)testMessageCodeFormat { |
146 |
| - // Valid case. |
147 |
| - XCTAssertNoThrow(FIRLogError(kFIRLoggerCore, @"I-APP000001", @"Message.")); |
148 |
| - |
149 |
| - // An extra dash or missing dash should fail. |
150 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"I-APP-000001", @"Message.")); |
151 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"IAPP000001", @"Message.")); |
152 |
| - |
153 |
| - // Wrong number of digits should fail. |
154 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"I-APP00001", @"Message.")); |
155 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"I-APP0000001", @"Message.")); |
156 |
| - |
157 |
| - // Lowercase should fail. |
158 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"I-app000001", @"Message.")); |
159 |
| - |
160 |
| -// nil or empty message code should fail. |
161 |
| -#pragma clang diagnostic push |
162 |
| -#pragma clang diagnostic ignored "-Wnonnull" |
163 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, nil, @"Message.")); |
164 |
| -#pragma clang diagnostic pop |
165 |
| - |
166 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"", @"Message.")); |
167 |
| - |
168 |
| - // Android message code should fail. |
169 |
| - XCTAssertThrows(FIRLogError(kFIRLoggerCore, @"A-APP000001", @"Message.")); |
170 |
| -} |
171 |
| - |
172 |
| -- (void)testLoggerInterface { |
173 |
| - XCTAssertNoThrow(FIRLogError(kFIRLoggerCore, kMessageCode, @"Message.")); |
174 |
| - XCTAssertNoThrow(FIRLogError(kFIRLoggerCore, kMessageCode, @"Configure %@.", @"blah")); |
175 |
| - |
176 |
| - XCTAssertNoThrow(FIRLogWarning(kFIRLoggerCore, kMessageCode, @"Message.")); |
177 |
| - XCTAssertNoThrow(FIRLogWarning(kFIRLoggerCore, kMessageCode, @"Configure %@.", @"blah")); |
178 |
| - |
179 |
| - XCTAssertNoThrow(FIRLogNotice(kFIRLoggerCore, kMessageCode, @"Message.")); |
180 |
| - XCTAssertNoThrow(FIRLogNotice(kFIRLoggerCore, kMessageCode, @"Configure %@.", @"blah")); |
181 |
| - |
182 |
| - XCTAssertNoThrow(FIRLogInfo(kFIRLoggerCore, kMessageCode, @"Message.")); |
183 |
| - XCTAssertNoThrow(FIRLogInfo(kFIRLoggerCore, kMessageCode, @"Configure %@.", @"blah")); |
184 |
| - |
185 |
| - XCTAssertNoThrow(FIRLogDebug(kFIRLoggerCore, kMessageCode, @"Message.")); |
186 |
| - XCTAssertNoThrow(FIRLogDebug(kFIRLoggerCore, kMessageCode, @"Configure %@.", @"blah")); |
187 |
| -} |
188 |
| - |
189 |
| -// asl_set_filter does not perform as expected in unit test environment with simulator. The |
190 |
| -// following test only checks whether the logs have been sent to system with the default settings in |
191 |
| -// the unit test environment. |
192 |
| -- (void)testSystemLogWithDefaultStatus { |
193 |
| -#if !(BUG128) // Disable until https://github.com/firebase/firebase-ios-sdk/issues/128 is fixed |
194 |
| - // Test fails on device and iOS 9 simulators - b/38130372 |
195 |
| - return; |
196 |
| -#else |
197 |
| - // Sets the time interval that we need to wait in order to fetch all the logs. |
198 |
| - NSTimeInterval timeInterval = 0.1f; |
199 |
| - // Generates a random string each time and check whether it has been logged. |
200 |
| - // Log messages with Notice level and below should be logged to system/device by default. |
201 |
| - self.randomLogString = [NSUUID UUID].UUIDString; |
202 |
| - FIRLogError(kFIRLoggerCore, kMessageCode, @"%@", self.randomLogString); |
203 |
| - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]]; |
204 |
| - XCTAssertTrue([self logExists]); |
205 |
| - |
206 |
| - self.randomLogString = [NSUUID UUID].UUIDString; |
207 |
| - FIRLogWarning(kFIRLoggerCore, kMessageCode, @"%@", self.randomLogString); |
208 |
| - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]]; |
209 |
| - XCTAssertTrue([self logExists]); |
210 |
| - |
211 |
| - self.randomLogString = [NSUUID UUID].UUIDString; |
212 |
| - FIRLogNotice(kFIRLoggerCore, kMessageCode, @"%@", self.randomLogString); |
213 |
| - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]]; |
214 |
| - XCTAssertTrue([self logExists]); |
215 |
| - |
216 |
| - // Log messages with Info level and above should NOT be logged to system/device by default. |
217 |
| - self.randomLogString = [NSUUID UUID].UUIDString; |
218 |
| - FIRLogInfo(kFIRLoggerCore, kMessageCode, @"%@", self.randomLogString); |
219 |
| - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]]; |
220 |
| - XCTAssertFalse([self logExists]); |
221 |
| - |
222 |
| - self.randomLogString = [NSUUID UUID].UUIDString; |
223 |
| - FIRLogDebug(kFIRLoggerCore, kMessageCode, @"%@", self.randomLogString); |
224 |
| - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeInterval]]; |
225 |
| - XCTAssertFalse([self logExists]); |
226 |
| -#endif |
227 |
| -} |
228 |
| - |
229 |
| -// The FIRLoggerLevel enum must match the ASL_LEVEL_* constants, but we manually redefine |
230 |
| -// them in FIRLoggerLevel.h since we cannot include <asl.h> (see b/34976089 for more details). |
231 |
| -// This test ensures the constants match. |
232 |
| -- (void)testFIRLoggerLevelValues { |
233 |
| - XCTAssertEqual(FIRLoggerLevelError, ASL_LEVEL_ERR); |
234 |
| - XCTAssertEqual(FIRLoggerLevelWarning, ASL_LEVEL_WARNING); |
235 |
| - XCTAssertEqual(FIRLoggerLevelNotice, ASL_LEVEL_NOTICE); |
236 |
| - XCTAssertEqual(FIRLoggerLevelInfo, ASL_LEVEL_INFO); |
237 |
| - XCTAssertEqual(FIRLoggerLevelDebug, ASL_LEVEL_DEBUG); |
238 |
| -} |
239 |
| - |
240 |
| -// Helper functions. |
241 |
| -- (BOOL)logExists { |
242 |
| - [self drainFIRClientQueue]; |
243 |
| - NSString *correctMsg = |
244 |
| - [NSString stringWithFormat:@"%@[%@] %@", kFIRLoggerCore, kMessageCode, self.randomLogString]; |
245 |
| - return [self messageWasLogged:correctMsg]; |
246 |
| -} |
247 |
| - |
248 |
| -- (void)drainFIRClientQueue { |
249 |
| - dispatch_semaphore_t workerSemaphore = dispatch_semaphore_create(0); |
250 |
| - dispatch_async(getGULClientQueue(), ^{ |
251 |
| - dispatch_semaphore_signal(workerSemaphore); |
252 |
| - }); |
253 |
| - dispatch_semaphore_wait(workerSemaphore, DISPATCH_TIME_FOREVER); |
254 |
| -} |
255 |
| - |
256 |
| -- (BOOL)messageWasLogged:(NSString *)message { |
257 |
| -#pragma clang diagnostic push |
258 |
| -#pragma clang diagnostic ignored "-Wdeprecated-declarations" |
259 |
| - aslmsg query = asl_new(ASL_TYPE_QUERY); |
260 |
| - asl_set_query(query, ASL_KEY_FACILITY, kGULLoggerASLClientFacilityName, ASL_QUERY_OP_EQUAL); |
261 |
| - aslresponse r = asl_search(getGULLoggerClient(), query); |
262 |
| - asl_free(query); |
263 |
| - aslmsg m; |
264 |
| - const char *val; |
265 |
| - NSMutableArray *allMsg = [[NSMutableArray alloc] init]; |
266 |
| - while ((m = asl_next(r)) != NULL) { |
267 |
| - val = asl_get(m, ASL_KEY_MSG); |
268 |
| - if (val) { |
269 |
| - [allMsg addObject:[NSString stringWithUTF8String:val]]; |
270 |
| - } |
271 |
| - } |
272 |
| - asl_free(m); |
273 |
| - asl_release(r); |
274 |
| - return [allMsg containsObject:message]; |
275 |
| -#pragma clang pop |
276 |
| -} |
277 |
| - |
| 23 | +// TODO(bstpierre):Create FIRLogger tests which do not depend on GULLogger implementation details. |
278 | 24 | @end
|
279 |
| -#endif |
0 commit comments