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) } }