Skip to content

Instantly share code, notes, and snippets.

@ivankatliarchuk
Created December 29, 2024 12:55
Show Gist options
  • Save ivankatliarchuk/b2e9987f52cf369d935e9dc7a13bb024 to your computer and use it in GitHub Desktop.
Save ivankatliarchuk/b2e9987f52cf369d935e9dc7a13bb024 to your computer and use it in GitHub Desktop.
how-to-override-rand-reader-behavior-golang
package main
package endpoint
import (
"encoding/base64"
"io"
"testing"
"crypto/rand"
"github.com/stretchr/testify/require"
)
// GenerateNonce creates a random nonce of a fixed size
func GenerateNonce() ([]byte, error) {
nonce := make([]byte, standardGcmNonceSize)
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
return nil, err
}
return []byte(base64.StdEncoding.EncodeToString(nonce)), nil
}
func TestGenerateNonceSuccess(t *testing.T) {
nonce, err := GenerateNonce()
require.NoError(t, err)
require.NotEmpty(t, nonce)
// Test nonce length
decodedNonce, err := base64.StdEncoding.DecodeString(string(nonce))
require.NoError(t, err)
require.Equal(t, standardGcmNonceSize, len(decodedNonce))
}
func TestGenerateNonceError(t *testing.T) {
// Save the original rand.Reader
originalRandReader := rand.Reader
defer func() { rand.Reader = originalRandReader }()
// Replace rand.Reader with a faulty reader
rand.Reader = &faultyReader{}
nonce, err := GenerateNonce()
require.Error(t, err)
require.Nil(t, nonce)
}
type faultyReader struct{}
func (f *faultyReader) Read(p []byte) (n int, err error) {
return 0, io.ErrUnexpectedEOF
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment