Merge pull request #118793 from serathius/test-cache-bypass

Test all cases for LIST request cache bypass
This commit is contained in:
Kubernetes Prow Robot 2023-06-21 13:17:52 -07:00 committed by GitHub
commit 2802bbce14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -154,6 +154,34 @@ func (d *dummyStorage) injectError(err error) {
}
func TestGetListCacheBypass(t *testing.T) {
type testCase struct {
opts storage.ListOptions
expectBypass bool
}
testCases := []testCase{
{opts: storage.ListOptions{ResourceVersion: ""}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "0"}, expectBypass: false},
{opts: storage.ListOptions{ResourceVersion: "1"}, expectBypass: false},
{opts: storage.ListOptions{ResourceVersion: "", Predicate: storage.SelectionPredicate{Continue: "a"}}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "0", Predicate: storage.SelectionPredicate{Continue: "a"}}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "1", Predicate: storage.SelectionPredicate{Continue: "a"}}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "", Predicate: storage.SelectionPredicate{Limit: 500}}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "0", Predicate: storage.SelectionPredicate{Limit: 500}}, expectBypass: false},
{opts: storage.ListOptions{ResourceVersion: "1", Predicate: storage.SelectionPredicate{Limit: 500}}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "", ResourceVersionMatch: metav1.ResourceVersionMatchExact}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "0", ResourceVersionMatch: metav1.ResourceVersionMatchExact}, expectBypass: true},
{opts: storage.ListOptions{ResourceVersion: "1", ResourceVersionMatch: metav1.ResourceVersionMatchExact}, expectBypass: true},
}
for _, tc := range testCases {
testGetListCacheBypass(t, tc.opts, tc.expectBypass)
}
}
func testGetListCacheBypass(t *testing.T, options storage.ListOptions, expectBypass bool) {
backingStorage := &dummyStorage{}
cacher, _, err := newTestCacher(backingStorage)
if err != nil {
@ -161,34 +189,21 @@ func TestGetListCacheBypass(t *testing.T) {
}
defer cacher.Stop()
pred := storage.SelectionPredicate{
Limit: 500,
}
result := &example.PodList{}
// Wait until cacher is initialized.
if err := cacher.ready.wait(context.Background()); err != nil {
t.Fatalf("unexpected error waiting for the cache to be ready")
}
// Inject error to underlying layer and check if cacher is not bypassed.
backingStorage.injectError(errDummy)
err = cacher.GetList(context.TODO(), "pods/ns", storage.ListOptions{
ResourceVersion: "0",
Predicate: pred,
Recursive: true,
}, result)
if err != nil {
t.Errorf("GetList with Limit and RV=0 should be served from cache: %v", err)
err = cacher.GetList(context.TODO(), "pods/ns", options, result)
if err != nil && err != errDummy {
t.Fatalf("Unexpected error for List request with options: %v, err: %v", options, err)
}
err = cacher.GetList(context.TODO(), "pods/ns", storage.ListOptions{
ResourceVersion: "",
Predicate: pred,
Recursive: true,
}, result)
if err != errDummy {
t.Errorf("GetList with Limit without RV=0 should bypass cacher: %v", err)
gotBypass := err == errDummy
if gotBypass != expectBypass {
t.Errorf("Unexpected bypass result for List request with options %+v, bypass expected: %v, got: %v", options, expectBypass, gotBypass)
}
}