mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-04 03:03:14 -05:00 
			
		
		
		
	Add test suite covering thread-safe random number generator with tests for: - Constructor with various seed values (positive, zero, negative) - Deterministic behavior verification with same seeds - Permutation generation and validation - Concurrent access safety with multiple goroutines - Mixed operations under concurrent load Also clarify package documentation to explicitly state this is for load balancing and server selection, not cryptographic use. The math/rand usage is intentional for performance in non-security contexts like upstream server selection and DNS record shuffling. Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
		
			
				
	
	
		
			39 lines
		
	
	
		
			962 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			962 B
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package rand is used for concurrency safe random number generator.
 | 
						|
// This package provides a thread-safe wrapper around math/rand for use in
 | 
						|
// load balancing and server selection. It is NOT suitable for cryptographic
 | 
						|
// purposes and should not be used for security-sensitive operations.
 | 
						|
package rand
 | 
						|
 | 
						|
import (
 | 
						|
	"math/rand"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
// Rand is used for concurrency safe random number generator.
 | 
						|
type Rand struct {
 | 
						|
	m sync.Mutex
 | 
						|
	r *rand.Rand
 | 
						|
}
 | 
						|
 | 
						|
// New returns a new Rand from seed.
 | 
						|
func New(seed int64) *Rand {
 | 
						|
	return &Rand{r: rand.New(rand.NewSource(seed))}
 | 
						|
}
 | 
						|
 | 
						|
// Int returns a non-negative pseudo-random int from the Source in Rand.r.
 | 
						|
func (r *Rand) Int() int {
 | 
						|
	r.m.Lock()
 | 
						|
	v := r.r.Int()
 | 
						|
	r.m.Unlock()
 | 
						|
	return v
 | 
						|
}
 | 
						|
 | 
						|
// Perm returns, as a slice of n ints, a pseudo-random permutation of the
 | 
						|
// integers in the half-open interval [0,n) from the Source in Rand.r.
 | 
						|
func (r *Rand) Perm(n int) []int {
 | 
						|
	r.m.Lock()
 | 
						|
	v := r.r.Perm(n)
 | 
						|
	r.m.Unlock()
 | 
						|
	return v
 | 
						|
}
 |