// Copyright 2016 The Mellium Contributors.
// Use of this source code is governed by the BSD 2-clause license that can be
// found in the LICENSE file.
package sasl
import (
"crypto/rand"
"errors"
"testing"
)
type zeroReader struct{}
func (zeroReader) Read(p []byte) (int, error) {
for i := 0; i < cap(p); i++ {
p[i] = 0
}
return cap(p), nil
}
func TestNoncePanicsIfTooShort(t *testing.T) {
func() {
defer func() {
if r := recover(); r == nil {
t.Errorf("Expected nonce() to panic if given zero length")
}
}()
nonce(0, rand.Reader)
}()
func() {
defer func() {
if r := recover(); r == nil {
t.Errorf("Expected nonce() to panic if given negative length")
}
}()
nonce(-1, rand.Reader)
}()
}
type errReader struct{}
func (errReader) Read(p []byte) (int, error) {
return 0, errors.New("Expected errReader error")
}
type nopReader struct{}
func (nopReader) Read(p []byte) (int, error) {
return 0, nil
}
func TestNoncePanicsOnErrorReadingRand(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Error("Expected nonce to panic if generating randomness fails")
}
}()
nonce(1, errReader{})
}
func TestNoncePanicsOnIncompleteReadingRand(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Error("Expected nonce to panic if too little randomness was generated")
}
}()
nonce(1, nopReader{})
}
func BenchmarkNonce(b *testing.B) {
cr := rand.Reader
b.ResetTimer()
for i := 0; i < b.N; i++ {
nonce(16, cr)
}
}