Skip to content

Commit fa26512

Browse files
GDT: fix time units for the request and events uptime (#6102)
* GDTCORClock: fix uptime and kernelBootTime units * GDTCCTNanopbHelpers: fix time units for the batch and events snapshot uptime * Formatting * GDTCORClock: properties rename and deprecation. * Changelog updates * Fix renaming issues * Cleanup * GDTCORClockTest: reduce timestamp comparison accuracy
1 parent e2a4328 commit fa26512

File tree

8 files changed

+128
-46
lines changed

8 files changed

+128
-46
lines changed

GoogleDataTransport/CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
# v7.0.1
2-
- `GDTCORFlatFileStorage`: keep not expired events when expired batch removed. (#6010)
1+
# v7.1.0
2+
- Device uptime calculation fixes. (#6102)
33

44
# v7.0.0
55
- Storage has been completely reimplemented to a flat-file system. It
66
is not backwards compatible with previously saved events.
77
- Prioritizers, data futures, and upload packages have been removed.
88
- Consolidated GoogleDataTransportCCTSupport with GoogleDataTransport. Starting
99
with this version, GoogleDataTransportCCTSupport should no longer be linked.
10+
- `GDTCORFlatFileStorage`: keep not expired events when expired batch removed. (#6010)
1011

1112
# v6.2.1
1213
- Stopped GDTCORUploadCoordinator from blocking main thread. (#5707, #5708)

GoogleDataTransport/GDTCCTLibrary/GDTCCTNanopbHelpers.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ gdt_cct_LogRequest GDTCCTConstructLogRequest(int32_t logSource,
128128
GDTCORClock *currentTime = [GDTCORClock snapshot];
129129
logRequest.request_time_ms = currentTime.timeMillis;
130130
logRequest.has_request_time_ms = 1;
131-
logRequest.request_uptime_ms = currentTime.uptime;
131+
logRequest.request_uptime_ms = [currentTime uptimeMilliseconds];
132132
logRequest.has_request_uptime_ms = 1;
133133

134134
return logRequest;
@@ -138,7 +138,7 @@ gdt_cct_LogEvent GDTCCTConstructLogEvent(GDTCOREvent *event) {
138138
gdt_cct_LogEvent logEvent = gdt_cct_LogEvent_init_default;
139139
logEvent.event_time_ms = event.clockSnapshot.timeMillis;
140140
logEvent.has_event_time_ms = 1;
141-
logEvent.event_uptime_ms = event.clockSnapshot.uptime;
141+
logEvent.event_uptime_ms = [event.clockSnapshot uptimeMilliseconds];
142142
logEvent.has_event_uptime_ms = 1;
143143
logEvent.timezone_offset_seconds = event.clockSnapshot.timezoneOffsetSeconds;
144144
logEvent.has_timezone_offset_seconds = 1;

GoogleDataTransport/GDTCCTTests/Unit/GDTCCTNanopbHelpersTest.m

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,34 @@ - (void)testBytesAreDecodable {
109109
pb_istream_t istream =
110110
pb_istream_from_buffer([encodedBatchLogRequest bytes], [encodedBatchLogRequest length]);
111111
XCTAssertTrue(pb_decode(&istream, gdt_cct_BatchedLogRequest_fields, &decodedBatch));
112-
XCTAssert(decodedBatch.log_request_count == batch.log_request_count);
113-
XCTAssert(decodedBatch.log_request[0].log_event_count == batch.log_request[0].log_event_count);
114-
XCTAssert(decodedBatch.log_request[0].log_event[0].event_time_ms ==
115-
batch.log_request[0].log_event[0].event_time_ms);
112+
XCTAssertEqual(decodedBatch.log_request_count, batch.log_request_count);
113+
XCTAssertEqual(decodedBatch.log_request[0].log_event_count, batch.log_request[0].log_event_count);
114+
XCTAssertEqual(decodedBatch.log_request[0].log_event[0].event_time_ms,
115+
batch.log_request[0].log_event[0].event_time_ms);
116+
XCTAssertEqual(decodedBatch.log_request[0].log_event[0].event_uptime_ms,
117+
batch.log_request[0].log_event[0].event_uptime_ms);
118+
pb_release(gdt_cct_BatchedLogRequest_fields, &batch);
119+
pb_release(gdt_cct_BatchedLogRequest_fields, &decodedBatch);
120+
}
121+
122+
- (void)testDecodedEventTimestampMatchToBatchContent {
123+
GDTCOREvent *storedEvent = [self.generator generateEvent:GDTCOREventQoSDaily];
124+
NSSet<GDTCOREvent *> *storedEvents = [NSSet setWithObject:storedEvent];
125+
gdt_cct_BatchedLogRequest batch = GDTCCTConstructBatchedLogRequest(@{@"1018" : storedEvents});
126+
NSData *encodedBatchLogRequest = GDTCCTEncodeBatchedLogRequest(&batch);
127+
gdt_cct_BatchedLogRequest decodedBatch = gdt_cct_BatchedLogRequest_init_default;
128+
pb_istream_t istream =
129+
pb_istream_from_buffer([encodedBatchLogRequest bytes], [encodedBatchLogRequest length]);
130+
XCTAssertTrue(pb_decode(&istream, gdt_cct_BatchedLogRequest_fields, &decodedBatch));
131+
132+
gdt_cct_LogRequest decodedLogRequest = decodedBatch.log_request[0];
133+
gdt_cct_LogEvent decodedLogEvent = decodedLogRequest.log_event[0];
134+
135+
XCTAssertEqual(decodedLogEvent.event_time_ms, storedEvent.clockSnapshot.timeMillis);
136+
XCTAssertEqual(decodedLogEvent.event_uptime_ms, [storedEvent.clockSnapshot uptimeMilliseconds]);
137+
XCTAssertEqual(decodedLogEvent.timezone_offset_seconds,
138+
storedEvent.clockSnapshot.timezoneOffsetSeconds);
139+
116140
pb_release(gdt_cct_BatchedLogRequest_fields, &batch);
117141
pb_release(gdt_cct_BatchedLogRequest_fields, &decodedBatch);
118142
}

GoogleDataTransport/GDTCCTTests/Unit/Helpers/GDTCCTEventGenerator.m

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ - (NSURL *)writeConsistentMessageToDisk:(NSString *)messageResource {
117117
event.clockSnapshot = [GDTCORClock snapshot];
118118
[event.clockSnapshot setValue:@(1111111111111) forKeyPath:@"timeMillis"];
119119
[event.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
120-
[event.clockSnapshot setValue:@(1111111111111222) forKeyPath:@"kernelBootTime"];
121-
[event.clockSnapshot setValue:@(1235567890) forKeyPath:@"uptime"];
120+
[event.clockSnapshot setValue:@(1111111111111222) forKeyPath:@"kernelBootTimeNanoseconds"];
121+
[event.clockSnapshot setValue:@(1235567890) forKeyPath:@"uptimeNanoseconds"];
122122
event.qosTier = GDTCOREventQosDefault;
123123
event.eventCode = @1986;
124124
NSError *error;
@@ -147,8 +147,8 @@ - (NSURL *)writeConsistentMessageToDisk:(NSString *)messageResource {
147147
event.clockSnapshot = [GDTCORClock snapshot];
148148
[event.clockSnapshot setValue:@(1111111111111) forKeyPath:@"timeMillis"];
149149
[event.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
150-
[event.clockSnapshot setValue:@(1111111111111333) forKeyPath:@"kernelBootTime"];
151-
[event.clockSnapshot setValue:@(1236567890) forKeyPath:@"uptime"];
150+
[event.clockSnapshot setValue:@(1111111111111333) forKeyPath:@"kernelBootTimeNanoseconds"];
151+
[event.clockSnapshot setValue:@(1236567890) forKeyPath:@"uptimeNanoseconds"];
152152
event.qosTier = GDTCOREventQoSWifiOnly;
153153
NSURL *messageDataURL = [self writeConsistentMessageToDisk:@"message-35458880.dat"];
154154
GDTCCTEventGeneratorDataObject *dataObject = [[GDTCCTEventGeneratorDataObject alloc] init];
@@ -170,8 +170,8 @@ - (NSURL *)writeConsistentMessageToDisk:(NSString *)messageResource {
170170
event.clockSnapshot = [GDTCORClock snapshot];
171171
[event.clockSnapshot setValue:@(1111111111111) forKeyPath:@"timeMillis"];
172172
[event.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
173-
[event.clockSnapshot setValue:@(1111111111111444) forKeyPath:@"kernelBootTime"];
174-
[event.clockSnapshot setValue:@(1237567890) forKeyPath:@"uptime"];
173+
[event.clockSnapshot setValue:@(1111111111111444) forKeyPath:@"kernelBootTimeNanoseconds"];
174+
[event.clockSnapshot setValue:@(1237567890) forKeyPath:@"uptimeNanoseconds"];
175175
event.qosTier = GDTCOREventQosDefault;
176176
NSURL *messageDataURL = [self writeConsistentMessageToDisk:@"message-39882816.dat"];
177177
GDTCCTEventGeneratorDataObject *dataObject = [[GDTCCTEventGeneratorDataObject alloc] init];
@@ -192,8 +192,8 @@ - (NSURL *)writeConsistentMessageToDisk:(NSString *)messageResource {
192192
event.clockSnapshot = [GDTCORClock snapshot];
193193
[event.clockSnapshot setValue:@(1111111111111) forKeyPath:@"timeMillis"];
194194
[event.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
195-
[event.clockSnapshot setValue:@(1111111111111555) forKeyPath:@"kernelBootTime"];
196-
[event.clockSnapshot setValue:@(1238567890) forKeyPath:@"uptime"];
195+
[event.clockSnapshot setValue:@(1111111111111555) forKeyPath:@"kernelBootTimeNanoseconds"];
196+
[event.clockSnapshot setValue:@(1238567890) forKeyPath:@"uptimeNanoseconds"];
197197
event.qosTier = GDTCOREventQosDefault;
198198
NSError *error;
199199
event.customBytes = [NSJSONSerialization dataWithJSONObject:@{@"customParam1" : @"aValue1"}
@@ -219,8 +219,8 @@ - (NSURL *)writeConsistentMessageToDisk:(NSString *)messageResource {
219219
event.clockSnapshot = [GDTCORClock snapshot];
220220
[event.clockSnapshot setValue:@(1111111111111) forKeyPath:@"timeMillis"];
221221
[event.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
222-
[event.clockSnapshot setValue:@(1111111111111666) forKeyPath:@"kernelBootTime"];
223-
[event.clockSnapshot setValue:@(1239567890) forKeyPath:@"uptime"];
222+
[event.clockSnapshot setValue:@(1111111111111666) forKeyPath:@"kernelBootTimeNanoseconds"];
223+
[event.clockSnapshot setValue:@(1239567890) forKeyPath:@"uptimeNanoseconds"];
224224
event.qosTier = GDTCOREventQoSTelemetry;
225225
NSError *error;
226226
event.customBytes = [NSJSONSerialization dataWithJSONObject:@{

GoogleDataTransport/GDTCORLibrary/GDTCORClock.m

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static int64_t KernelBootTimeInNanoseconds() {
5050
if (rc != 0) {
5151
return 0;
5252
}
53-
return (int64_t)boottime.tv_sec * NSEC_PER_MSEC + (int64_t)boottime.tv_usec;
53+
return (int64_t)boottime.tv_sec * NSEC_PER_SEC + (int64_t)boottime.tv_usec * NSEC_PER_USEC;
5454
}
5555

5656
/** Returns value of gettimeofday, in nanoseconds.
@@ -60,17 +60,18 @@ static int64_t KernelBootTimeInNanoseconds() {
6060
* @return The value of gettimeofday, in nanoseconds.
6161
*/
6262
static int64_t UptimeInNanoseconds() {
63-
int64_t before_now;
64-
int64_t after_now;
63+
int64_t before_now_nsec;
64+
int64_t after_now_nsec;
6565
struct timeval now;
6666

67-
before_now = KernelBootTimeInNanoseconds();
67+
before_now_nsec = KernelBootTimeInNanoseconds();
6868
// Addresses a race condition in which the system time has updated, but the boottime has not.
6969
do {
7070
gettimeofday(&now, NULL);
71-
after_now = KernelBootTimeInNanoseconds();
72-
} while (after_now != before_now);
73-
return (int64_t)now.tv_sec * NSEC_PER_MSEC + (int64_t)now.tv_usec - before_now;
71+
after_now_nsec = KernelBootTimeInNanoseconds();
72+
} while (after_now_nsec != before_now_nsec);
73+
return (int64_t)now.tv_sec * NSEC_PER_SEC + (int64_t)now.tv_usec * NSEC_PER_USEC -
74+
before_now_nsec;
7475
}
7576

7677
// TODO: Consider adding a 'trustedTime' property that can be populated by the response from a BE.
@@ -79,8 +80,8 @@ @implementation GDTCORClock
7980
- (instancetype)init {
8081
self = [super init];
8182
if (self) {
82-
_kernelBootTime = KernelBootTimeInNanoseconds();
83-
_uptime = UptimeInNanoseconds();
83+
_kernelBootTimeNanoseconds = KernelBootTimeInNanoseconds();
84+
_uptimeNanoseconds = UptimeInNanoseconds();
8485
_timeMillis =
8586
(int64_t)((CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970) * NSEC_PER_USEC);
8687
CFTimeZoneRef timeZoneRef = CFTimeZoneCopySystem();
@@ -102,21 +103,26 @@ + (instancetype)clockSnapshotInTheFuture:(uint64_t)millisInTheFuture {
102103

103104
- (BOOL)isAfter:(GDTCORClock *)otherClock {
104105
// These clocks are trivially comparable when they share a kernel boot time.
105-
if (_kernelBootTime == otherClock->_kernelBootTime) {
106+
if (_kernelBootTimeNanoseconds == otherClock->_kernelBootTimeNanoseconds) {
106107
int64_t timeDiff = (_timeMillis + _timezoneOffsetSeconds) -
107108
(otherClock->_timeMillis + otherClock->_timezoneOffsetSeconds);
108109
return timeDiff > 0;
109110
} else {
110-
int64_t kernelBootTimeDiff = otherClock->_kernelBootTime - _kernelBootTime;
111+
int64_t kernelBootTimeDiff =
112+
otherClock->_kernelBootTimeNanoseconds - _kernelBootTimeNanoseconds;
111113
// This isn't a great solution, but essentially, if the other clock's boot time is 'later', NO
112114
// is returned. This can be altered by changing the system time and rebooting.
113115
return kernelBootTimeDiff < 0 ? YES : NO;
114116
}
115117
}
116118

119+
- (int64_t)uptimeMilliseconds {
120+
return self.uptimeNanoseconds / NSEC_PER_MSEC;
121+
}
122+
117123
- (NSUInteger)hash {
118-
return [@(_kernelBootTime) hash] ^ [@(_uptime) hash] ^ [@(_timeMillis) hash] ^
119-
[@(_timezoneOffsetSeconds) hash];
124+
return [@(_kernelBootTimeNanoseconds) hash] ^ [@(_uptimeNanoseconds) hash] ^
125+
[@(_timeMillis) hash] ^ [@(_timezoneOffsetSeconds) hash];
120126
}
121127

122128
- (BOOL)isEqual:(id)object {
@@ -134,7 +140,7 @@ - (BOOL)isEqual:(id)object {
134140
/** NSKeyedCoder key for _kernelBootTime ivar. */
135141
static NSString *const kGDTCORClockKernelBootTime = @"GDTCORClockKernelBootTime";
136142

137-
/** NSKeyedCoder key for _uptime ivar. */
143+
/** NSKeyedCoder key for _uptimeNanoseconds ivar. */
138144
static NSString *const kGDTCORClockUptime = @"GDTCORClockUptime";
139145

140146
+ (BOOL)supportsSecureCoding {
@@ -144,21 +150,31 @@ + (BOOL)supportsSecureCoding {
144150
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
145151
self = [super init];
146152
if (self) {
147-
// TODO: If the kernelBootTime is more recent, we need to change the kernel boot time and
148-
// uptimeMillis ivars
153+
// TODO: If the kernelBootTimeNanoseconds is more recent, we need to change the kernel boot time
154+
// and uptimeMillis ivars
149155
_timeMillis = [aDecoder decodeInt64ForKey:kGDTCORClockTimeMillisKey];
150156
_timezoneOffsetSeconds = [aDecoder decodeInt64ForKey:kGDTCORClockTimezoneOffsetSeconds];
151-
_kernelBootTime = [aDecoder decodeInt64ForKey:kGDTCORClockKernelBootTime];
152-
_uptime = [aDecoder decodeInt64ForKey:kGDTCORClockUptime];
157+
_kernelBootTimeNanoseconds = [aDecoder decodeInt64ForKey:kGDTCORClockKernelBootTime];
158+
_uptimeNanoseconds = [aDecoder decodeInt64ForKey:kGDTCORClockUptime];
153159
}
154160
return self;
155161
}
156162

157163
- (void)encodeWithCoder:(NSCoder *)aCoder {
158164
[aCoder encodeInt64:_timeMillis forKey:kGDTCORClockTimeMillisKey];
159165
[aCoder encodeInt64:_timezoneOffsetSeconds forKey:kGDTCORClockTimezoneOffsetSeconds];
160-
[aCoder encodeInt64:_kernelBootTime forKey:kGDTCORClockKernelBootTime];
161-
[aCoder encodeInt64:_uptime forKey:kGDTCORClockUptime];
166+
[aCoder encodeInt64:_kernelBootTimeNanoseconds forKey:kGDTCORClockKernelBootTime];
167+
[aCoder encodeInt64:_uptimeNanoseconds forKey:kGDTCORClockUptime];
168+
}
169+
170+
#pragma mark - Deprecated properties
171+
172+
- (int64_t)kernelBootTime {
173+
return self.kernelBootTimeNanoseconds;
174+
}
175+
176+
- (int64_t)uptime {
177+
return self.uptimeNanoseconds;
162178
}
163179

164180
@end

GoogleDataTransport/GDTCORLibrary/Public/GDTCORClock.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,17 @@ NS_ASSUME_NONNULL_BEGIN
2727
/** The offset from UTC in seconds. */
2828
@property(nonatomic, readonly) int64_t timezoneOffsetSeconds;
2929

30-
/** The kernel boot time when this clock was created. */
31-
@property(nonatomic, readonly) int64_t kernelBootTime;
30+
/** The kernel boot time when this clock was created in nanoseconds. */
31+
@property(nonatomic, readonly) int64_t kernelBootTimeNanoseconds;
3232

33-
/** The device uptime when this clock was created. */
34-
@property(nonatomic, readonly) int64_t uptime;
33+
/** The device uptime when this clock was created in nanoseconds. */
34+
@property(nonatomic, readonly) int64_t uptimeNanoseconds;
35+
36+
@property(nonatomic, readonly) int64_t kernelBootTime DEPRECATED_MSG_ATTRIBUTE(
37+
"Please use `kernelBootTimeNanoseconds` instead");
38+
39+
@property(nonatomic, readonly)
40+
int64_t uptime DEPRECATED_MSG_ATTRIBUTE("Please use `uptimeNanoseconds` instead");
3541

3642
/** Creates a GDTCORClock object using the current time and offsets.
3743
*
@@ -52,6 +58,9 @@ NS_ASSUME_NONNULL_BEGIN
5258
*/
5359
- (BOOL)isAfter:(GDTCORClock *)otherClock;
5460

61+
/** Returns value of `uptime` property in milliseconds. */
62+
- (int64_t)uptimeMilliseconds;
63+
5564
@end
5665

5766
NS_ASSUME_NONNULL_END

GoogleDataTransport/GDTCORTests/Unit/GDTCORClockTest.m

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,36 @@ - (void)testIsAfter {
8181
XCTAssertFalse([clock2 isAfter:clock1]);
8282
}
8383

84+
- (void)testUptime {
85+
NSTimeInterval timeDiff = 1;
86+
GDTCORClock *clock1 = [GDTCORClock snapshot];
87+
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeDiff]];
88+
GDTCORClock *clock2 = [GDTCORClock snapshot];
89+
90+
XCTAssertGreaterThan(clock2.uptimeNanoseconds, clock1.uptimeNanoseconds);
91+
NSTimeInterval uptimeDiff =
92+
(clock2.uptimeNanoseconds - clock1.uptimeNanoseconds) / (double)NSEC_PER_SEC;
93+
NSTimeInterval accuracy = 0.1;
94+
95+
// Assert that uptime difference reflects the actually passed time.
96+
XCTAssertLessThanOrEqual(ABS(uptimeDiff - timeDiff), accuracy);
97+
}
98+
99+
- (void)testUptimeMilliseconds {
100+
NSTimeInterval timeDiff = 1;
101+
GDTCORClock *clock1 = [GDTCORClock snapshot];
102+
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeDiff]];
103+
GDTCORClock *clock2 = [GDTCORClock snapshot];
104+
105+
XCTAssertGreaterThan(clock2.uptimeNanoseconds, clock1.uptimeNanoseconds);
106+
107+
NSTimeInterval millisecondsPerSecond = 1000;
108+
NSTimeInterval uptimeDiff =
109+
([clock2 uptimeMilliseconds] - [clock1 uptimeMilliseconds]) / millisecondsPerSecond;
110+
NSTimeInterval accuracy = 0.1;
111+
112+
// Assert that uptime difference reflects the actually passed time.
113+
XCTAssertLessThanOrEqual(ABS(uptimeDiff - timeDiff), accuracy);
114+
}
115+
84116
@end

GoogleDataTransport/GDTCORTests/Unit/GDTCOREventTest.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ - (void)testIsEqualAndHash {
9393
event1.clockSnapshot = [GDTCORClock snapshot];
9494
[event1.clockSnapshot setValue:@(1553534573010) forKeyPath:@"timeMillis"];
9595
[event1.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
96-
[event1.clockSnapshot setValue:@(1552576634359451) forKeyPath:@"kernelBootTime"];
97-
[event1.clockSnapshot setValue:@(961141365197) forKeyPath:@"uptime"];
96+
[event1.clockSnapshot setValue:@(1552576634359451) forKeyPath:@"kernelBootTimeNanoseconds"];
97+
[event1.clockSnapshot setValue:@(961141365197) forKeyPath:@"uptimeNanoseconds"];
9898
event1.qosTier = GDTCOREventQosDefault;
9999
event1.dataObject = [[GDTCORDataObjectTesterSimple alloc] initWithString:@"someData"];
100100
NSError *error1;
@@ -108,8 +108,8 @@ - (void)testIsEqualAndHash {
108108
event2.clockSnapshot = [GDTCORClock snapshot];
109109
[event2.clockSnapshot setValue:@(1553534573010) forKeyPath:@"timeMillis"];
110110
[event2.clockSnapshot setValue:@(-25200) forKeyPath:@"timezoneOffsetSeconds"];
111-
[event2.clockSnapshot setValue:@(1552576634359451) forKeyPath:@"kernelBootTime"];
112-
[event2.clockSnapshot setValue:@(961141365197) forKeyPath:@"uptime"];
111+
[event2.clockSnapshot setValue:@(1552576634359451) forKeyPath:@"kernelBootTimeNanoseconds"];
112+
[event2.clockSnapshot setValue:@(961141365197) forKeyPath:@"uptimeNanoseconds"];
113113
event2.qosTier = GDTCOREventQosDefault;
114114
event2.dataObject = [[GDTCORDataObjectTesterSimple alloc] initWithString:@"someData"];
115115
NSError *error2;

0 commit comments

Comments
 (0)