File size: 3,975 Bytes
a21c316 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | //! 测试 determine_retry_strategy 和 should_rotate_account 的所有分支,
//! 重点覆盖 404 重试与账号轮换逻辑。
use std::time::Duration;
use crate::proxy::handlers::common::{determine_retry_strategy, should_rotate_account, RetryStrategy};
// ===== determine_retry_strategy =====
#[test]
fn test_retry_strategy_404() {
let strategy = determine_retry_strategy(404, "", false);
match strategy {
RetryStrategy::FixedDelay(d) => assert_eq!(d, Duration::from_millis(300)),
other => panic!("Expected FixedDelay(300ms), got {:?}", other),
}
}
#[test]
fn test_retry_strategy_429_no_delay() {
let strategy = determine_retry_strategy(429, "rate limited", false);
assert!(
matches!(strategy, RetryStrategy::LinearBackoff { base_ms: 5000 }),
"Expected LinearBackoff {{ base_ms: 5000 }}, got {:?}",
strategy
);
}
#[test]
fn test_retry_strategy_503() {
let strategy = determine_retry_strategy(503, "", false);
assert!(
matches!(strategy, RetryStrategy::ExponentialBackoff { base_ms: 10000, max_ms: 60000 }),
"Expected ExponentialBackoff {{ base_ms: 10000, max_ms: 60000 }}, got {:?}",
strategy
);
}
#[test]
fn test_retry_strategy_529() {
let strategy = determine_retry_strategy(529, "", false);
assert!(
matches!(strategy, RetryStrategy::ExponentialBackoff { base_ms: 10000, max_ms: 60000 }),
"Expected ExponentialBackoff {{ base_ms: 10000, max_ms: 60000 }}, got {:?}",
strategy
);
}
#[test]
fn test_retry_strategy_500() {
let strategy = determine_retry_strategy(500, "", false);
assert!(
matches!(strategy, RetryStrategy::LinearBackoff { base_ms: 3000 }),
"Expected LinearBackoff {{ base_ms: 3000 }}, got {:?}",
strategy
);
}
#[test]
fn test_retry_strategy_401_403() {
for status in [401, 403] {
let strategy = determine_retry_strategy(status, "", false);
match strategy {
RetryStrategy::FixedDelay(d) => assert_eq!(d, Duration::from_millis(200)),
other => panic!("Expected FixedDelay(200ms) for {}, got {:?}", status, other),
}
}
}
#[test]
fn test_retry_strategy_other() {
for status in [200, 201, 301, 418, 502] {
let strategy = determine_retry_strategy(status, "", false);
assert!(
matches!(strategy, RetryStrategy::NoRetry),
"Expected NoRetry for {}, got {:?}",
status,
strategy
);
}
}
#[test]
fn test_retry_strategy_400_thinking_signature() {
let signatures = [
"Invalid `signature` for thinking",
"Error with thinking.signature",
"thinking.thinking block failed",
"Corrupted thought signature detected",
];
for sig in signatures {
let strategy = determine_retry_strategy(400, sig, false);
match strategy {
RetryStrategy::FixedDelay(d) => assert_eq!(d, Duration::from_millis(200)),
other => panic!(
"Expected FixedDelay(200ms) for 400 + '{}', got {:?}",
sig, other
),
}
}
}
#[test]
fn test_retry_strategy_400_no_signature() {
let strategy = determine_retry_strategy(400, "bad request", false);
assert!(
matches!(strategy, RetryStrategy::NoRetry),
"Expected NoRetry for 400 without signature, got {:?}",
strategy
);
}
// ===== should_rotate_account =====
#[test]
fn test_rotate_account_true_cases() {
for status in [429, 401, 403, 404, 500] {
assert!(
should_rotate_account(status, None),
"Expected should_rotate_account({}) == true",
status
);
}
}
#[test]
fn test_rotate_account_false_cases() {
for status in [400, 503, 529, 200, 502] {
assert!(
!should_rotate_account(status, None),
"Expected should_rotate_account({}) == false",
status
);
}
}
|