Thread int32 saturation clamps from tiered settlement and video task recompute into the consume/task logs under admin_info, so oversized or malformed billing inputs stay auditable. Clamp negative audio duration before token conversion and gate the saturation UI markers on admin.
54 lines
2.0 KiB
Go
54 lines
2.0 KiB
Go
package billingexpr_test
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
"github.com/QuantumNous/new-api/pkg/billingexpr"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestComputeTieredQuota_ClampOnOverflow guards the billing-safety invariant
|
|
// that an oversized tiered settlement clamps to the int32 max instead of
|
|
// wrapping into a credit, and that the saturation event is surfaced on the
|
|
// result so callers can record it for admin auditing.
|
|
func TestComputeTieredQuota_ClampOnOverflow(t *testing.T) {
|
|
// exprOutput = p * 1e9 = 1e18; quotaBeforeGroup = 1e18 / 1e6 * 5e5 = 5e17,
|
|
// which far exceeds MaxInt32 and must saturate.
|
|
exprStr := `tier("base", p * 1000000000)`
|
|
snap := &billingexpr.BillingSnapshot{
|
|
BillingMode: "tiered_expr",
|
|
ExprString: exprStr,
|
|
ExprHash: billingexpr.ExprHashString(exprStr),
|
|
GroupRatio: 1.0,
|
|
QuotaPerUnit: 500_000,
|
|
}
|
|
|
|
result, err := billingexpr.ComputeTieredQuota(snap, billingexpr.TokenParams{P: 1_000_000_000})
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, math.MaxInt32, result.ActualQuotaAfterGroup, "oversized quota must clamp to int32 max, never wrap negative")
|
|
require.NotNil(t, result.Clamp, "clamp event must be surfaced so it can be audited")
|
|
assert.Equal(t, common.QuotaClampOverflow, result.Clamp.Kind)
|
|
assert.Equal(t, math.MaxInt32, result.Clamp.Clamped)
|
|
}
|
|
|
|
// TestComputeTieredQuota_NoClampInRange confirms an in-range settlement leaves
|
|
// Clamp nil, so the audit path is a no-op in the common case.
|
|
func TestComputeTieredQuota_NoClampInRange(t *testing.T) {
|
|
exprStr := `tier("base", p * 2 + c * 10)`
|
|
snap := &billingexpr.BillingSnapshot{
|
|
BillingMode: "tiered_expr",
|
|
ExprString: exprStr,
|
|
ExprHash: billingexpr.ExprHashString(exprStr),
|
|
GroupRatio: 1.0,
|
|
QuotaPerUnit: 500_000,
|
|
}
|
|
|
|
result, err := billingexpr.ComputeTieredQuota(snap, billingexpr.TokenParams{P: 1000, C: 500})
|
|
require.NoError(t, err)
|
|
assert.Nil(t, result.Clamp, "in-range settlement must not report a clamp")
|
|
}
|