Fix push-related registration test flakiness

This commit is contained in:
Max Radermacher 2025-07-29 09:33:26 -05:00 committed by GitHub
parent 53f4db4f27
commit 9261ef89e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 63 deletions

View File

@ -651,7 +651,7 @@ public class RegistrationCoordinatorTest {
// Then when it gets back the session, it should immediately ask for a verification code to be sent.
// We'll ask for a push challenge, though we don't need to resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({ "PUSH TOKEN" })
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({ "PUSH TOKEN" })
// Resolve with an updated session.
sessionManager.addRequestCodeResponseMock(.success(stubs.session(nextVerificationAttempt: 0)))
@ -757,7 +757,7 @@ public class RegistrationCoordinatorTest {
// Once the second request fails, it should try an start a session.
// We'll ask for a push challenge, though we don't need to resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -1058,7 +1058,7 @@ public class RegistrationCoordinatorTest {
// Once the first request fails, it should try an start a session.
// We'll ask for a push challenge, though we don't need to resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -1422,7 +1422,7 @@ public class RegistrationCoordinatorTest {
mockURLSession.addResponse(failResponse)
mockURLSession.addResponse(failResponse)
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -1699,7 +1699,7 @@ public class RegistrationCoordinatorTest {
// Once the first request fails, it should try an start a session.
// We'll ask for a push challenge, though we don't need to resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -1768,7 +1768,7 @@ public class RegistrationCoordinatorTest {
// Once the first request fails, it should try an start a session.
// We'll ask for a push challenge, though we don't need to resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2145,7 +2145,7 @@ public class RegistrationCoordinatorTest {
await setUpSessionPath(coordinator: coordinator, mode: mode)
// We'll ask for a push challenge, though we won't resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2190,7 +2190,7 @@ public class RegistrationCoordinatorTest {
let changedE164 = E164("+17875550101")!
// We'll ask for a push challenge, though we won't resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2211,7 +2211,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// We'll ask for a push challenge, though we won't resolve it in this test.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2330,11 +2330,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Prepare to provide the challenge token.
let (challengeTokenPromise, challengeTokenFuture) = Guarantee<String>.pending()
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
return await challengeTokenPromise.awaitable()
})
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({ "a pre-auth challenge token" })
// Give back a session with a push challenge.
sessionManager.addBeginSessionResponseMock(.success(stubs.session(
@ -2355,14 +2351,6 @@ public class RegistrationCoordinatorTest {
// Give the push challenge token. Also prepare to handle its usage, and the
// resulting request for another SMS code.
Task {
// TODO: Need coordnator to be able to run async/disconnected whilw
// setting up and fulfilling the challenge
// Not sure a Task is the best way to get this, but works for now while we
// have promises doing timeouts internal to RegCoordinator
challengeTokenFuture.resolve("a pre-auth challenge token")
}
// Give it a phone number, which should cause it to start a session.
_ = await coordinator.submitE164(Stubs.e164).awaitable()
@ -2396,18 +2384,10 @@ public class RegistrationCoordinatorTest {
// Prepare to provide the challenge token.
let (challengeTokenPromise, _) = Guarantee<String>.pending()
var receivePreAuthChallengeTokenCount = 0
let receivePreAuthChallengeTokenCount = AtomicUInt(lock: .init())
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock {
receivePreAuthChallengeTokenCount += 1
return await challengeTokenPromise.awaitable()
}
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock {
receivePreAuthChallengeTokenCount += 1
return await challengeTokenPromise.awaitable()
}
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock {
receivePreAuthChallengeTokenCount += 1
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock {
receivePreAuthChallengeTokenCount.increment()
return await challengeTokenPromise.awaitable()
}
@ -2427,7 +2407,7 @@ public class RegistrationCoordinatorTest {
// One time to set up, one time for the min wait time, one time
// for the full timeout.
#expect(receivePreAuthChallengeTokenCount == 3)
#expect(receivePreAuthChallengeTokenCount.get() == 3)
}
@MainActor @Test(arguments: Self.testCases())
@ -2449,17 +2429,9 @@ public class RegistrationCoordinatorTest {
// We'll never provide a challenge token and will just leave it around forever.
let (challengeTokenPromise, _) = Guarantee<String>.pending()
var receivePreAuthChallengeTokenCount = 0
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
receivePreAuthChallengeTokenCount += 1
return await challengeTokenPromise.awaitable()
})
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
receivePreAuthChallengeTokenCount += 1
return await challengeTokenPromise.awaitable()
})
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
receivePreAuthChallengeTokenCount += 1
let receivePreAuthChallengeTokenCount = AtomicUInt(lock: .init())
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
receivePreAuthChallengeTokenCount.increment()
return await challengeTokenPromise.awaitable()
})
@ -2478,7 +2450,7 @@ public class RegistrationCoordinatorTest {
// One time to set up, one time for the min wait time, one time
// for the full timeout.
#expect(receivePreAuthChallengeTokenCount == 3)
#expect(receivePreAuthChallengeTokenCount.get() == 3)
}
@MainActor @Test(arguments: Self.testCases())
@ -2489,7 +2461,7 @@ public class RegistrationCoordinatorTest {
// Set profile info so we skip those steps.
setupDefaultAccountAttributes()
pushRegistrationManagerMock.addRequestPushTokenMock({ .pushUnsupported(description: "") })
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2528,7 +2500,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Be ready to provide the push challenge token as soon as it's needed.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({ "a pre-auth challenge token" })
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({ "a pre-auth challenge token" })
// Give back a session with multiple challenges.
sessionManager.addBeginSessionResponseMock(.success(stubs.session(
@ -2562,7 +2534,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Prepare to provide the challenge token.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2595,8 +2567,7 @@ public class RegistrationCoordinatorTest {
// Prepare to provide the challenge token.
let (challengeTokenPromise, challengeTokenFuture) = Guarantee<String>.pending()
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({ await challengeTokenPromise.awaitable() })
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({ await challengeTokenPromise.awaitable() })
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({ await challengeTokenPromise.awaitable() })
// Give back a session with multiple challenges.
sessionManager.addBeginSessionResponseMock(.success(stubs.session(
@ -2638,7 +2609,7 @@ public class RegistrationCoordinatorTest {
setupDefaultAccountAttributes()
pushRegistrationManagerMock.addRequestPushTokenMock({ .pushUnsupported(description: "") })
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -2851,11 +2822,6 @@ public class RegistrationCoordinatorTest {
// Once we get that session, we should try and send a verification code.
// Have that ready to go.
// We'll ask for a push challenge, though we won't resolve it.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
// Resolve with a session
sessionManager.addRequestCodeResponseMock(.success(stubs.session(
@ -3303,7 +3269,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})
@ -3326,7 +3292,7 @@ public class RegistrationCoordinatorTest {
// Give it a phone number, which should cause it to start a session.
// We'll ask for a push challenge, though we won't resolve it.
pushRegistrationManagerMock.addReceivePreAuthChallengeTokenMock({
pushRegistrationManagerMock.setReceivePreAuthChallengeTokenMock({
try! await Task.sleep(nanoseconds: TimeInterval.infinity.clampedNanoseconds)
fatalError()
})

View File

@ -281,12 +281,12 @@ public class _RegistrationCoordinator_PushRegistrationManagerMock: _Registration
}
public typealias ReceivePreAuthChallengeTokenMock = (() async -> String)
private var receivePreAuthChallengeTokenMocks = [ReceivePreAuthChallengeTokenMock]()
public func addReceivePreAuthChallengeTokenMock(_ mock: @escaping ReceivePreAuthChallengeTokenMock) {
receivePreAuthChallengeTokenMocks.append(mock)
private var receivePreAuthChallengeTokenMock: ReceivePreAuthChallengeTokenMock!
public func setReceivePreAuthChallengeTokenMock(_ mock: @escaping ReceivePreAuthChallengeTokenMock) {
receivePreAuthChallengeTokenMock = mock
}
public func receivePreAuthChallengeToken() async -> String {
return await receivePreAuthChallengeTokenMocks.removeFirst()()
return await receivePreAuthChallengeTokenMock()
}
public var didClearPreAuthChallengeToken = false