From 83ff8a2f49f820fb355b24c65b8629710dca8a54 Mon Sep 17 00:00:00 2001 From: Vandit Singh <107131545+Vandit1604@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:14:19 +0530 Subject: [PATCH] Negative index regression test for json-patch (#122625) * add testcase with negative index * exercise successful negative index patching * use different values for testing Co-authored-by: Chris Bandy --------- Co-authored-by: Chris Bandy --- .../pkg/endpoints/handlers/rest_test.go | 5 +++++ .../kubectl/pkg/cmd/util/helpers_test.go | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go index 465986319a3..54931785da1 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest_test.go @@ -244,6 +244,10 @@ func TestJSONPatch(t *testing.T) { expectedError: "the server rejected our request due to an error in our request", expectedErrorType: metav1.StatusReasonInvalid, }, + { + name: "valid-negative-index-patch", + patch: `[{"op": "test", "value": "foo", "path": "/metadata/finalizers/-1"}]`, + }, } { p := &patcher{ patchType: types.JSONPatchType, @@ -253,6 +257,7 @@ func TestJSONPatch(t *testing.T) { codec := codecs.LegacyCodec(examplev1.SchemeGroupVersion) pod := &examplev1.Pod{} pod.Name = "podA" + pod.ObjectMeta.Finalizers = []string{"foo"} versionedJS, err := runtime.Encode(codec, pod) if err != nil { t.Errorf("%s: unexpected error: %v", test.name, err) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/util/helpers_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/util/helpers_test.go index 7cf0d70832b..955532ca9c8 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/util/helpers_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/util/helpers_test.go @@ -289,6 +289,26 @@ func TestJSONPatch(t *testing.T) { fragment: `[ {"op": "add", "path": "/metadata/labels/foo", "value": "bar"} ]`, expectErr: true, }, + { + obj: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Finalizers: []string{"foo", "bar", "test"}, + }, + }, + fragment: `[ {"op": "replace", "path": "/metadata/finalizers/-1", "value": "baz"} ]`, + expected: &corev1.Pod{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Finalizers: []string{"foo", "bar", "baz"}, + }, + Spec: corev1.PodSpec{}, + }, + }, } codec := runtime.NewCodec(scheme.DefaultJSONEncoder(),