mirror of https://github.com/k3s-io/k3s
126 lines
2.5 KiB
Go
126 lines
2.5 KiB
Go
![]() |
/*
|
||
|
Copyright 2014 Google Inc. All rights reserved.
|
||
|
|
||
|
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 wait
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func TestPoller(t *testing.T) {
|
||
|
w := poller(time.Millisecond, 2)
|
||
|
ch := w()
|
||
|
count := 0
|
||
|
DRAIN:
|
||
|
for {
|
||
|
select {
|
||
|
case _, open := <-ch:
|
||
|
if !open {
|
||
|
break DRAIN
|
||
|
}
|
||
|
count++
|
||
|
case <-time.After(time.Millisecond * 5):
|
||
|
t.Errorf("unexpected timeout after poll")
|
||
|
}
|
||
|
}
|
||
|
if count > 3 {
|
||
|
t.Errorf("expected up to three values, got %d", count)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func fakeTicker(count int) WaitFunc {
|
||
|
return func() <-chan struct{} {
|
||
|
ch := make(chan struct{})
|
||
|
go func() {
|
||
|
for i := 0; i < count; i++ {
|
||
|
ch <- struct{}{}
|
||
|
}
|
||
|
close(ch)
|
||
|
}()
|
||
|
return ch
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestPoll(t *testing.T) {
|
||
|
invocations := 0
|
||
|
f := ConditionFunc(func() (bool, error) {
|
||
|
invocations++
|
||
|
return true, nil
|
||
|
})
|
||
|
if err := Poll(time.Microsecond, 1, f); err != nil {
|
||
|
t.Fatalf("unexpected error %v", err)
|
||
|
}
|
||
|
if invocations == 0 {
|
||
|
t.Errorf("Expected at least one invocation, got zero")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestWaitFor(t *testing.T) {
|
||
|
var invocations int
|
||
|
testCases := map[string]struct {
|
||
|
F ConditionFunc
|
||
|
Ticks int
|
||
|
Invoked int
|
||
|
Err bool
|
||
|
}{
|
||
|
"invoked once": {
|
||
|
ConditionFunc(func() (bool, error) {
|
||
|
invocations++
|
||
|
return true, nil
|
||
|
}),
|
||
|
2,
|
||
|
1,
|
||
|
false,
|
||
|
},
|
||
|
"invoked and returns a timeout": {
|
||
|
ConditionFunc(func() (bool, error) {
|
||
|
invocations++
|
||
|
return false, nil
|
||
|
}),
|
||
|
2,
|
||
|
3,
|
||
|
true,
|
||
|
},
|
||
|
"returns immediately on error": {
|
||
|
ConditionFunc(func() (bool, error) {
|
||
|
invocations++
|
||
|
return false, errors.New("test")
|
||
|
}),
|
||
|
2,
|
||
|
1,
|
||
|
true,
|
||
|
},
|
||
|
}
|
||
|
for k, c := range testCases {
|
||
|
invocations = 0
|
||
|
ticker := fakeTicker(c.Ticks)
|
||
|
err := WaitFor(ticker, c.F)
|
||
|
switch {
|
||
|
case c.Err && err == nil:
|
||
|
t.Errorf("%s: Expected error, got nil", k)
|
||
|
continue
|
||
|
case !c.Err && err != nil:
|
||
|
t.Errorf("%s: Expected no error, got: %#v", k, err)
|
||
|
continue
|
||
|
}
|
||
|
if invocations != c.Invoked {
|
||
|
t.Errorf("%s: Expected %d invocations, called %d", k, c.Invoked, invocations)
|
||
|
}
|
||
|
}
|
||
|
}
|