Skip to content

Commit 9502e8d

Browse files
authored
Restore GoogleUtilities 5.3.7 - revert os_log changes (#2556)
1 parent 23191da commit 9502e8d

File tree

18 files changed

+611
-1163
lines changed

18 files changed

+611
-1163
lines changed

Example/Core/Tests/FIRLoggerTest.m

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

15-
#import <FirebaseCore/FIRLogger.h>
15+
#ifdef DEBUG
16+
// The tests depend upon library methods only built with #ifdef DEBUG
1617

1718
#import "FIRTestCase.h"
1819

20+
// TODO - FIRLoggerTest should be split into a separate FIRLoggerTest and GULLoggerTest.
21+
// No test should include both includes.
22+
#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+
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";
47+
1948
@interface FIRLoggerTest : FIRTestCase
49+
50+
@property(nonatomic) NSString *randomLogString;
51+
52+
@property(nonatomic, strong) NSUserDefaults *defaults;
53+
2054
@end
2155

2256
@implementation FIRLoggerTest
2357

24-
// TODO(bstpierre): Test FIRLogger functionality separate from GULLogger.
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+
25278
@end
279+
#endif

Firebase/Core/FIRLogger.m

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@
2020

2121
#import "Private/FIRVersion.h"
2222

23-
FIRLoggerService kFIRLoggerABTesting = @"Firebase/ABTesting";
24-
FIRLoggerService kFIRLoggerAdMob = @"Firebase/AdMob";
25-
FIRLoggerService kFIRLoggerAnalytics = @"Firebase/Analytics";
26-
FIRLoggerService kFIRLoggerAuth = @"Firebase/Auth";
27-
FIRLoggerService kFIRLoggerCore = @"Firebase/Core";
28-
FIRLoggerService kFIRLoggerCrash = @"Firebase/Crash";
29-
FIRLoggerService kFIRLoggerDatabase = @"Firebase/Database";
30-
FIRLoggerService kFIRLoggerDynamicLinks = @"Firebase/DynamicLinks";
31-
FIRLoggerService kFIRLoggerFirestore = @"Firebase/Firestore";
32-
FIRLoggerService kFIRLoggerInstanceID = @"Firebase/InstanceID";
33-
FIRLoggerService kFIRLoggerInvites = @"Firebase/Invites";
34-
FIRLoggerService kFIRLoggerMLKit = @"Firebase/MLKit";
35-
FIRLoggerService kFIRLoggerMessaging = @"Firebase/Messaging";
36-
FIRLoggerService kFIRLoggerPerf = @"Firebase/Performance";
37-
FIRLoggerService kFIRLoggerRemoteConfig = @"Firebase/RemoteConfig";
38-
FIRLoggerService kFIRLoggerStorage = @"Firebase/Storage";
39-
FIRLoggerService kFIRLoggerSwizzler = @"FirebaseSwizzlingUtilities";
23+
FIRLoggerService kFIRLoggerABTesting = @"[Firebase/ABTesting]";
24+
FIRLoggerService kFIRLoggerAdMob = @"[Firebase/AdMob]";
25+
FIRLoggerService kFIRLoggerAnalytics = @"[Firebase/Analytics]";
26+
FIRLoggerService kFIRLoggerAuth = @"[Firebase/Auth]";
27+
FIRLoggerService kFIRLoggerCore = @"[Firebase/Core]";
28+
FIRLoggerService kFIRLoggerCrash = @"[Firebase/Crash]";
29+
FIRLoggerService kFIRLoggerDatabase = @"[Firebase/Database]";
30+
FIRLoggerService kFIRLoggerDynamicLinks = @"[Firebase/DynamicLinks]";
31+
FIRLoggerService kFIRLoggerFirestore = @"[Firebase/Firestore]";
32+
FIRLoggerService kFIRLoggerInstanceID = @"[Firebase/InstanceID]";
33+
FIRLoggerService kFIRLoggerInvites = @"[Firebase/Invites]";
34+
FIRLoggerService kFIRLoggerMLKit = @"[Firebase/MLKit]";
35+
FIRLoggerService kFIRLoggerMessaging = @"[Firebase/Messaging]";
36+
FIRLoggerService kFIRLoggerPerf = @"[Firebase/Performance]";
37+
FIRLoggerService kFIRLoggerRemoteConfig = @"[Firebase/RemoteConfig]";
38+
FIRLoggerService kFIRLoggerStorage = @"[Firebase/Storage]";
39+
FIRLoggerService kFIRLoggerSwizzler = @"[FirebaseSwizzlingUtilities]";
4040

4141
/// Arguments passed on launch.
4242
NSString *const kFIRDisableDebugModeApplicationArgument = @"-FIRDebugDisabled";
@@ -106,6 +106,20 @@ void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel) {
106106
GULSetLoggerLevel((GULLoggerLevel)loggerLevel);
107107
}
108108

109+
#ifdef DEBUG
110+
void FIRResetLogger() {
111+
extern void GULResetLogger(void);
112+
sFIRLoggerOnceToken = 0;
113+
[sFIRLoggerUserDefaults removeObjectForKey:kFIRPersistedDebugModeKey];
114+
sFIRLoggerUserDefaults = nil;
115+
GULResetLogger();
116+
}
117+
118+
void FIRSetLoggerUserDefaults(NSUserDefaults *defaults) {
119+
sFIRLoggerUserDefaults = defaults;
120+
}
121+
#endif
122+
109123
/**
110124
* Check if the level is high enough to be loggable.
111125
*

GoogleUtilities.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'GoogleUtilities'
3-
s.version = '5.4.1'
3+
s.version = '5.5.0'
44
s.summary = 'Google Utilities for iOS (plus community support for macOS and tvOS)'
55

66
s.description = <<-DESC
@@ -33,7 +33,7 @@ other Google CocoaPods. They're not intended for direct public usage.
3333

3434
s.subspec 'Logger' do |ls|
3535
ls.source_files = 'GoogleUtilities/Logger/**/*.[mh]'
36-
ls.public_header_files = 'GoogleUtilities/Logger/Public/*.h'
36+
ls.public_header_files = 'GoogleUtilities/Logger/Private/*.h', 'GoogleUtilities/Logger/Public/*.h'
3737
ls.private_header_files = 'GoogleUtilities/Logger/Private/*.h'
3838
ls.dependency 'GoogleUtilities/Environment'
3939
end

GoogleUtilities/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Unreleased
22

3+
# 5.5.0
4+
- Revert 5.4.x changes restoring 5.3.7 version.
5+
36
# 5.4.1
47
- Fix GULResetLogger API breakage. (#2551)
58

0 commit comments

Comments
 (0)