test: share timeout failover assertions

This commit is contained in:
Peter Steinberger 2026-03-14 02:27:34 +00:00
parent dfcc2fae9f
commit 0e6f150c3b
1 changed files with 16 additions and 28 deletions

View File

@ -55,6 +55,14 @@ function expectMessageMatches(
} }
} }
function expectTimeoutFailoverSamples(samples: readonly string[]) {
for (const sample of samples) {
expect(isTimeoutErrorMessage(sample)).toBe(true);
expect(classifyFailoverReason(sample)).toBe("timeout");
expect(isFailoverErrorMessage(sample)).toBe(true);
}
}
describe("isAuthPermanentErrorMessage", () => { describe("isAuthPermanentErrorMessage", () => {
it.each([ it.each([
{ {
@ -567,36 +575,26 @@ describe("isFailoverErrorMessage", () => {
}); });
it("matches abort stop-reason timeout variants", () => { it("matches abort stop-reason timeout variants", () => {
const samples = [ expectTimeoutFailoverSamples([
"Unhandled stop reason: abort", "Unhandled stop reason: abort",
"Unhandled stop reason: error", "Unhandled stop reason: error",
"stop reason: abort", "stop reason: abort",
"stop reason: error", "stop reason: error",
"reason: abort", "reason: abort",
"reason: error", "reason: error",
]; ]);
for (const sample of samples) {
expect(isTimeoutErrorMessage(sample)).toBe(true);
expect(classifyFailoverReason(sample)).toBe("timeout");
expect(isFailoverErrorMessage(sample)).toBe(true);
}
}); });
it("matches Gemini MALFORMED_RESPONSE stop reason as timeout (#42149)", () => { it("matches Gemini MALFORMED_RESPONSE stop reason as timeout (#42149)", () => {
const samples = [ expectTimeoutFailoverSamples([
"Unhandled stop reason: MALFORMED_RESPONSE", "Unhandled stop reason: MALFORMED_RESPONSE",
"Unhandled stop reason: malformed_response", "Unhandled stop reason: malformed_response",
"stop reason: MALFORMED_RESPONSE", "stop reason: MALFORMED_RESPONSE",
]; ]);
for (const sample of samples) {
expect(isTimeoutErrorMessage(sample)).toBe(true);
expect(classifyFailoverReason(sample)).toBe("timeout");
expect(isFailoverErrorMessage(sample)).toBe(true);
}
}); });
it("matches network errno codes in serialized error messages", () => { it("matches network errno codes in serialized error messages", () => {
const samples = [ expectTimeoutFailoverSamples([
"Error: connect ETIMEDOUT 10.0.0.1:443", "Error: connect ETIMEDOUT 10.0.0.1:443",
"Error: connect ESOCKETTIMEDOUT 10.0.0.1:443", "Error: connect ESOCKETTIMEDOUT 10.0.0.1:443",
"Error: connect EHOSTUNREACH 10.0.0.1:443", "Error: connect EHOSTUNREACH 10.0.0.1:443",
@ -604,25 +602,15 @@ describe("isFailoverErrorMessage", () => {
"Error: write EPIPE", "Error: write EPIPE",
"Error: read ENETRESET", "Error: read ENETRESET",
"Error: connect EHOSTDOWN 192.168.1.1:443", "Error: connect EHOSTDOWN 192.168.1.1:443",
]; ]);
for (const sample of samples) {
expect(isTimeoutErrorMessage(sample)).toBe(true);
expect(classifyFailoverReason(sample)).toBe("timeout");
expect(isFailoverErrorMessage(sample)).toBe(true);
}
}); });
it("matches z.ai network_error stop reason as timeout", () => { it("matches z.ai network_error stop reason as timeout", () => {
const samples = [ expectTimeoutFailoverSamples([
"Unhandled stop reason: network_error", "Unhandled stop reason: network_error",
"stop reason: network_error", "stop reason: network_error",
"reason: network_error", "reason: network_error",
]; ]);
for (const sample of samples) {
expect(isTimeoutErrorMessage(sample)).toBe(true);
expect(classifyFailoverReason(sample)).toBe("timeout");
expect(isFailoverErrorMessage(sample)).toBe(true);
}
}); });
it("does not classify MALFORMED_FUNCTION_CALL as timeout", () => { it("does not classify MALFORMED_FUNCTION_CALL as timeout", () => {