package controller
import (
"reflect"
"testing"
flowcontrol "k8s.io/kubernetes/pkg/util/flowcontrol"
)
func TestScheduler(t *testing.T) {
keys := []string{}
s := NewScheduler(2, flowcontrol.NewFakeAlwaysRateLimiter(), func(key, value interface{}) {
keys = append(keys, key.(string))
})
for i := 0; i < 6; i++ {
s.RunOnce()
if len(keys) > 0 {
t.Fatal(keys)
}
if s.position != (i+1)%3 {
t.Fatal(s.position)
}
}
s.Add("first", "test")
found := false
for i, buckets := range s.buckets {
if _, ok := buckets["first"]; ok {
found = true
} else {
continue
}
if i == s.position {
t.Fatal("should not insert into current bucket")
}
}
if !found {
t.Fatal("expected to find key in a bucket")
}
for i := 0; i < 10; i++ {
s.Delay("first")
if _, ok := s.buckets[(s.position-1+len(s.buckets))%len(s.buckets)]["first"]; !ok {
t.Fatal("key was not in the last bucket")
}
}
s.RunOnce()
if len(keys) != 0 {
t.Fatal(keys)
}
s.RunOnce()
if !reflect.DeepEqual(keys, []string{"first"}) {
t.Fatal(keys)
}
}
func TestSchedulerAddAndDelay(t *testing.T) {
s := NewScheduler(3, flowcontrol.NewFakeAlwaysRateLimiter(), func(key, value interface{}) {})
// 3 is the last bucket, 0 is the current bucket
s.Add("first", "other")
if s.buckets[3]["first"] != "other" {
t.Fatalf("placed key in wrong bucket: %#v", s.buckets)
}
s.Add("second", "other")
if s.buckets[2]["second"] != "other" {
t.Fatalf("placed key in wrong bucket: %#v", s.buckets)
}
s.Add("third", "other")
if s.buckets[1]["third"] != "other" {
t.Fatalf("placed key in wrong bucket: %#v", s.buckets)
}
s.Add("fourth", "other")
if s.buckets[3]["fourth"] != "other" {
t.Fatalf("placed key in wrong bucket: %#v", s.buckets)
}
s.Add("fifth", "other")
if s.buckets[2]["fifth"] != "other" {
t.Fatalf("placed key in wrong bucket: %#v", s.buckets)
}
s.Remove("third", "other")
s.Add("sixth", "other")
if s.buckets[1]["sixth"] != "other" {
t.Fatalf("placed key in wrong bucket: %#v", s.buckets)
}
// delaying an item moves it to the last bucket
s.Delay("second")
if s.buckets[3]["second"] != "other" {
t.Fatalf("delay placed key in wrong bucket: %#v", s.buckets)
}
// delaying an item that is not in the map does nothing
s.Delay("third")
if _, ok := s.buckets[3]["third"]; ok {
t.Fatalf("delay placed key in wrong bucket: %#v", s.buckets)
}
// delaying an item that is already in the latest bucket does nothing
s.Delay("fourth")
if s.buckets[3]["fourth"] != "other" {
t.Fatalf("delay placed key in wrong bucket: %#v", s.buckets)
}
}
func TestSchedulerRemove(t *testing.T) {
s := NewScheduler(2, flowcontrol.NewFakeAlwaysRateLimiter(), func(key, value interface{}) {})
s.Add("test", "other")
if s.Remove("test", "value") {
t.Fatal(s)
}
if !s.Remove("test", "other") {
t.Fatal(s)
}
if s.Len() != 0 {
t.Fatal(s)
}
s.Add("test", "other")
s.Add("test", "new")
if s.Len() != 1 {
t.Fatal(s)
}
if s.Remove("test", "other") {
t.Fatal(s)
}
if !s.Remove("test", "new") {
t.Fatal(s)
}
}