From d18ee63568d150d6e2d024b56ddc96af1ffdd580 Mon Sep 17 00:00:00 2001 From: "Arrobo, Gabriel" Date: Thu, 15 Oct 2026 13:29:15 -0700 Subject: [PATCH 1/2] Make retry/polling intervals overridable vars to speed up tests Signed-off-by: Arrobo, Gabriel --- nfregistration/nf_registration.go | 2 +- nfregistration/nf_registration_test.go | 5 +++++ polling/nf_configuration.go | 9 ++++++--- polling/nf_configuration_test.go | 6 ++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/nfregistration/nf_registration.go b/nfregistration/nf_registration.go index 569f16c..040c0e9 100644 --- a/nfregistration/nf_registration.go +++ b/nfregistration/nf_registration.go @@ -23,11 +23,11 @@ var ( keepAliveTimerMutex sync.Mutex registerCtxMutex sync.Mutex afterFunc = time.AfterFunc + retryTime = 10 * time.Second ) const ( defaultHeartbeatTimer int32 = 60 - retryTime = 10 * time.Second ) // StartNfRegistrationService starts the registration service. If the new config is empty, the NF diff --git a/nfregistration/nf_registration_test.go b/nfregistration/nf_registration_test.go index f15e9b3..f534991 100644 --- a/nfregistration/nf_registration_test.go +++ b/nfregistration/nf_registration_test.go @@ -246,12 +246,17 @@ func TestNfRegistrationService_WhenEmptyConfig_ThenContinuesListeningForUpdates( func TestNfRegistrationService_ConfigChanged_RetryIfRegisterNFFails(t *testing.T) { originalSendRegisterNFInstance := consumer.SendRegisterNFInstance + originalRetryTime := retryTime + retryTime = 20 * time.Millisecond ch := make(chan []models.PlmnId, 1) cancel, done := startRegistrationServiceForTest(t, ch) defer func() { cancel() <-done consumer.SendRegisterNFInstance = originalSendRegisterNFInstance + registerCtxMutex.Lock() + retryTime = originalRetryTime + registerCtxMutex.Unlock() withKeepAliveTimerLock(func() { stopKeepAliveTimer() }) diff --git a/polling/nf_configuration.go b/polling/nf_configuration.go index 2ec552a..1122d3b 100644 --- a/polling/nf_configuration.go +++ b/polling/nf_configuration.go @@ -19,11 +19,14 @@ import ( "github.com/omec-project/openapi/v2/models" ) -const ( +var ( initialPollingInterval = 5 * time.Second pollingMaxBackoff = 40 * time.Second - pollingBackoffFactor = 2 - pollingPath = "/nfconfig/plmn" +) + +const ( + pollingBackoffFactor = 2 + pollingPath = "/nfconfig/plmn" ) type nfConfigPoller struct { diff --git a/polling/nf_configuration_test.go b/polling/nf_configuration_test.go index 9943d0c..10ca05e 100644 --- a/polling/nf_configuration_test.go +++ b/polling/nf_configuration_test.go @@ -39,6 +39,8 @@ func startPollingServiceForTest(t *testing.T, ch chan<- []models.PlmnId) (contex func TestStartPollingService_Success(t *testing.T) { originalFetchPlmnConfig := fetchPlmnConfig + originalInterval := initialPollingInterval + initialPollingInterval = 20 * time.Millisecond expectedConfig := []models.PlmnId{{Mcc: "001", Mnc: "01"}} fetchPlmnConfig = func(poller *nfConfigPoller, pollingEndpoint string) ([]models.PlmnId, error) { @@ -50,6 +52,7 @@ func TestStartPollingService_Success(t *testing.T) { cancel() <-done fetchPlmnConfig = originalFetchPlmnConfig + initialPollingInterval = originalInterval }() time.Sleep(initialPollingInterval) @@ -66,6 +69,8 @@ func TestStartPollingService_Success(t *testing.T) { func TestStartPollingService_RetryAfterFailure(t *testing.T) { originalFetchPlmnConfig := fetchPlmnConfig + originalInterval := initialPollingInterval + initialPollingInterval = 20 * time.Millisecond var callCount atomic.Int32 fetchPlmnConfig = func(poller *nfConfigPoller, pollingEndpoint string) ([]models.PlmnId, error) { @@ -76,6 +81,7 @@ func TestStartPollingService_RetryAfterFailure(t *testing.T) { cancel, done := startPollingServiceForTest(t, plmnChan) defer func() { fetchPlmnConfig = originalFetchPlmnConfig + initialPollingInterval = originalInterval }() time.Sleep(4 * initialPollingInterval) From 7730982db888a9d52330ce3014f9807b57fa1c93 Mon Sep 17 00:00:00 2001 From: "Arrobo, Gabriel" Date: Thu, 15 Oct 2026 13:48:42 -0700 Subject: [PATCH 2/2] Address review comments Signed-off-by: Arrobo, Gabriel --- polling/nf_configuration_test.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/polling/nf_configuration_test.go b/polling/nf_configuration_test.go index 10ca05e..0336ffa 100644 --- a/polling/nf_configuration_test.go +++ b/polling/nf_configuration_test.go @@ -80,17 +80,27 @@ func TestStartPollingService_RetryAfterFailure(t *testing.T) { plmnChan := make(chan []models.PlmnId, 1) cancel, done := startPollingServiceForTest(t, plmnChan) defer func() { + cancel() + <-done fetchPlmnConfig = originalFetchPlmnConfig initialPollingInterval = originalInterval }() - time.Sleep(4 * initialPollingInterval) - cancel() - <-done - - if callCount.Load() < 2 { - t.Error("Expected to retry after failure") + deadline := time.After(2 * time.Second) + ticker := time.NewTicker(time.Millisecond) + defer ticker.Stop() +waitForRetry: + for { + select { + case <-ticker.C: + if callCount.Load() >= 2 { + break waitForRetry + } + case <-deadline: + t.Fatal("Timed out waiting for retry after failure") + } } + t.Logf("Tried %v times", callCount.Load()) }