123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*
- Copyright 2017 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package eventratelimit
- import (
- "testing"
- "github.com/hashicorp/golang-lru"
- "k8s.io/client-go/util/flowcontrol"
- )
- func TestSingleCache(t *testing.T) {
- rateLimiter := flowcontrol.NewTokenBucketRateLimiter(1., 1)
- cache := singleCache{
- rateLimiter: rateLimiter,
- }
- cases := []interface{}{nil, "key1", "key2"}
- for _, tc := range cases {
- actual := cache.get(tc)
- if e, a := rateLimiter, actual; e != a {
- t.Errorf("unexpected entry in cache for key %v: expected %v, got %v", tc, e, a)
- }
- }
- }
- func TestLRUCache(t *testing.T) {
- rateLimiters := []flowcontrol.RateLimiter{
- flowcontrol.NewTokenBucketRateLimiter(1., 1),
- flowcontrol.NewTokenBucketRateLimiter(2., 2),
- flowcontrol.NewTokenBucketRateLimiter(3., 3),
- flowcontrol.NewTokenBucketRateLimiter(4., 4),
- }
- nextRateLimiter := 0
- rateLimiterFactory := func() flowcontrol.RateLimiter {
- rateLimiter := rateLimiters[nextRateLimiter]
- nextRateLimiter++
- return rateLimiter
- }
- underlyingCache, err := lru.New(2)
- if err != nil {
- t.Fatalf("Could not create LRU cache: %v", err)
- }
- cache := lruCache{
- rateLimiterFactory: rateLimiterFactory,
- cache: underlyingCache,
- }
- cases := []struct {
- name string
- key int
- expected flowcontrol.RateLimiter
- }{
- {
- name: "first added",
- key: 0,
- expected: rateLimiters[0],
- },
- {
- name: "first obtained",
- key: 0,
- expected: rateLimiters[0],
- },
- {
- name: "second added",
- key: 1,
- expected: rateLimiters[1],
- },
- {
- name: "second obtained",
- key: 1,
- expected: rateLimiters[1],
- },
- {
- name: "first obtained second time",
- key: 0,
- expected: rateLimiters[0],
- },
- {
- name: "third added",
- key: 2,
- expected: rateLimiters[2],
- },
- {
- name: "third obtained",
- key: 2,
- expected: rateLimiters[2],
- },
- {
- name: "first obtained third time",
- key: 0,
- expected: rateLimiters[0],
- },
- {
- name: "second re-added after eviction",
- key: 1,
- expected: rateLimiters[3],
- },
- }
- for _, tc := range cases {
- actual := cache.get(tc.key)
- if e, a := tc.expected, actual; e != a {
- t.Errorf("%v: unexpected entry in cache for key %v: expected %v, got %v", tc.name, tc.key, e, a)
- }
- }
- }
|