mirror of https://github.com/knative/pkg.git
				
				
				
			
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
Copyright 2020 The Knative 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 fuzzer
 | 
						|
 | 
						|
import (
 | 
						|
	"math/rand"
 | 
						|
	"net/url"
 | 
						|
 | 
						|
	fuzz "github.com/google/gofuzz"
 | 
						|
	corev1 "k8s.io/api/core/v1"
 | 
						|
	"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
 | 
						|
	"k8s.io/apimachinery/pkg/runtime/serializer"
 | 
						|
	"knative.dev/pkg/apis"
 | 
						|
)
 | 
						|
 | 
						|
// Funcs includes fuzzing funcs for knative.dev/serving types
 | 
						|
//
 | 
						|
// For other examples see
 | 
						|
// https://github.com/kubernetes/apimachinery/blob/master/pkg/apis/meta/fuzzer/fuzzer.go
 | 
						|
var Funcs = fuzzer.MergeFuzzerFuncs(
 | 
						|
	func(codecs serializer.CodecFactory) []interface{} {
 | 
						|
		return []interface{}{
 | 
						|
			func(u *apis.URL, c fuzz.Continue) {
 | 
						|
				u.Scheme = randStringAtoZ(c.Rand)
 | 
						|
				u.Host = randStringAtoZ(c.Rand)
 | 
						|
				u.User = url.UserPassword(
 | 
						|
					randStringAtoZ(c.Rand), // username
 | 
						|
					randStringAtoZ(c.Rand), // password
 | 
						|
				)
 | 
						|
				u.RawPath = url.PathEscape(c.RandString())
 | 
						|
				u.RawQuery = url.QueryEscape(c.RandString())
 | 
						|
			},
 | 
						|
		}
 | 
						|
	},
 | 
						|
)
 | 
						|
 | 
						|
// FuzzConditions fuzzes the values for the conditions. It doesn't add
 | 
						|
// any new condition types
 | 
						|
//
 | 
						|
// Consumers should initialize their conditions prior to fuzzing them.
 | 
						|
// For example:
 | 
						|
//
 | 
						|
// func(s *SomeStatus, c fuzz.Continue) {
 | 
						|
//   c.FuzzNoCustom(s) // fuzz the status object
 | 
						|
//
 | 
						|
//   // Clear the random fuzzed condition
 | 
						|
//   s.Status.SetConditions(nil)
 | 
						|
//
 | 
						|
//   // Fuzz the known conditions except their type value
 | 
						|
//   s.InitializeConditions()
 | 
						|
//   fuzz.Conditions(&s.Status, c)
 | 
						|
// }
 | 
						|
func FuzzConditions(accessor apis.ConditionsAccessor, c fuzz.Continue) {
 | 
						|
	conds := accessor.GetConditions()
 | 
						|
	for i, cond := range conds {
 | 
						|
		// Leave condition.Type untouched
 | 
						|
		cond.Status = corev1.ConditionStatus(c.RandString())
 | 
						|
		cond.Severity = apis.ConditionSeverity(c.RandString())
 | 
						|
		cond.Message = c.RandString()
 | 
						|
		cond.Reason = c.RandString()
 | 
						|
		c.FuzzNoCustom(&cond.LastTransitionTime)
 | 
						|
		conds[i] = cond
 | 
						|
	}
 | 
						|
	accessor.SetConditions(conds)
 | 
						|
}
 | 
						|
 | 
						|
// taken from gofuzz internals for RandString
 | 
						|
type charRange struct {
 | 
						|
	first, last rune
 | 
						|
}
 | 
						|
 | 
						|
func (c *charRange) choose(r *rand.Rand) rune {
 | 
						|
	count := int64(c.last - c.first + 1)
 | 
						|
	ch := c.first + rune(r.Int63n(count))
 | 
						|
 | 
						|
	return ch
 | 
						|
}
 | 
						|
 | 
						|
// not fully exhaustive
 | 
						|
func randStringAtoZ(r *rand.Rand) string {
 | 
						|
	hostCharRange := charRange{'a', 'z'}
 | 
						|
 | 
						|
	n := r.Intn(20)
 | 
						|
	runes := make([]rune, n)
 | 
						|
	for i := range runes {
 | 
						|
		runes[i] = hostCharRange.choose(r)
 | 
						|
	}
 | 
						|
	return string(runes)
 | 
						|
}
 |