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 }