Skip to content

Commit 640b1a3

Browse files
committed
fix billing invocations calculation
If balance is zero, invocations should be deducted from remaining invocations.
1 parent 1fe5a57 commit 640b1a3

2 files changed

Lines changed: 21 additions & 31 deletions

File tree

billing/handler.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,20 @@ func NewFunctionBalance(credit, invocations, costPerUnitInvocations, unitInvocat
2424
fnBalance := FunctionBalance{}
2525

2626
totalCharge := calculateInvocationsCost(invocations, costPerUnitInvocations, unitInvocations)
27-
if credit < totalCharge {
27+
unpaidAmount := uint64(0)
28+
if credit <= totalCharge {
2829
fnBalance.Balance = 0
29-
remainingInvocations := calculateRemainingInvocations(totalCharge-credit, costPerUnitInvocations, unitInvocations)
30-
if bonusInvocations < remainingInvocations {
31-
fnBalance.Invocations = 0
32-
} else {
33-
fnBalance.Invocations = bonusInvocations - remainingInvocations
34-
}
30+
unpaidAmount = totalCharge - credit
3531
} else {
3632
fnBalance.Balance = credit - totalCharge
37-
fnBalance.Invocations = bonusInvocations + calculateRemainingInvocations(fnBalance.Balance, costPerUnitInvocations, unitInvocations)
33+
}
34+
35+
unpaidInvocations := uint64(unpaidAmount*unitInvocations/costPerUnitInvocations + invocations%unitInvocations)
36+
remainingInvocations := bonusInvocations + uint64(fnBalance.Balance*unitInvocations/costPerUnitInvocations)
37+
if remainingInvocations < unpaidInvocations {
38+
fnBalance.Invocations = 0
39+
} else {
40+
fnBalance.Invocations = remainingInvocations - unpaidInvocations
3841
}
3942

4043
return fnBalance
@@ -44,10 +47,6 @@ func calculateInvocationsCost(invocations, costPerUnitInvocations, unitInvocatio
4447
return uint64(costPerUnitInvocations * invocations / unitInvocations)
4548
}
4649

47-
func calculateRemainingInvocations(balance, costPerUnitInvocations, unitInvocations uint64) uint64 {
48-
return uint64(balance * unitInvocations / costPerUnitInvocations)
49-
}
50-
5150
func Handle(w http.ResponseWriter, r *http.Request) {
5251

5352
fnName, err := parseFunctionName(r)

billing/handler_test.go

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,28 +75,19 @@ func Test_calculateInvocationsCost_whenRounded(t *testing.T) {
7575
}
7676
}
7777

78-
func Test_calculateRemainingInvocations_whenExact(t *testing.T) {
79-
balance := uint64(1)
78+
func Test_NewFunctionBalance_whenBalanceZero(t *testing.T) {
79+
credit := uint64(0)
80+
invocations := uint64(5)
8081
costPerUnitInvocations := uint64(10)
81-
unitInvocations := uint64(1000)
82-
83-
expected := uint64(100)
84-
85-
got := calculateRemainingInvocations(balance, costPerUnitInvocations, unitInvocations)
82+
unitInvocations := uint64(100)
83+
bonusInvocations := uint64(50)
8684

87-
if expected != got {
88-
t.Errorf("Expected: %d, got: %d", expected, got)
85+
expected := FunctionBalance{
86+
Balance: 0,
87+
Invocations: 45,
8988
}
90-
}
9189

92-
func Test_calculateRemainingInvocations_whenRounded(t *testing.T) {
93-
balance := uint64(1)
94-
costPerUnitInvocations := uint64(10)
95-
unitInvocations := uint64(1)
96-
97-
expected := uint64(0)
98-
99-
got := calculateRemainingInvocations(balance, costPerUnitInvocations, unitInvocations)
90+
got := NewFunctionBalance(credit, invocations, costPerUnitInvocations, unitInvocations, bonusInvocations)
10091

10192
if expected != got {
10293
t.Errorf("Expected: %d, got: %d", expected, got)
@@ -112,7 +103,7 @@ func Test_NewFunctionBalance_whenBalancePositive(t *testing.T) {
112103

113104
expected := FunctionBalance{
114105
Balance: 99,
115-
Invocations: 9950,
106+
Invocations: 9850,
116107
}
117108

118109
got := NewFunctionBalance(credit, invocations, costPerUnitInvocations, unitInvocations, bonusInvocations)

0 commit comments

Comments
 (0)