From ce97c7e6b838e83aa72f17c334d1dc95f2edaf89 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Tue, 8 Nov 2022 11:01:35 +0100 Subject: [PATCH 01/10] fix: Too long flush duration Move calculation of the flush dispatch time to the beginning of the flush function to avoid any code until the call to dispatch_group_wait adds up to the total flush duration. Fixes GH-2334, GH-2340 --- .github/workflows/test.yml | 4 ++++ CHANGELOG.md | 1 + .../xcshareddata/xcschemes/Sentry.xcscheme | 3 --- Sources/Sentry/SentryHttpTransport.m | 9 ++++++--- .../Networking/SentryHttpTransportTests.swift | 13 +++++++------ 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d4f23a1114b..59d3d6045f9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,6 +59,10 @@ jobs: strategy: fail-fast: false matrix: + # Dummy matrix for testing. + # TODO: Remove before merging + a: [1,2,3,4,5,6,7,8,9,10] + # Can't run tests on watchOS because XCTest is not available # We can't use Xcode 11.7 as we use XCTestObservation. When building with Xcode 11.7 # we get the error 'XCTest/XCTest.h' not found. Setting ENABLE_TESTING_SEARCH_PATH=YES diff --git a/CHANGELOG.md b/CHANGELOG.md index 44bff4d10aa..bf5f09a5202 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixes +- Too long flush duration (#2370) - Fix issue with invalid profiles uploading (#2358 and #2359) ## 7.30.0 diff --git a/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme b/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme index 705369bf13b..e664167a2fe 100644 --- a/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme +++ b/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme @@ -64,9 +64,6 @@ - - diff --git a/Sources/Sentry/SentryHttpTransport.m b/Sources/Sentry/SentryHttpTransport.m index 902acbf32af..5f013f397b1 100644 --- a/Sources/Sentry/SentryHttpTransport.m +++ b/Sources/Sentry/SentryHttpTransport.m @@ -151,6 +151,12 @@ - (void)recordLostEvent:(SentryDataCategory)category reason:(SentryDiscardReason - (BOOL)flush:(NSTimeInterval)timeout { + // Calculate the dispatch time of the flush duration as early as possible to guarantee an exact + // flush duration. Any code up to the dispatch_group_wait can take a couple of ms, adding up to + // the flush duration. + dispatch_time_t delta = (int64_t)(timeout * (NSTimeInterval)NSEC_PER_SEC); + dispatch_time_t dispatchTimeout = dispatch_time(DISPATCH_TIME_NOW, delta); + // Double-Checked Locking to avoid acquiring unnecessary locks. if (_isFlushing) { SENTRY_LOG_DEBUG(@"Already flushing."); @@ -171,9 +177,6 @@ - (BOOL)flush:(NSTimeInterval)timeout [self sendAllCachedEnvelopes]; - dispatch_time_t delta = (int64_t)(timeout * (NSTimeInterval)NSEC_PER_SEC); - dispatch_time_t dispatchTimeout = dispatch_time(DISPATCH_TIME_NOW, delta); - intptr_t result = dispatch_group_wait(self.dispatchGroup, dispatchTimeout); @synchronized(self) { diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index e35c77aa4c3..42ef076e0a8 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -631,7 +631,7 @@ class SentryHttpTransportTests: XCTestCase { func testFlush_BlocksCallingThread_TimesOut() { CurrentDate.setCurrentDateProvider(DefaultCurrentDateProvider.sharedInstance()) - givenCachedEvents() + givenCachedEvents(amount: 30) fixture.requestManager.responseDelay = fixture.flushTimeout + 0.2 @@ -640,7 +640,7 @@ class SentryHttpTransportTests: XCTestCase { let blockingDuration = getDurationNs(beforeFlush, getAbsoluteTime()).toTimeInterval() XCTAssertGreaterThan(blockingDuration, fixture.flushTimeout) - XCTAssertLessThan(blockingDuration, fixture.flushTimeout + 0.2) + XCTAssertLessThan(blockingDuration, fixture.flushTimeout + 0.1) XCTAssertFalse(success, "Flush should time out.") } @@ -681,7 +681,7 @@ class SentryHttpTransportTests: XCTestCase { assertFlushBlocksAndFinishesSuccessfully() } - func testFlush_CalledMultipleTimes_ImmediatelyReturnsFalse_disabled() { + func testFlush_CalledMultipleTimes_ImmediatelyReturnsFalse() { CurrentDate.setCurrentDateProvider(DefaultCurrentDateProvider.sharedInstance()) givenCachedEvents() @@ -771,11 +771,12 @@ class SentryHttpTransportTests: XCTestCase { fixture.requestManager.returnResponse(response: HTTPURLResponse()) } - private func givenCachedEvents() { + private func givenCachedEvents(amount: Int = 2) { givenNoInternetConnection() - sendEvent() - sendEvent() + for _ in 0.. Date: Tue, 8 Nov 2022 11:08:23 +0100 Subject: [PATCH 02/10] enable one more test --- Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme | 3 --- Tests/SentryTests/Networking/SentryHttpTransportTests.swift | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme b/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme index e664167a2fe..c5b4784e7af 100644 --- a/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme +++ b/Sentry.xcodeproj/xcshareddata/xcschemes/Sentry.xcscheme @@ -64,9 +64,6 @@ - - diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index 42ef076e0a8..716a352cb43 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -653,7 +653,7 @@ class SentryHttpTransportTests: XCTestCase { assertFlushBlocksAndFinishesSuccessfully() } - func testFlush_CalledSequentially_BlocksTwice_disabled() { + func testFlush_CalledSequentially_BlocksTwice() { CurrentDate.setCurrentDateProvider(DefaultCurrentDateProvider.sharedInstance()) givenCachedEvents() From 82d69ea3f88f64972f626d97534c7363e8976073 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Tue, 8 Nov 2022 11:12:16 +0100 Subject: [PATCH 03/10] Update dummy matrix --- .github/workflows/test.yml | 141 +++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 68 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 59d3d6045f9..6431b2b1017 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -61,74 +61,79 @@ jobs: matrix: # Dummy matrix for testing. # TODO: Remove before merging - a: [1,2,3,4,5,6,7,8,9,10] - - # Can't run tests on watchOS because XCTest is not available - # We can't use Xcode 11.7 as we use XCTestObservation. When building with Xcode 11.7 - # we get the error 'XCTest/XCTest.h' not found. Setting ENABLE_TESTING_SEARCH_PATH=YES - # doesn't work. - include: - # iOS 12.4 - - runs-on: macos-11 - platform: 'iOS' - xcode: '13.2.1' - test-destination-os: '12.4' - - # iOS 13.7 - - runs-on: macos-11 - platform: 'iOS' - xcode: '13.2.1' - test-destination-os: '13.7' - - # iOS 14 - - runs-on: macos-11 - platform: 'iOS' - xcode: '12.5.1' - test-destination-os: 'latest' - - # iOS 15 - - runs-on: macos-12 - platform: 'iOS' - xcode: '13.4.1' - test-destination-os: 'latest' - - # iOS 16 - - runs-on: macos-12 - platform: 'iOS' - xcode: '14.0' - test-destination-os: 'latest' - - # macOS 11 - - runs-on: macos-11 - platform: 'macOS' - xcode: '12.5.1' - test-destination-os: 'latest' - - # macOS 12 - - runs-on: macos-12 - platform: 'macOS' - xcode: '13.4.1' - test-destination-os: 'latest' - - # Catalyst. We only test the latest version, as - # the risk something breaking on Catalyst and not - # on an older iOS or macOS version is low. - - runs-on: macos-12 - platform: 'Catalyst' - xcode: '13.4.1' - test-destination-os: 'latest' - - # tvOS 14 - - runs-on: macos-11 - platform: 'tvOS' - xcode: '12.5.1' - test-destination-os: 'latest' - - # tvOS 15 - - runs-on: macos-12 - platform: 'tvOS' - xcode: '13.4.1' - test-destination-os: 'latest' + a: [1,2,3,4] + b: [1,2,3,4] + runs-on: ['macos-12'] + platform: ['iOS'] + xcode: ['14.0', '13.4.1'] + test-destination-os: ['latest'] + + # # Can't run tests on watchOS because XCTest is not available + # # We can't use Xcode 11.7 as we use XCTestObservation. When building with Xcode 11.7 + # # we get the error 'XCTest/XCTest.h' not found. Setting ENABLE_TESTING_SEARCH_PATH=YES + # # doesn't work. + # include: + # # iOS 12.4 + # - runs-on: macos-11 + # platform: 'iOS' + # xcode: '13.2.1' + # test-destination-os: '12.4' + + # # iOS 13.7 + # - runs-on: macos-11 + # platform: 'iOS' + # xcode: '13.2.1' + # test-destination-os: '13.7' + + # # iOS 14 + # - runs-on: macos-11 + # platform: 'iOS' + # xcode: '12.5.1' + # test-destination-os: 'latest' + + # # iOS 15 + # - runs-on: macos-12 + # platform: 'iOS' + # xcode: '13.4.1' + # test-destination-os: 'latest' + + # # iOS 16 + # - runs-on: macos-12 + # platform: 'iOS' + # xcode: '14.0' + # test-destination-os: 'latest' + + # # macOS 11 + # - runs-on: macos-11 + # platform: 'macOS' + # xcode: '12.5.1' + # test-destination-os: 'latest' + + # # macOS 12 + # - runs-on: macos-12 + # platform: 'macOS' + # xcode: '13.4.1' + # test-destination-os: 'latest' + + # # Catalyst. We only test the latest version, as + # # the risk something breaking on Catalyst and not + # # on an older iOS or macOS version is low. + # - runs-on: macos-12 + # platform: 'Catalyst' + # xcode: '13.4.1' + # test-destination-os: 'latest' + + # # tvOS 14 + # - runs-on: macos-11 + # platform: 'tvOS' + # xcode: '12.5.1' + # test-destination-os: 'latest' + + # # tvOS 15 + # - runs-on: macos-12 + # platform: 'tvOS' + # xcode: '13.4.1' + # test-destination-os: 'latest' steps: - uses: actions/checkout@v3 From b638f5afb02a20b25a5d43f8d3d1091f213ee806 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Tue, 8 Nov 2022 11:45:40 +0100 Subject: [PATCH 04/10] Fix testFlush_BlocksCallingThread_FinishesFlushingWhenSent --- .../SentryTests/Networking/SentryHttpTransportTests.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index 716a352cb43..8b486510769 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -648,9 +648,12 @@ class SentryHttpTransportTests: XCTestCase { func testFlush_BlocksCallingThread_FinishesFlushingWhenSent() { CurrentDate.setCurrentDateProvider(DefaultCurrentDateProvider.sharedInstance()) - givenCachedEvents() + givenCachedEvents(amount: 1) - assertFlushBlocksAndFinishesSuccessfully() + let beforeFlush = getAbsoluteTime() + XCTAssertTrue(sut.flush(fixture.flushTimeout), "Flush should not time out.") + let blockingDuration = getDurationNs(beforeFlush, getAbsoluteTime()).toTimeInterval() + XCTAssertLessThan(blockingDuration, fixture.flushTimeout) } func testFlush_CalledSequentially_BlocksTwice() { From 7ec83cc9cc61a226e0db0d4361c370c1210ca485 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Thu, 10 Nov 2022 10:32:11 +0100 Subject: [PATCH 05/10] Fix changelog --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b59e28ffd4d..f3559eac8a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,15 @@ # Changelog -## 7.30.2 +## Unreleased ### Fixes - Too long flush duration (#2370) + +## 7.30.2 + +### Fixes + - Fix issue with invalid profiles uploading (#2358 and #2359) - Call UIDevice methods on the main thread (#2369) - Avoid sending profiles with 0 samples or incorrectly deduplicated backtrace elements (#2375) From 6064a1cdba1c882088068f5463c0ae18dd84ec27 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Thu, 10 Nov 2022 10:43:34 +0100 Subject: [PATCH 06/10] Fix testFlush_CalledMultipleTimes_ImmediatelyReturnsFalse --- Tests/SentryTests/Networking/SentryHttpTransportTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index 823f9fcb3c5..00051620fdc 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -685,7 +685,7 @@ class SentryHttpTransportTests: XCTestCase { func testFlush_CalledMultipleTimes_ImmediatelyReturnsFalse() { CurrentDate.setCurrentDateProvider(DefaultCurrentDateProvider.sharedInstance()) - givenCachedEvents() + givenCachedEvents(amount: 30) fixture.requestManager.responseDelay = fixture.flushTimeout * 2 let allFlushCallsGroup = DispatchGroup() From 5d67d64d505da4ff39c18b8f40280ec308ef0703 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Thu, 10 Nov 2022 11:18:40 +0100 Subject: [PATCH 07/10] Fix testFlush_CalledSequentially_BlocksTwice --- Tests/SentryTests/Networking/SentryHttpTransportTests.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index 00051620fdc..d6844e47ee1 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -664,7 +664,8 @@ class SentryHttpTransportTests: XCTestCase { XCTAssertTrue(sut.flush(fixture.flushTimeout), "Flush should not time out.") let blockingDuration = getDurationNs(beforeFlush, getAbsoluteTime()).toTimeInterval() - XCTAssertLessThan(blockingDuration, 0.1) + XCTAssertLessThan(blockingDuration, fixture.flushTimeout * 2, + "The blocking duration must not exceed the sum of the maximum flush duration.") } func testFlush_WhenNoEnvelopes_BlocksAndFinishes() { @@ -719,8 +720,7 @@ class SentryHttpTransportTests: XCTestCase { // double-checked lock, should return immediately. let initiallyInactiveQueue = fixture.queue - let count = 100 - for _ in 0.. Date: Thu, 10 Nov 2022 12:35:34 +0100 Subject: [PATCH 08/10] Another fix --- .../Networking/SentryHttpTransportTests.swift | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index d6844e47ee1..51deeed3b55 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -720,15 +720,17 @@ class SentryHttpTransportTests: XCTestCase { // double-checked lock, should return immediately. let initiallyInactiveQueue = fixture.queue - for _ in 0..<10 { + for _ in 0..<2 { allFlushCallsGroup.enter() initiallyInactiveQueue.async { - let beforeFlush = getAbsoluteTime() - let result = self.sut.flush(self.fixture.flushTimeout) - let blockingDuration = getDurationNs(beforeFlush, getAbsoluteTime()).toTimeInterval() - - XCTAssertGreaterThan(0.1, blockingDuration, "The flush call should have returned immediately.") - XCTAssertFalse(result) + for _ in 0..<10 { + let beforeFlush = getAbsoluteTime() + let result = self.sut.flush(self.fixture.flushTimeout) + let blockingDuration = getDurationNs(beforeFlush, getAbsoluteTime()).toTimeInterval() + + XCTAssertGreaterThan(0.1, blockingDuration, "The flush call should have returned immediately.") + XCTAssertFalse(result) + } allFlushCallsGroup.leave() } From a91442d6837b19a7a87b3ea9e493d23135cb2bea Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Thu, 10 Nov 2022 13:38:12 +0100 Subject: [PATCH 09/10] Another fix --- Tests/SentryTests/Networking/SentryHttpTransportTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift index 51deeed3b55..9f6f59799bc 100644 --- a/Tests/SentryTests/Networking/SentryHttpTransportTests.swift +++ b/Tests/SentryTests/Networking/SentryHttpTransportTests.swift @@ -664,7 +664,7 @@ class SentryHttpTransportTests: XCTestCase { XCTAssertTrue(sut.flush(fixture.flushTimeout), "Flush should not time out.") let blockingDuration = getDurationNs(beforeFlush, getAbsoluteTime()).toTimeInterval() - XCTAssertLessThan(blockingDuration, fixture.flushTimeout * 2, + XCTAssertLessThan(blockingDuration, fixture.flushTimeout * 2.2, "The blocking duration must not exceed the sum of the maximum flush duration.") } From bb8bfe06ea127be23179311d66de85429e8cdb78 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Thu, 10 Nov 2022 14:20:22 +0100 Subject: [PATCH 10/10] Undo dummy matrix --- .github/workflows/test.yml | 141 +++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 75 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6431b2b1017..d4f23a1114b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,81 +59,72 @@ jobs: strategy: fail-fast: false matrix: - # Dummy matrix for testing. - # TODO: Remove before merging - a: [1,2,3,4] - b: [1,2,3,4] - runs-on: ['macos-12'] - platform: ['iOS'] - xcode: ['14.0', '13.4.1'] - test-destination-os: ['latest'] - - # # Can't run tests on watchOS because XCTest is not available - # # We can't use Xcode 11.7 as we use XCTestObservation. When building with Xcode 11.7 - # # we get the error 'XCTest/XCTest.h' not found. Setting ENABLE_TESTING_SEARCH_PATH=YES - # # doesn't work. - # include: - # # iOS 12.4 - # - runs-on: macos-11 - # platform: 'iOS' - # xcode: '13.2.1' - # test-destination-os: '12.4' - - # # iOS 13.7 - # - runs-on: macos-11 - # platform: 'iOS' - # xcode: '13.2.1' - # test-destination-os: '13.7' - - # # iOS 14 - # - runs-on: macos-11 - # platform: 'iOS' - # xcode: '12.5.1' - # test-destination-os: 'latest' - - # # iOS 15 - # - runs-on: macos-12 - # platform: 'iOS' - # xcode: '13.4.1' - # test-destination-os: 'latest' - - # # iOS 16 - # - runs-on: macos-12 - # platform: 'iOS' - # xcode: '14.0' - # test-destination-os: 'latest' - - # # macOS 11 - # - runs-on: macos-11 - # platform: 'macOS' - # xcode: '12.5.1' - # test-destination-os: 'latest' - - # # macOS 12 - # - runs-on: macos-12 - # platform: 'macOS' - # xcode: '13.4.1' - # test-destination-os: 'latest' - - # # Catalyst. We only test the latest version, as - # # the risk something breaking on Catalyst and not - # # on an older iOS or macOS version is low. - # - runs-on: macos-12 - # platform: 'Catalyst' - # xcode: '13.4.1' - # test-destination-os: 'latest' - - # # tvOS 14 - # - runs-on: macos-11 - # platform: 'tvOS' - # xcode: '12.5.1' - # test-destination-os: 'latest' - - # # tvOS 15 - # - runs-on: macos-12 - # platform: 'tvOS' - # xcode: '13.4.1' - # test-destination-os: 'latest' + # Can't run tests on watchOS because XCTest is not available + # We can't use Xcode 11.7 as we use XCTestObservation. When building with Xcode 11.7 + # we get the error 'XCTest/XCTest.h' not found. Setting ENABLE_TESTING_SEARCH_PATH=YES + # doesn't work. + include: + # iOS 12.4 + - runs-on: macos-11 + platform: 'iOS' + xcode: '13.2.1' + test-destination-os: '12.4' + + # iOS 13.7 + - runs-on: macos-11 + platform: 'iOS' + xcode: '13.2.1' + test-destination-os: '13.7' + + # iOS 14 + - runs-on: macos-11 + platform: 'iOS' + xcode: '12.5.1' + test-destination-os: 'latest' + + # iOS 15 + - runs-on: macos-12 + platform: 'iOS' + xcode: '13.4.1' + test-destination-os: 'latest' + + # iOS 16 + - runs-on: macos-12 + platform: 'iOS' + xcode: '14.0' + test-destination-os: 'latest' + + # macOS 11 + - runs-on: macos-11 + platform: 'macOS' + xcode: '12.5.1' + test-destination-os: 'latest' + + # macOS 12 + - runs-on: macos-12 + platform: 'macOS' + xcode: '13.4.1' + test-destination-os: 'latest' + + # Catalyst. We only test the latest version, as + # the risk something breaking on Catalyst and not + # on an older iOS or macOS version is low. + - runs-on: macos-12 + platform: 'Catalyst' + xcode: '13.4.1' + test-destination-os: 'latest' + + # tvOS 14 + - runs-on: macos-11 + platform: 'tvOS' + xcode: '12.5.1' + test-destination-os: 'latest' + + # tvOS 15 + - runs-on: macos-12 + platform: 'tvOS' + xcode: '13.4.1' + test-destination-os: 'latest' steps: - uses: actions/checkout@v3