Files

50 lines
2.6 KiB
Go

package upstream
import (
"testing"
"time"
)
// TestResolveUpstreamTimeoutScalesWithCardCount 覆盖批量操作预算:
// worker 不能再把批量请求压回 2 分钟,否则通道仍在按卡串行办理时会被提前判失败。
func TestResolveUpstreamTimeoutScalesWithCardCount(t *testing.T) {
cases := []struct {
name string
path string
itemCount int
perCard time.Duration
override time.Duration
maxTimeout time.Duration
apnTimeout time.Duration
want time.Duration
}{
{"单卡", "/sim/change/sim-status", 1, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 10 * time.Second},
{"零卡按单卡处理", "/sim/change/sim-status", 0, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 10 * time.Second},
{"50卡按单卡预算放大", "/sim/change/sim-status", 50, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 500 * time.Second},
{"100卡恰好低于上限", "/sim/change/sim-status", 100, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 1000 * time.Second},
{"超大批量按上限截断", "/sim/query/usage", 1000, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, defaultUpstreamProxyMaxTimeout},
{"单卡预算缺失用默认值", "/sim/query/usage", 2, 0, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 20 * time.Second},
{"显式覆盖仍按卡数放大", "/sim/query/usage", 3, 10 * time.Second, 2 * time.Second, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 6 * time.Second},
{"数据开停使用独立预算", "/sim/change/sim-apn", 50, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 240 * time.Second, 240 * time.Second},
{"数据开停预算缺失回退", "/sim/change/sim-apn", 1, 10 * time.Second, 0, defaultUpstreamProxyMaxTimeout, 0, 240 * time.Second},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got := resolveUpstreamTimeout(c.path, c.itemCount, c.perCard, c.override, c.maxTimeout, c.apnTimeout)
if got != c.want {
t.Fatalf("resolveUpstreamTimeout=%s,期望%s", got, c.want)
}
})
}
}
// TestUpstreamMaxTimeoutOutlastsProxyBatchTimeout 固化跨服务预算约束:
// worker 上限必须大于 proxy 的 gateway.batchTimeout(默认 20 分钟),
// 使超时由更靠近通道的一层先判定,避免 worker 提前放弃而通道仍在办理。
func TestUpstreamMaxTimeoutOutlastsProxyBatchTimeout(t *testing.T) {
const proxyBatchTimeout = 20 * time.Minute
if defaultUpstreamProxyMaxTimeout <= proxyBatchTimeout {
t.Fatalf("worker 上限%s 必须大于 proxy 批量上限%s", defaultUpstreamProxyMaxTimeout, proxyBatchTimeout)
}
}