mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 03:41:45 +00:00
Additional parameters like ginkgo.SpecTimeout may also be relevant for conformance tests.
73 lines
2.6 KiB
Go
73 lines
2.6 KiB
Go
/*
|
|
Copyright 2022 The Kubernetes Authors.
|
|
|
|
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 framework
|
|
|
|
import (
|
|
"path"
|
|
"reflect"
|
|
|
|
"github.com/onsi/ginkgo/v2"
|
|
"github.com/onsi/ginkgo/v2/types"
|
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
)
|
|
|
|
var errInterface = reflect.TypeOf((*error)(nil)).Elem()
|
|
|
|
// IgnoreNotFound can be used to wrap an arbitrary function in a call to
|
|
// [ginkgo.DeferCleanup]. When the wrapped function returns an error that
|
|
// `apierrors.IsNotFound` considers as "not found", the error is ignored
|
|
// instead of failing the test during cleanup. This is useful for cleanup code
|
|
// that just needs to ensure that some object does not exist anymore.
|
|
func IgnoreNotFound(in any) any {
|
|
inType := reflect.TypeOf(in)
|
|
inValue := reflect.ValueOf(in)
|
|
return reflect.MakeFunc(inType, func(args []reflect.Value) []reflect.Value {
|
|
out := inValue.Call(args)
|
|
if len(out) > 0 {
|
|
lastValue := out[len(out)-1]
|
|
last := lastValue.Interface()
|
|
if last != nil && lastValue.Type().Implements(errInterface) && apierrors.IsNotFound(last.(error)) {
|
|
out[len(out)-1] = reflect.Zero(errInterface)
|
|
}
|
|
}
|
|
return out
|
|
}).Interface()
|
|
}
|
|
|
|
// AnnotatedLocation can be used to provide more informative source code
|
|
// locations by passing the result as additional parameter to a
|
|
// BeforeEach/AfterEach/DeferCleanup/It/etc.
|
|
func AnnotatedLocation(annotation string) types.CodeLocation {
|
|
return AnnotatedLocationWithOffset(annotation, 1)
|
|
}
|
|
|
|
// AnnotatedLocationWithOffset skips additional call stack levels. With 0 as offset
|
|
// it is identical to [AnnotatedLocation].
|
|
func AnnotatedLocationWithOffset(annotation string, offset int) types.CodeLocation {
|
|
codeLocation := types.NewCodeLocation(offset + 1)
|
|
codeLocation.FileName = path.Base(codeLocation.FileName)
|
|
codeLocation = types.NewCustomCodeLocation(annotation + " | " + codeLocation.String())
|
|
return codeLocation
|
|
}
|
|
|
|
// ConformanceIt is wrapper function for ginkgo It. Adds "[Conformance]" tag and makes static analysis easier.
|
|
func ConformanceIt(text string, args ...interface{}) bool {
|
|
args = append(args, ginkgo.Offset(1))
|
|
return ginkgo.It(text+" [Conformance]", args...)
|
|
}
|