Skip to content

Commit e129a30

Browse files
authored
Implement additional tests and enhance GDLLogEvent (#2231)
* Move qosTier to the public API and add a custom prioritization dict * Set the default qosTier in each logging API * Change a missing transform: impl to an error, rearrange error enums We can only rearrange the enums because we've not shipped anything yet. * Implement additional tests * Remove extra space Damned flat macbook keyboards.
1 parent fd9b882 commit e129a30

File tree

8 files changed

+119
-22
lines changed

8 files changed

+119
-22
lines changed

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogEvent.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ - (instancetype)initWithLogMapID:(NSString *)logMapID logTarget:(NSInteger)logTa
2828
if (self) {
2929
_logMapID = logMapID;
3030
_logTarget = logTarget;
31+
_qosTier = GDLLogQosDefault;
3132
}
3233
return self;
3334
}
@@ -38,6 +39,7 @@ - (instancetype)copy {
3839
copy.extensionBytes = _extensionBytes;
3940
copy.qosTier = _qosTier;
4041
copy.clockSnapshot = _clockSnapshot;
42+
copy.customPrioritizationParams = _customPrioritizationParams;
4143
return copy;
4244
}
4345

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogWriter.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ - (void)writeLog:(GDLLogEvent *)log
5757
return;
5858
}
5959
} else {
60-
GDLLogWarning(GDLMCWTransformerDoesntImplementTransform,
61-
@"Transformer doesn't implement transform: %@", transformer);
60+
GDLLogError(GDLMCETransformerDoesntImplementTransform,
61+
@"Transformer doesn't implement transform: %@", transformer);
6262
return;
6363
}
6464
}

GoogleDataLogger/GoogleDataLogger/Classes/GDLLogger.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ - (instancetype)initWithLogMapID:(NSString *)logMapID
5252
- (void)logTelemetryEvent:(GDLLogEvent *)logEvent {
5353
GDLAssert(logEvent, @"You can't log a nil event");
5454
GDLLogEvent *copiedLog = [logEvent copy];
55+
copiedLog.qosTier = GDLLogQoSTelemetry;
5556
[[GDLLogWriter sharedInstance] writeLog:copiedLog afterApplyingTransformers:_logTransformers];
5657
}
5758

5859
- (void)logDataEvent:(GDLLogEvent *)logEvent {
5960
GDLAssert(logEvent, @"You can't log a nil event");
61+
GDLAssert(logEvent.qosTier != GDLLogQoSTelemetry, @"Use -logTelemetryEvent, please.");
6062
GDLLogEvent *copiedLog = [logEvent copy];
6163
[[GDLLogWriter sharedInstance] writeLog:copiedLog afterApplyingTransformers:_logTransformers];
6264
}

GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLLogEvent_Private.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ NS_ASSUME_NONNULL_BEGIN
2525
/** The serialized bytes of the log object. */
2626
@property(nonatomic) NSData *extensionBytes;
2727

28-
/** The quality of service tier this log belongs to. */
29-
@property(nonatomic) GDLLogQoS qosTier;
30-
3128
/** The clock snapshot at the time of logging. */
3229
@property(nonatomic) GDLLogClockSnapshot clockSnapshot;
3330

GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogEvent.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ typedef NS_ENUM(NSInteger, GDLLogQoS) {
5050
* the GDLLogProto protocol. */
5151
@property(nullable, nonatomic) id<GDLLogProto> extension;
5252

53+
/** The quality of service tier this log belongs to. */
54+
@property(nonatomic) GDLLogQoS qosTier;
55+
56+
/** A dictionary provided to aid prioritizers by allowing the passing of arbitrary data. It will be
57+
* retained by a copy in -copy, but not used for -hash.
58+
*/
59+
@property(nullable, nonatomic) NSDictionary *customPrioritizationParams;
60+
5361
// Please use the designated initializer.
5462
- (instancetype)init NS_UNAVAILABLE;
5563

GoogleDataLogger/GoogleDataLogger/DependencyWrappers/GDLConsoleLogger.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ static GULLoggerService kGDLConsoleLogger = @"[GoogleDataLogger]";
3030
*/
3131
typedef NS_ENUM(NSInteger, GDLMessageCode) {
3232

33-
/** For warning messages concerning transform: not being implemented by a log transformer. */
34-
GDLMCWTransformerDoesntImplementTransform = 1,
35-
3633
/** For warning messages concerning protoBytes: not being implemented by a log extension. */
37-
GDLMCWExtensionMissingBytesImpl = 2,
34+
GDLMCWExtensionMissingBytesImpl = 1,
35+
36+
/** For error messages concerning transform: not being implemented by a log transformer. */
37+
GDLMCETransformerDoesntImplementTransform = 1000,
3838

3939
/** For error messages concerning a GDLLogEvent living past the storeLog: invocation. */
40-
GDLMCELogEventWasIllegallyRetained = 1000,
40+
GDLMCELogEventWasIllegallyRetained = 1001,
4141

4242
/** For error messages concerning the creation of a directory failing. */
43-
GDLMCEDirectoryCreationError = 1001,
43+
GDLMCEDirectoryCreationError = 1002,
4444

45-
/** For error messages concerning the writing of a log file. */
46-
GDLMCEFileWriteError = 1002
45+
/** For error messages concerning the writing of a log file. */
46+
GDLMCEFileWriteError = 1003
4747
};
4848

4949
/** */

GoogleDataLogger/Tests/GDLLogStorageTest.m

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#import "GDLTestBackend.h"
2828
#import "GDLTestPrioritizer.h"
2929

30+
#import "GDLAssertHelper.h"
3031
#import "GDLLogStorage+Testing.h"
3132
#import "GDLRegistrar+Testing.h"
3233

@@ -45,13 +46,15 @@ @interface GDLLogStorageTest : GDLTestCase
4546
@implementation GDLLogStorageTest
4647

4748
- (void)setUp {
49+
[super setUp];
4850
self.testBackend = [[GDLTestBackend alloc] init];
4951
self.testPrioritizer = [[GDLTestPrioritizer alloc] init];
5052
[[GDLRegistrar sharedInstance] registerBackend:_testBackend forLogTarget:logTarget];
5153
[[GDLRegistrar sharedInstance] registerLogPrioritizer:_testPrioritizer forLogTarget:logTarget];
5254
}
5355

5456
- (void)tearDown {
57+
[super tearDown];
5558
// Destroy these objects before the next test begins.
5659
self.testBackend = nil;
5760
self.testPrioritizer = nil;
@@ -109,9 +112,84 @@ - (void)testRemoveLog {
109112
});
110113
}
111114

