github.com/argoproj/argo-cd/v3@v3.2.1/util/session/sessionmanager_norace_test.go (about)

     1  //go:build !race
     2  // +build !race
     3  
     4  package session
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/argoproj/argo-cd/v3/util/settings"
    14  )
    15  
    16  func TestRandomPasswordVerificationDelay(t *testing.T) {
    17  	// !race:
    18  	// `SessionManager.VerifyUsernamePassword` uses bcrypt to prevent against time-based attacks
    19  	// and verify the hashed password; however this is a CPU intensive algorithm that is made
    20  	// significantly slower due to data race detection being enabled, which breaks through
    21  	// the maximum time limit required by `TestRandomPasswordVerificationDelay`.
    22  
    23  	var sleptFor time.Duration
    24  	settingsMgr := settings.NewSettingsManager(t.Context(), getKubeClient(t, "password", true), "argocd")
    25  	mgr := newSessionManager(settingsMgr, getProjLister(), NewUserStateStorage(nil))
    26  	mgr.verificationDelayNoiseEnabled = true
    27  	mgr.sleep = func(d time.Duration) {
    28  		sleptFor = d
    29  	}
    30  	for i := 0; i < 10; i++ {
    31  		sleptFor = 0
    32  		start := time.Now()
    33  		require.NoError(t, mgr.VerifyUsernamePassword("admin", "password"))
    34  		totalDuration := time.Since(start) + sleptFor
    35  		assert.GreaterOrEqual(t, totalDuration.Nanoseconds(), verificationDelayNoiseMin.Nanoseconds())
    36  		assert.LessOrEqual(t, totalDuration.Nanoseconds(), verificationDelayNoiseMax.Nanoseconds())
    37  	}
    38  }