Skip to content

Commit 82c6c55

Browse files
authored
[Swift 6] Add Swift 6 testing for CoreInternal (#14561)
1 parent c5686e1 commit 82c6c55

File tree

4 files changed

+86
-78
lines changed

4 files changed

+86
-78
lines changed

.github/workflows/core_internal.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,13 @@ jobs:
2121
build-env:
2222
- os: macos-14
2323
xcode: Xcode_15.2
24+
swift_version: 5.9
2425
- os: macos-15
2526
xcode: Xcode_16.2
27+
swift_version: 5.9
28+
- os: macos-15
29+
xcode: Xcode_16.2
30+
swift_version: 6.0
2631
runs-on: ${{ matrix.build-env.os }}
2732
steps:
2833
- uses: actions/checkout@v4
@@ -31,6 +36,8 @@ jobs:
3136
run: scripts/setup_bundler.sh
3237
- name: Xcode
3338
run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
39+
- name: Set Swift swift_version
40+
run: sed -i "" "s/s.swift_version[[:space:]]*=[[:space:]]*'5.9'/s.swift_version = '${{ matrix.build-env.swift_version }}'/" FirebaseCoreInternal.podspec
3441
- name: Build and test
3542
run: scripts/third_party/travis/retry.sh scripts/pod_lib_lint.rb FirebaseCoreInternal.podspec --platforms=${{ matrix.target }}
3643

@@ -99,6 +106,9 @@ jobs:
99106
run: scripts/setup_spm_tests.sh
100107
- name: Xcode
101108
run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
109+
- name: Install visionOS, if needed.
110+
if: matrix.target == 'visionOS'
111+
run: xcodebuild -downloadPlatform visionOS
102112
- name: FirebaseCoreInternalTests
103113
run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseCoreInternalTests ${{ matrix.target }} spm
104114

FirebaseCore/Internal/Tests/Integration/HeartbeatLoggingIntegrationTests.swift

Lines changed: 51 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
import XCTest
1717

1818
class HeartbeatLoggingIntegrationTests: XCTestCase {
19-
// 2021-11-01 @ 00:00:00 (EST)
20-
let date = Date(timeIntervalSince1970: 1_635_739_200)
21-
2219
override func setUpWithError() throws {
2320
try HeartbeatLoggingTestUtils.removeUnderlyingHeartbeatStorageContainers()
2421
}
@@ -52,7 +49,7 @@ class HeartbeatLoggingIntegrationTests: XCTestCase {
5249
)
5350
}
5451

55-
func testLogAndFlushAsync() throws {
52+
@MainActor func testLogAndFlushAsync() throws {
5653
// Given
5754
let heartbeatController = HeartbeatController(id: #function)
5855
let expectedDate = HeartbeatsPayload.dateFormatter.string(from: Date())
@@ -123,8 +120,9 @@ class HeartbeatLoggingIntegrationTests: XCTestCase {
123120

124121
func testMultipleControllersWithTheSameIDUseTheSameStorageInstance() throws {
125122
// Given
126-
let heartbeatController1 = HeartbeatController(id: #function, dateProvider: { self.date })
127-
let heartbeatController2 = HeartbeatController(id: #function, dateProvider: { self.date })
123+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
124+
let heartbeatController1 = HeartbeatController(id: #function, dateProvider: { date })
125+
let heartbeatController2 = HeartbeatController(id: #function, dateProvider: { date })
128126
// When
129127
heartbeatController1.log("dummy_agent")
130128
// Then
@@ -146,92 +144,85 @@ class HeartbeatLoggingIntegrationTests: XCTestCase {
146144
assertHeartbeatControllerFlushesEmptyPayload(heartbeatController1)
147145
}
148146

149-
func testLogAndFlushConcurrencyStressTest() throws {
147+
@MainActor func testLogAndFlushConcurrencyStressTest() throws {
150148
// Given
151-
let heartbeatController = HeartbeatController(id: #function, dateProvider: { self.date })
149+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
150+
let heartbeatController = HeartbeatController(id: #function, dateProvider: { date })
152151

153152
// When
154153
DispatchQueue.concurrentPerform(iterations: 100) { _ in
155154
heartbeatController.log("dummy_agent")
156155
}
157156

158-
var payloads: [HeartbeatsPayload] = []
157+
let expectation = self.expectation(description: #function)
159158

160159
DispatchQueue.concurrentPerform(iterations: 100) { _ in
161160
let payload = heartbeatController.flush()
162-
payloads.append(payload)
163-
}
164-
165-
// Then
166-
let nonEmptyPayloads = payloads.filter { payload in
167-
// Filter out non-empty payloads.
168-
!payload.userAgentPayloads.isEmpty
169-
}
170-
171-
XCTAssertEqual(nonEmptyPayloads.count, 1)
172-
173-
let payload = try XCTUnwrap(nonEmptyPayloads.first)
174-
try HeartbeatLoggingTestUtils.assertEqualPayloadStrings(
175-
payload.headerValue(),
176-
"""
177-
{
178-
"version": 2,
179-
"heartbeats": [
161+
if !payload.userAgentPayloads.isEmpty {
162+
try! HeartbeatLoggingTestUtils.assertEqualPayloadStrings(
163+
payload.headerValue(),
164+
"""
180165
{
181-
"agent": "dummy_agent",
182-
"dates": ["2021-11-01"]
166+
"version": 2,
167+
"heartbeats": [
168+
{
169+
"agent": "dummy_agent",
170+
"dates": ["2021-11-01"]
171+
}
172+
]
183173
}
184-
]
174+
"""
175+
)
176+
expectation.fulfill()
185177
}
186-
"""
187-
)
178+
}
179+
180+
// Then
181+
wait(for: [expectation])
188182
}
189183

190-
func testLogAndFlushHeartbeatFromTodayConcurrencyStressTest() throws {
184+
@MainActor func testLogAndFlushHeartbeatFromTodayConcurrencyStressTest() throws {
191185
// Given
192-
let heartbeatController = HeartbeatController(id: #function, dateProvider: { self.date })
186+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
187+
let heartbeatController = HeartbeatController(id: #function, dateProvider: { date })
193188

194189
// When
195190
DispatchQueue.concurrentPerform(iterations: 100) { _ in
196191
heartbeatController.log("dummy_agent")
197192
}
198193

199-
var payloads: [HeartbeatsPayload] = []
194+
let expectation = self.expectation(description: #function)
200195

201196
DispatchQueue.concurrentPerform(iterations: 100) { _ in
202197
let payload = heartbeatController.flushHeartbeatFromToday()
203-
payloads.append(payload)
204-
}
205-
206-
// Then
207-
let nonEmptyPayloads = payloads.filter { payload in
208-
// Filter out non-empty payloads.
209-
!payload.userAgentPayloads.isEmpty
210-
}
211-
212-
XCTAssertEqual(nonEmptyPayloads.count, 1)
213-
214-
let payload = try XCTUnwrap(nonEmptyPayloads.first)
215-
try HeartbeatLoggingTestUtils.assertEqualPayloadStrings(
216-
payload.headerValue(),
217-
"""
218-
{
219-
"version": 2,
220-
"heartbeats": [
198+
if !payload.userAgentPayloads.isEmpty {
199+
try! HeartbeatLoggingTestUtils.assertEqualPayloadStrings(
200+
payload.headerValue(),
201+
"""
221202
{
222-
"agent": "dummy_agent",
223-
"dates": ["2021-11-01"],
203+
"version": 2,
204+
"heartbeats": [
205+
{
206+
"agent": "dummy_agent",
207+
"dates": ["2021-11-01"],
208+
}
209+
]
224210
}
225-
]
211+
"""
212+
)
213+
expectation.fulfill()
226214
}
227-
"""
228-
)
215+
}
216+
217+
// Then
218+
wait(for: [expectation])
229219

230220
assertHeartbeatControllerFlushesEmptyPayload(heartbeatController)
231221
}
232222

233223
func testLogRepeatedly_WithoutFlushing_LimitsOnWrite() throws {
234224
// Given
225+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
235226
let testDate = AdjustableDate(date: date)
236227
let heartbeatController = HeartbeatController(id: #function, dateProvider: { testDate.date })
237228

@@ -313,7 +304,8 @@ class HeartbeatLoggingIntegrationTests: XCTestCase {
313304

314305
func testLogAndFlush_AfterUnderlyingStorageIsDeleted_CreatesNewStorage() throws {
315306
// Given
316-
let heartbeatController = HeartbeatController(id: #function, dateProvider: { self.date })
307+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
308+
let heartbeatController = HeartbeatController(id: #function, dateProvider: { date })
317309
heartbeatController.log("dummy_agent")
318310
_ = XCTWaiter.wait(for: [expectation(description: "Wait for async log.")], timeout: 0.1)
319311

FirebaseCore/Internal/Tests/Unit/HeartbeatControllerTests.swift

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
import XCTest
1717

1818
class HeartbeatControllerTests: XCTestCase {
19-
// 2021-11-01 @ 00:00:00 (EST)
20-
let date = Date(timeIntervalSince1970: 1_635_739_200)
21-
2219
func testFlush_WhenEmpty_ReturnsEmptyPayload() throws {
2320
// Given
2421
let controller = HeartbeatController(storage: HeartbeatStorageFake())
@@ -28,9 +25,10 @@ class HeartbeatControllerTests: XCTestCase {
2825

2926
func testLogAndFlush() throws {
3027
// Given
28+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
3129
let controller = HeartbeatController(
3230
storage: HeartbeatStorageFake(),
33-
dateProvider: { self.date }
31+
dateProvider: { date }
3432
)
3533

3634
assertHeartbeatControllerFlushesEmptyPayload(controller)
@@ -58,11 +56,12 @@ class HeartbeatControllerTests: XCTestCase {
5856
assertHeartbeatControllerFlushesEmptyPayload(controller)
5957
}
6058

61-
func testLogAndFlushAsync() throws {
59+
@MainActor func testLogAndFlushAsync() throws {
6260
// Given
61+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
6362
let controller = HeartbeatController(
6463
storage: HeartbeatStorageFake(),
65-
dateProvider: { self.date }
64+
dateProvider: { date }
6665
)
6766
let expectation = expectation(description: #function)
6867

@@ -99,6 +98,7 @@ class HeartbeatControllerTests: XCTestCase {
9998

10099
func testLogAtEndOfTimePeriodAndAcceptAtStartOfNextOne() throws {
101100
// Given
101+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
102102
let testDate = AdjustableDate(date: date)
103103

104104
let controller = HeartbeatController(
@@ -148,9 +148,10 @@ class HeartbeatControllerTests: XCTestCase {
148148

149149
func testDoNotLogMoreThanOnceInACalendarDay() throws {
150150
// Given
151+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
151152
let controller = HeartbeatController(
152153
storage: HeartbeatStorageFake(),
153-
dateProvider: { self.date }
154+
dateProvider: { date }
154155
)
155156

156157
// When
@@ -178,9 +179,10 @@ class HeartbeatControllerTests: XCTestCase {
178179

179180
func testDoNotLogMoreThanOnceInACalendarDay_AfterFlushing() throws {
180181
// Given
182+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
181183
let controller = HeartbeatController(
182184
storage: HeartbeatStorageFake(),
183-
dateProvider: { self.date }
185+
dateProvider: { date }
184186
)
185187

186188
// When
@@ -308,6 +310,7 @@ class HeartbeatControllerTests: XCTestCase {
308310

309311
func testLoggingDependsOnDateNotUserAgent() throws {
310312
// Given
313+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
311314
let testDate = AdjustableDate(date: date)
312315
let heartbeatController = HeartbeatController(
313316
storage: HeartbeatStorageFake(),
@@ -355,6 +358,7 @@ class HeartbeatControllerTests: XCTestCase {
355358

356359
func testFlushHeartbeatFromToday_WhenTodayHasAHeartbeat_ReturnsPayloadWithOnlyTodaysHeartbeat() throws {
357360
// Given
361+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
358362
let yesterdaysDate = date.addingTimeInterval(-1 * 60 * 60 * 24)
359363
let todaysDate = date
360364
let tomorrowsDate = date.addingTimeInterval(60 * 60 * 24)
@@ -416,7 +420,8 @@ class HeartbeatControllerTests: XCTestCase {
416420

417421
func testFlushHeartbeatFromToday_WhenTodayDoesNotHaveAHeartbeat_ReturnsEmptyPayload() throws {
418422
// Given
419-
let heartbeatController = HeartbeatController(id: #function, dateProvider: { self.date })
423+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
424+
let heartbeatController = HeartbeatController(id: #function, dateProvider: { date })
420425
// When
421426
heartbeatController.flushHeartbeatFromToday()
422427
// Then

FirebaseCore/Internal/Tests/Unit/HeartbeatStorageTests.swift

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616
import XCTest
1717

1818
extension HeartbeatsBundle {
19-
static let testHeartbeatBundle: Self = {
19+
static func testHeartbeatBundle() -> HeartbeatsBundle {
2020
var heartbeatBundle = HeartbeatsBundle(capacity: 1)
21-
heartbeatBundle.append(Heartbeat(agent: "dummy_agent", date: Date()))
21+
let date = Date(timeIntervalSince1970: 1_635_739_200) // 2021-11-01 @ 00:00:00 (EST)
22+
heartbeatBundle.append(Heartbeat(agent: "dummy_agent", date: date))
2223
return heartbeatBundle
23-
}()
24+
}
2425
}
2526

2627
class HeartbeatStorageTests: XCTestCase {
@@ -108,15 +109,15 @@ class HeartbeatStorageTests: XCTestCase {
108109
// Assert that heartbeat storage is empty.
109110
XCTAssertNil(heartbeatsBundle)
110111
// Write new value.
111-
return HeartbeatsBundle.testHeartbeatBundle
112+
return HeartbeatsBundle.testHeartbeatBundle()
112113
}
113114

114115
heartbeatStorage.readAndWriteAsync { heartbeatsBundle in
115116
expectation.fulfill()
116117
// Assert old value is read.
117118
XCTAssertEqual(
118119
heartbeatsBundle?.makeHeartbeatsPayload(),
119-
HeartbeatsBundle.testHeartbeatBundle.makeHeartbeatsPayload()
120+
HeartbeatsBundle.testHeartbeatBundle().makeHeartbeatsPayload()
120121
)
121122
// Write some new value.
122123
return heartbeatsBundle
@@ -158,18 +159,18 @@ class HeartbeatStorageTests: XCTestCase {
158159

159160
heartbeatStorage.readAndWriteAsync { heartbeatsBundle in
160161
expectation.fulfill()
161-
return HeartbeatsBundle.testHeartbeatBundle
162+
return HeartbeatsBundle.testHeartbeatBundle()
162163
}
163164

164165
// Then
165166
heartbeatStorage.readAndWriteAsync { heartbeatsBundle in
166167
expectation.fulfill()
167168
XCTAssertNotEqual(
168169
heartbeatsBundle?.makeHeartbeatsPayload(),
169-
HeartbeatsBundle.testHeartbeatBundle.makeHeartbeatsPayload(),
170+
HeartbeatsBundle.testHeartbeatBundle().makeHeartbeatsPayload(),
170171
"They should not be equal because the previous save failed."
171172
)
172-
return HeartbeatsBundle.testHeartbeatBundle
173+
return HeartbeatsBundle.testHeartbeatBundle()
173174
}
174175

175176
wait(for: [expectation], timeout: 0.5)
@@ -220,7 +221,7 @@ class HeartbeatStorageTests: XCTestCase {
220221
// Assert that heartbeat storage is empty.
221222
XCTAssertNil(heartbeatsBundle)
222223
// Write new value.
223-
return HeartbeatsBundle.testHeartbeatBundle
224+
return HeartbeatsBundle.testHeartbeatBundle()
224225
} completion: { result in
225226
switch result {
226227
case .success: break
@@ -236,7 +237,7 @@ class HeartbeatStorageTests: XCTestCase {
236237
// Assert old value is read.
237238
XCTAssertEqual(
238239
heartbeatsBundle?.makeHeartbeatsPayload(),
239-
HeartbeatsBundle.testHeartbeatBundle.makeHeartbeatsPayload()
240+
HeartbeatsBundle.testHeartbeatBundle().makeHeartbeatsPayload()
240241
)
241242
// Write some new value.
242243
expectation2.fulfill()

0 commit comments

Comments
 (0)