115+
/** Tests storing a few different logs. */
116+
- (void)testStoreMultipleLogs {
117+
NSUInteger log1Hash, log2Hash, log3Hash;
118+
119+
// logEvents are autoreleased, and the pool needs to drain.
120+
@autoreleasepool {
121+
GDLLogEvent *logEvent = [[GDLLogEvent alloc] initWithLogMapID:@"404" logTarget:logTarget];
122+
logEvent.extensionBytes = [@"testString1" dataUsingEncoding:NSUTF8StringEncoding];
123+
log1Hash = logEvent.hash;
124+
XCTAssertNoThrow([[GDLLogStorage sharedInstance] storeLog:logEvent]);
125+
126+
logEvent = [[GDLLogEvent alloc] initWithLogMapID:@"100" logTarget:logTarget];
127+
logEvent.extensionBytes = [@"testString2" dataUsingEncoding:NSUTF8StringEncoding];
128+
log2Hash = logEvent.hash;
129+
XCTAssertNoThrow([[GDLLogStorage sharedInstance] storeLog:logEvent]);
130+
131+
logEvent = [[GDLLogEvent alloc] initWithLogMapID:@"404" logTarget:logTarget];
132+
logEvent.extensionBytes = [@"testString3" dataUsingEncoding:NSUTF8StringEncoding];
133+
log3Hash = logEvent.hash;
134+
XCTAssertNoThrow([[GDLLogStorage sharedInstance] storeLog:logEvent]);
135+
}
136+
dispatch_sync([GDLLogStorage sharedInstance].storageQueue, ^{
137+
XCTAssertEqual([GDLLogStorage sharedInstance].logHashToLogFile.count, 3);
138+
XCTAssertEqual([GDLLogStorage sharedInstance].logTargetToLogFileSet[@(logTarget)].count, 3);
139+
140+
NSURL *log1File = [GDLLogStorage sharedInstance].logHashToLogFile[@(log1Hash)];
141+
XCTAssertNotNil(log1File);
142+
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:log1File.path]);
143+
NSError *error;
144+
XCTAssertTrue([[NSFileManager defaultManager] removeItemAtURL:log1File error:&error]);
145+
XCTAssertNil(error, @"There was an error deleting the logFile: %@", error);
146+
147+
NSURL *log2File = [GDLLogStorage sharedInstance].logHashToLogFile[@(log2Hash)];
148+
XCTAssertNotNil(log2File);
149+
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:log2File.path]);
150+
error = nil;
151+
XCTAssertTrue([[NSFileManager defaultManager] removeItemAtURL:log2File error:&error]);
152+
XCTAssertNil(error, @"There was an error deleting the logFile: %@", error);
153+
154+
NSURL *log3File = [GDLLogStorage sharedInstance].logHashToLogFile[@(log3Hash)];
155+
XCTAssertNotNil(log3File);
156+
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:log3File.path]);
157+
error = nil;
158+
XCTAssertTrue([[NSFileManager defaultManager] removeItemAtURL:log3File error:&error]);
159+
XCTAssertNil(error, @"There was an error deleting the logFile: %@", error);
160+
});
161+
}
162+
112163
/** Tests enforcing that a log prioritizer does not retain a log in memory. */
113164
- (void)testLogEventDeallocationIsEnforced {
114-
// TODO
165+
XCTestExpectation *errorExpectation = [self expectationWithDescription:@"log retain error"];
166+
[GDLAssertHelper setAssertionBlock:^{
167+
[errorExpectation fulfill];
168+
}];
169+
170+
// logEvent is referenced past -storeLog, ensuring it's retained, which should assert.
171+
GDLLogEvent *logEvent = [[GDLLogEvent alloc] initWithLogMapID:@"404" logTarget:logTarget];
172+
logEvent.extensionBytes = [@"testString" dataUsingEncoding:NSUTF8StringEncoding];
173+
174+
// Store the log and wait for the expectation.
175+
[[GDLLogStorage sharedInstance] storeLog:logEvent];
176+
[self waitForExpectations:@[ errorExpectation ] timeout:5.0];
177+
178+
NSURL *logFile;
179+
logFile = [GDLLogStorage sharedInstance].logHashToLogFile[@(logEvent.hash)];
180+
181+
// This isn't strictly necessary because of the -waitForExpectations above.
182+
dispatch_sync([GDLLogStorage sharedInstance].storageQueue, ^{
183+
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:logFile.path]);
184+
});
185+
186+
// Ensure log was removed.
187+
[[GDLLogStorage sharedInstance] removeLog:@(logEvent.hash) logTarget:@(logTarget)];
188+
dispatch_sync([GDLLogStorage sharedInstance].storageQueue, ^{
189+
XCTAssertFalse([[NSFileManager defaultManager] fileExistsAtPath:logFile.path]);
190+
XCTAssertEqual([GDLLogStorage sharedInstance].logHashToLogFile.count, 0);
191+
XCTAssertEqual([GDLLogStorage sharedInstance].logTargetToLogFileSet[@(logTarget)].count, 0);
192+
});
115193
}
116194

117195
/** Tests encoding and decoding the storage singleton correctly. */

GoogleDataLogger/Tests/GDLLogWriterTest.m

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#import "GDLLogWriter.h"
2424
#import "GDLLogWriter_Private.h"
2525

26+
#import "GDLAssertHelper.h"
27+
2628
@interface GDLLogWriterTestNilingTransformer : NSObject <GDLLogTransformer>
2729

2830
@end
@@ -106,14 +108,22 @@ - (void)testWriteLogWithBadTransformer {
106108
GDLLogEvent *log = [[GDLLogEvent alloc] initWithLogMapID:@"2" logTarget:1];
107109
log.extension = [[GDLLogExtensionTesterSimple alloc] init];
108110
NSArray *transformers = @[ [[NSObject alloc] init] ];
109-
@try {
110-
dispatch_sync(writer.logWritingQueue, ^{
111-
// TODO(mikehaney24): Assert that storage contains the new log.
112-
[writer writeLog:log afterApplyingTransformers:transformers];
113-
});
114-
} @catch (NSException *exception) {
115-
NSLog(@"");
116-
}
111+
112+
XCTestExpectation *errorExpectation = [self expectationWithDescription:@"transform: is missing"];
113+
[GDLAssertHelper setAssertionBlock:^{
114+
[errorExpectation fulfill];
115+
}];
116+
[writer writeLog:log afterApplyingTransformers:transformers];
117+
[self waitForExpectations:@[ errorExpectation ] timeout:5.0];
118+
dispatch_sync(writer.logWritingQueue, ^{
119+
// TODO(mikehaney24): Assert that storage contains the new log.
120+
});
121+
}
122+
123+
/** Tests that writing a nil log throws. */
124+
- (void)testWritingANilLogThrows {
125+
GDLLogWriter *writer = [GDLLogWriter sharedInstance];
126+
XCTAssertThrows([writer writeLog:nil afterApplyingTransformers:nil]);
117127
}
118128

119129
@end

0 commit comments

Comments
 (0)