@@ -19,6 +19,8 @@ package handlers
19
19
import (
20
20
"context"
21
21
"io"
22
+ "net/http"
23
+ "strings"
22
24
"testing"
23
25
24
26
metainternalversionscheme "k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme"
@@ -28,6 +30,7 @@ import (
28
30
"k8s.io/apimachinery/pkg/runtime/serializer"
29
31
auditapis "k8s.io/apiserver/pkg/apis/audit"
30
32
"k8s.io/apiserver/pkg/audit"
33
+ "k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
31
34
"k8s.io/utils/pointer"
32
35
)
33
36
@@ -132,3 +135,72 @@ func TestDeleteResourceAuditLogRequestObject(t *testing.T) {
132
135
})
133
136
}
134
137
}
138
+
139
+ func TestDeleteCollection (t * testing.T ) {
140
+ req := & http.Request {
141
+ Header : http.Header {},
142
+ }
143
+ req .Header .Set ("Content-Type" , "application/json" )
144
+
145
+ fakeCorev1GroupVersion := schema.GroupVersion {
146
+ Group : "" ,
147
+ Version : "v1" ,
148
+ }
149
+ fakeCorev1Scheme := runtime .NewScheme ()
150
+ fakeCorev1Scheme .AddKnownTypes (fakeCorev1GroupVersion , & metav1.DeleteOptions {})
151
+ fakeCorev1Codec := serializer .NewCodecFactory (fakeCorev1Scheme )
152
+
153
+ tests := []struct {
154
+ name string
155
+ codecFactory serializer.CodecFactory
156
+ data []byte
157
+ expectErr string
158
+ }{
159
+ // for issue: https://github.com/kubernetes/kubernetes/issues/111985
160
+ {
161
+ name : "decode '{}' to metav1.DeleteOptions with fakeCorev1Codecs" ,
162
+ codecFactory : fakeCorev1Codec ,
163
+ data : []byte ("{}" ),
164
+ expectErr : "no kind \" DeleteOptions\" is registered" ,
165
+ },
166
+ {
167
+ name : "decode '{}' to metav1.DeleteOptions with metainternalversionscheme.Codecs" ,
168
+ codecFactory : metainternalversionscheme .Codecs ,
169
+ data : []byte ("{}" ),
170
+ expectErr : "" ,
171
+ },
172
+ {
173
+ name : "decode versioned (corev1) DeleteOptions with metainternalversionscheme.Codecs" ,
174
+ codecFactory : metainternalversionscheme .Codecs ,
175
+ data : []byte (`{"apiVersion":"v1","kind":"DeleteOptions","gracePeriodSeconds":123}` ),
176
+ expectErr : "" ,
177
+ },
178
+ {
179
+ name : "decode versioned (foo) DeleteOptions with metainternalversionscheme.Codecs" ,
180
+ codecFactory : metainternalversionscheme .Codecs ,
181
+ data : []byte (`{"apiVersion":"foo/v1","kind":"DeleteOptions","gracePeriodSeconds":123}` ),
182
+ expectErr : "" ,
183
+ },
184
+ }
185
+
186
+ defaultGVK := metav1 .SchemeGroupVersion .WithKind ("DeleteOptions" )
187
+ for _ , test := range tests {
188
+ t .Run (test .name , func (t * testing.T ) {
189
+ s , err := negotiation .NegotiateInputSerializer (req , false , test .codecFactory )
190
+ if err != nil {
191
+ t .Fatal (err )
192
+ }
193
+
194
+ options := & metav1.DeleteOptions {}
195
+ _ , _ , err = metainternalversionscheme .Codecs .DecoderToVersion (s .Serializer , defaultGVK .GroupVersion ()).Decode (test .data , & defaultGVK , options )
196
+ if test .expectErr != "" {
197
+ if err == nil {
198
+ t .Fatalf ("expect %s but got nil" , test .expectErr )
199
+ }
200
+ if ! strings .Contains (err .Error (), test .expectErr ) {
201
+ t .Fatalf ("expect %s but got %s" , test .expectErr , err .Error ())
202
+ }
203
+ }
204
+ })
205
+ }
206
+ }
0 commit comments