diff --git a/staging/src/k8s.io/apiserver/pkg/storage/testing/store_tests.go b/staging/src/k8s.io/apiserver/pkg/storage/testing/store_tests.go index 9776a1e0c67..80108555ca0 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/testing/store_tests.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/testing/store_tests.go @@ -21,12 +21,10 @@ import ( "errors" "fmt" "math" - "reflect" "strconv" "sync" "testing" - "github.com/google/go-cmp/cmp" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -701,28 +699,6 @@ func RunTestGuaranteedUpdateWithSuggestionAndConflict(ctx context.Context, t *te } } -// TestPropogateStore helps propagates store with objects, automates key generation, and returns -// keys and stored objects. -func TestPropogateStore(ctx context.Context, t *testing.T, store storage.Interface, obj *example.Pod) (string, *example.Pod) { - // Setup store with a key and grab the output for returning. - key := "/testkey" - return key, TestPropogateStoreWithKey(ctx, t, store, key, obj) -} - -// TestPropogateStoreWithKey helps propagate store with objects, the given object will be stored at the specified key. -func TestPropogateStoreWithKey(ctx context.Context, t *testing.T, store storage.Interface, key string, obj *example.Pod) *example.Pod { - // Setup store with the specified key and grab the output for returning. - err := store.Delete(ctx, key, &example.Pod{}, nil, storage.ValidateAllObjectFunc, nil) - if err != nil && !storage.IsNotFound(err) { - t.Fatalf("Cleanup failed: %v", err) - } - setOutput := &example.Pod{} - if err := store.Create(ctx, key, obj, setOutput, 0); err != nil { - t.Fatalf("Set failed: %v", err) - } - return setOutput -} - func RunTestCount(ctx context.Context, t *testing.T, store storage.Interface) { resourceA := "/foo.bar.io/abc" @@ -758,24 +734,3 @@ func RunTestCount(ctx context.Context, t *testing.T, store storage.Interface) { t.Fatalf("store.Count for resource %s: expected %d but got %d", resourceA, resourceACountExpected, resourceACountGot) } } - -func ExpectNoDiff(t *testing.T, msg string, expected, got interface{}) { - t.Helper() - if !reflect.DeepEqual(expected, got) { - if diff := cmp.Diff(expected, got); diff != "" { - t.Errorf("%s: %s", msg, diff) - } else { - t.Errorf("%s:\nexpected: %#v\ngot: %#v", msg, expected, got) - } - } -} - -const dummyPrefix = "adapter" - -func EncodeContinueOrDie(key string, resourceVersion int64) string { - token, err := storage.EncodeContinue(dummyPrefix+key, dummyPrefix, resourceVersion) - if err != nil { - panic(err) - } - return token -} diff --git a/staging/src/k8s.io/apiserver/pkg/storage/testing/utils.go b/staging/src/k8s.io/apiserver/pkg/storage/testing/utils.go index d0fbeef3eaa..821fffa5498 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/testing/utils.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/testing/utils.go @@ -19,9 +19,16 @@ package testing import ( "context" "path" + "reflect" + "testing" + "time" + "github.com/google/go-cmp/cmp" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/apis/example" "k8s.io/apiserver/pkg/storage" ) @@ -70,3 +77,97 @@ func DeepEqualSafePodSpec() example.PodSpec { SchedulerName: "default-scheduler", } } + +// TestPropogateStore helps propagates store with objects, automates key generation, and returns +// keys and stored objects. +func TestPropogateStore(ctx context.Context, t *testing.T, store storage.Interface, obj *example.Pod) (string, *example.Pod) { + // Setup store with a key and grab the output for returning. + key := "/testkey" + return key, TestPropogateStoreWithKey(ctx, t, store, key, obj) +} + +// TestPropogateStoreWithKey helps propagate store with objects, the given object will be stored at the specified key. +func TestPropogateStoreWithKey(ctx context.Context, t *testing.T, store storage.Interface, key string, obj *example.Pod) *example.Pod { + // Setup store with the specified key and grab the output for returning. + err := store.Delete(ctx, key, &example.Pod{}, nil, storage.ValidateAllObjectFunc, nil) + if err != nil && !storage.IsNotFound(err) { + t.Fatalf("Cleanup failed: %v", err) + } + setOutput := &example.Pod{} + if err := store.Create(ctx, key, obj, setOutput, 0); err != nil { + t.Fatalf("Set failed: %v", err) + } + return setOutput +} + +func ExpectNoDiff(t *testing.T, msg string, expected, got interface{}) { + t.Helper() + if !reflect.DeepEqual(expected, got) { + if diff := cmp.Diff(expected, got); diff != "" { + t.Errorf("%s: %s", msg, diff) + } else { + t.Errorf("%s:\nexpected: %#v\ngot: %#v", msg, expected, got) + } + } +} + +const dummyPrefix = "adapter" + +func EncodeContinueOrDie(key string, resourceVersion int64) string { + token, err := storage.EncodeContinue(dummyPrefix+key, dummyPrefix, resourceVersion) + if err != nil { + panic(err) + } + return token +} + +func TestCheckEventType(t *testing.T, expectEventType watch.EventType, w watch.Interface) { + select { + case res := <-w.ResultChan(): + if res.Type != expectEventType { + t.Errorf("event type want=%v, get=%v", expectEventType, res.Type) + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("time out after waiting %v on ResultChan", wait.ForeverTestTimeout) + } +} + +func TestCheckResult(t *testing.T, expectEventType watch.EventType, w watch.Interface, expectObj *example.Pod) { + TestCheckResultFunc(t, expectEventType, w, func(object runtime.Object) error { + ExpectNoDiff(t, "incorrect object", expectObj, object) + return nil + }) +} + +func TestCheckResultFunc(t *testing.T, expectEventType watch.EventType, w watch.Interface, check func(object runtime.Object) error) { + select { + case res := <-w.ResultChan(): + if res.Type != expectEventType { + t.Errorf("event type want=%v, get=%v", expectEventType, res.Type) + return + } + if err := check(res.Object); err != nil { + t.Error(err) + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("time out after waiting %v on ResultChan", wait.ForeverTestTimeout) + } +} + +func TestCheckStop(t *testing.T, w watch.Interface) { + select { + case e, ok := <-w.ResultChan(): + if ok { + var obj string + switch e.Object.(type) { + case *example.Pod: + obj = e.Object.(*example.Pod).Name + case *v1.Status: + obj = e.Object.(*v1.Status).Message + } + t.Errorf("ResultChan should have been closed. Event: %s. Object: %s", e.Type, obj) + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("time out after waiting 1s on ResultChan") + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/storage/testing/watcher_tests.go b/staging/src/k8s.io/apiserver/pkg/storage/testing/watcher_tests.go index 56e6525c441..f6717fcbb33 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/testing/watcher_tests.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/testing/watcher_tests.go @@ -190,54 +190,3 @@ type testWatchStruct struct { expectEvent bool watchType watch.EventType } - -func TestCheckEventType(t *testing.T, expectEventType watch.EventType, w watch.Interface) { - select { - case res := <-w.ResultChan(): - if res.Type != expectEventType { - t.Errorf("event type want=%v, get=%v", expectEventType, res.Type) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("time out after waiting %v on ResultChan", wait.ForeverTestTimeout) - } -} - -func TestCheckResult(t *testing.T, expectEventType watch.EventType, w watch.Interface, expectObj *example.Pod) { - TestCheckResultFunc(t, expectEventType, w, func(object runtime.Object) error { - ExpectNoDiff(t, "incorrect object", expectObj, object) - return nil - }) -} - -func TestCheckResultFunc(t *testing.T, expectEventType watch.EventType, w watch.Interface, check func(object runtime.Object) error) { - select { - case res := <-w.ResultChan(): - if res.Type != expectEventType { - t.Errorf("event type want=%v, get=%v", expectEventType, res.Type) - return - } - if err := check(res.Object); err != nil { - t.Error(err) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("time out after waiting %v on ResultChan", wait.ForeverTestTimeout) - } -} - -func TestCheckStop(t *testing.T, w watch.Interface) { - select { - case e, ok := <-w.ResultChan(): - if ok { - var obj string - switch e.Object.(type) { - case *example.Pod: - obj = e.Object.(*example.Pod).Name - case *metav1.Status: - obj = e.Object.(*metav1.Status).Message - } - t.Errorf("ResultChan should have been closed. Event: %s. Object: %s", e.Type, obj) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("time out after waiting 1s on ResultChan") - } -}