1515@testable import FirebaseCoreInternal
1616import XCTest
1717
18+ /// Used to manipulate a date across multiple concurrent contexts for simulation purposes.
19+ final class AdjustableDate : @unchecked Sendable {
20+ var date : Date
21+ init ( date: Date ) {
22+ self . date = date
23+ }
24+ }
25+
1826class HeartbeatControllerTests : XCTestCase {
1927 // 2021-11-01 @ 00:00:00 (EST)
2028 let date = Date ( timeIntervalSince1970: 1_635_739_200 )
@@ -99,11 +107,11 @@ class HeartbeatControllerTests: XCTestCase {
99107
100108 func testLogAtEndOfTimePeriodAndAcceptAtStartOfNextOne( ) throws {
101109 // Given
102- var testDate = date
110+ let testDate = AdjustableDate ( date: date )
103111
104112 let controller = HeartbeatController (
105113 storage: HeartbeatStorageFake ( ) ,
106- dateProvider: { testDate }
114+ dateProvider: { testDate. date }
107115 )
108116
109117 assertHeartbeatControllerFlushesEmptyPayload ( controller)
@@ -113,12 +121,12 @@ class HeartbeatControllerTests: XCTestCase {
113121 controller. log ( " dummy_agent " )
114122
115123 // - Advance to 2021-11-01 @ 23:59:59 (EST)
116- testDate. addTimeInterval ( 60 * 60 * 24 - 1 )
124+ testDate. date . addTimeInterval ( 60 * 60 * 24 - 1 )
117125
118126 controller. log ( " dummy_agent " )
119127
120128 // - Advance to 2021-11-02 @ 00:00:00 (EST)
121- testDate. addTimeInterval ( 1 )
129+ testDate. date . addTimeInterval ( 1 )
122130
123131 controller. log ( " dummy_agent " )
124132
@@ -271,18 +279,18 @@ class HeartbeatControllerTests: XCTestCase {
271279 ) . date // 2021-11-02 @ 11 PM (Tokyo time zone)
272280 )
273281
274- var testDate = newYorkDate
282+ let testDate = AdjustableDate ( date : newYorkDate)
275283
276284 let heartbeatController = HeartbeatController (
277285 storage: HeartbeatStorageFake ( ) ,
278- dateProvider: { testDate }
286+ dateProvider: { testDate. date }
279287 )
280288
281289 // When
282290 heartbeatController. log ( " dummy_agent " )
283291
284292 // Device travels from NYC to Tokyo.
285- testDate = tokyoDate
293+ testDate. date = tokyoDate
286294
287295 heartbeatController. log ( " dummy_agent " )
288296
@@ -308,22 +316,22 @@ class HeartbeatControllerTests: XCTestCase {
308316
309317 func testLoggingDependsOnDateNotUserAgent( ) throws {
310318 // Given
311- var testDate = date
319+ let testDate = AdjustableDate ( date: date )
312320 let heartbeatController = HeartbeatController (
313321 storage: HeartbeatStorageFake ( ) ,
314- dateProvider: { testDate }
322+ dateProvider: { testDate. date }
315323 )
316324
317325 // When
318326 // - Day 1
319327 heartbeatController. log ( " dummy_agent " )
320328
321329 // - Day 2
322- testDate. addTimeInterval ( 60 * 60 * 24 )
330+ testDate. date . addTimeInterval ( 60 * 60 * 24 )
323331 heartbeatController. log ( " some_other_agent " )
324332
325333 // - Day 3
326- testDate. addTimeInterval ( 60 * 60 * 24 )
334+ testDate. date . addTimeInterval ( 60 * 60 * 24 )
327335 heartbeatController. log ( " dummy_agent " )
328336
329337 // Then
@@ -359,20 +367,20 @@ class HeartbeatControllerTests: XCTestCase {
359367 let todaysDate = date
360368 let tomorrowsDate = date. addingTimeInterval ( 60 * 60 * 24 )
361369
362- var testDate = yesterdaysDate
370+ let testDate = AdjustableDate ( date : yesterdaysDate)
363371
364372 let heartbeatController = HeartbeatController (
365373 storage: HeartbeatStorageFake ( ) ,
366- dateProvider: { testDate }
374+ dateProvider: { testDate. date }
367375 )
368376
369377 // When
370378 heartbeatController. log ( " yesterdays_dummy_agent " )
371- testDate = todaysDate
379+ testDate. date = todaysDate
372380 heartbeatController. log ( " todays_dummy_agent " )
373- testDate = tomorrowsDate
381+ testDate. date = tomorrowsDate
374382 heartbeatController. log ( " tomorrows_dummy_agent " )
375- testDate = todaysDate
383+ testDate. date = todaysDate
376384
377385 // Then
378386 let payload = heartbeatController. flushHeartbeatFromToday ( )
0 commit comments