opencode_offline/packages/opencode/test/session/retry.test.ts

62 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-10-23 07:31:36 +08:00
import { describe, expect, test } from "bun:test"
import { SessionRetry } from "../../src/session/retry"
import { MessageV2 } from "../../src/session/message-v2"
function apiError(headers?: Record<string, string>): MessageV2.APIError {
return new MessageV2.APIError({
message: "boom",
isRetryable: true,
responseHeaders: headers,
}).toObject() as MessageV2.APIError
}
2025-11-18 00:30:55 +08:00
describe("session.retry.delay", () => {
test("caps delay at 30 seconds when headers missing", () => {
2025-10-23 07:31:36 +08:00
const error = apiError()
2025-11-26 04:44:24 +08:00
const delays = Array.from({ length: 10 }, (_, index) => SessionRetry.delay(index + 1, error))
2025-11-18 00:30:55 +08:00
expect(delays).toStrictEqual([2000, 4000, 8000, 16000, 30000, 30000, 30000, 30000, 30000, 30000])
2025-10-23 07:31:36 +08:00
})
test("prefers retry-after-ms when shorter than exponential", () => {
const error = apiError({ "retry-after-ms": "1500" })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(4, error)).toBe(1500)
2025-10-23 07:31:36 +08:00
})
test("uses retry-after seconds when reasonable", () => {
const error = apiError({ "retry-after": "30" })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(3, error)).toBe(30000)
2025-10-23 07:31:36 +08:00
})
test("accepts http-date retry-after values", () => {
const date = new Date(Date.now() + 20000).toUTCString()
const error = apiError({ "retry-after": date })
2025-11-26 04:44:24 +08:00
const d = SessionRetry.delay(1, error)
2025-11-18 00:30:55 +08:00
expect(d).toBeGreaterThanOrEqual(19000)
expect(d).toBeLessThanOrEqual(20000)
2025-10-23 07:31:36 +08:00
})
test("ignores invalid retry hints", () => {
const error = apiError({ "retry-after": "not-a-number" })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(1, error)).toBe(2000)
2025-10-23 07:31:36 +08:00
})
test("ignores malformed date retry hints", () => {
const error = apiError({ "retry-after": "Invalid Date String" })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(1, error)).toBe(2000)
})
test("ignores past date retry hints", () => {
const pastDate = new Date(Date.now() - 5000).toUTCString()
const error = apiError({ "retry-after": pastDate })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(1, error)).toBe(2000)
})
test("uses retry-after values even when exceeding 10 minutes with headers", () => {
const error = apiError({ "retry-after": "50" })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(1, error)).toBe(50000)
const longError = apiError({ "retry-after-ms": "700000" })
2025-11-26 04:44:24 +08:00
expect(SessionRetry.delay(1, longError)).toBe(700000)
})
2025-10-23 07:31:36 +08:00
})