|
|
@@ -4,8 +4,12 @@
|
|
|
package limiter
|
|
|
|
|
|
import (
|
|
|
+ "bytes"
|
|
|
+ "strings"
|
|
|
"testing"
|
|
|
"time"
|
|
|
+
|
|
|
+ "github.com/google/go-cmp/cmp"
|
|
|
)
|
|
|
|
|
|
const testRefillInterval = time.Second
|
|
|
@@ -113,6 +117,64 @@ func TestLimiterOverdraft(t *testing.T) {
|
|
|
hasTokens(t, l, "foo", -1)
|
|
|
}
|
|
|
|
|
|
+func TestDumpHTML(t *testing.T) {
|
|
|
+ l := &Limiter[string]{
|
|
|
+ Size: 3,
|
|
|
+ Max: 10,
|
|
|
+ Overdraft: 10,
|
|
|
+ RefillInterval: testRefillInterval,
|
|
|
+ }
|
|
|
+
|
|
|
+ now := time.Now().Truncate(testRefillInterval).Add(time.Millisecond)
|
|
|
+ allowed(t, l, "foo", 10, now)
|
|
|
+ denied(t, l, "foo", 2, now)
|
|
|
+ allowed(t, l, "bar", 4, now)
|
|
|
+ allowed(t, l, "qux", 1, now)
|
|
|
+
|
|
|
+ var out bytes.Buffer
|
|
|
+ l.DumpHTML(&out, false)
|
|
|
+ want := strings.Join([]string{
|
|
|
+ "<table>",
|
|
|
+ "<tr><th>Key</th><th>Tokens</th></tr>",
|
|
|
+ "<tr><td>qux</td><td>9</td></tr>",
|
|
|
+ "<tr><td>bar</td><td>6</td></tr>",
|
|
|
+ "<tr><td>foo</td><td><b>-2</b></td></tr>",
|
|
|
+ "</table>",
|
|
|
+ }, "")
|
|
|
+ if diff := cmp.Diff(out.String(), want); diff != "" {
|
|
|
+ t.Fatalf("wrong DumpHTML output (-got+want):\n%s", diff)
|
|
|
+ }
|
|
|
+
|
|
|
+ out.Reset()
|
|
|
+ l.DumpHTML(&out, true)
|
|
|
+ want = strings.Join([]string{
|
|
|
+ "<table>",
|
|
|
+ "<tr><th>Key</th><th>Tokens</th></tr>",
|
|
|
+ "<tr><td>foo</td><td>-2</td></tr>",
|
|
|
+ "</table>",
|
|
|
+ }, "")
|
|
|
+ if diff := cmp.Diff(out.String(), want); diff != "" {
|
|
|
+ t.Fatalf("wrong DumpHTML output (-got+want):\n%s", diff)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check that DumpHTML updates tokens even if the key wasn't hit
|
|
|
+ // organically.
|
|
|
+ now = now.Add(3 * time.Second)
|
|
|
+ out.Reset()
|
|
|
+ l.dumpHTML(&out, false, now)
|
|
|
+ want = strings.Join([]string{
|
|
|
+ "<table>",
|
|
|
+ "<tr><th>Key</th><th>Tokens</th></tr>",
|
|
|
+ "<tr><td>qux</td><td>10</td></tr>",
|
|
|
+ "<tr><td>bar</td><td>9</td></tr>",
|
|
|
+ "<tr><td>foo</td><td>1</td></tr>",
|
|
|
+ "</table>",
|
|
|
+ }, "")
|
|
|
+ if diff := cmp.Diff(out.String(), want); diff != "" {
|
|
|
+ t.Fatalf("wrong DumpHTML output (-got+want):\n%s", diff)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func allowed(t *testing.T, l *Limiter[string], key string, count int, now time.Time) {
|
|
|
t.Helper()
|
|
|
for i := 0; i < count; i++ {
|