github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/filesystem/chunk/backoff/backoff_test.go (about)

     1  package backoff
     2  
     3  import (
     4  	"errors"
     5  	"github.com/stretchr/testify/assert"
     6  	"net/http"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  func TestConstantBackoff_Next(t *testing.T) {
    12  	a := assert.New(t)
    13  
    14  	// General error
    15  	{
    16  		err := errors.New("error")
    17  		b := &ConstantBackoff{Sleep: time.Duration(0), Max: 3}
    18  		a.True(b.Next(err))
    19  		a.True(b.Next(err))
    20  		a.True(b.Next(err))
    21  		a.False(b.Next(err))
    22  		b.Reset()
    23  		a.True(b.Next(err))
    24  		a.True(b.Next(err))
    25  		a.True(b.Next(err))
    26  		a.False(b.Next(err))
    27  	}
    28  
    29  	// Retryable error
    30  	{
    31  		err := &RetryableError{RetryAfter: time.Duration(1)}
    32  		b := &ConstantBackoff{Sleep: time.Duration(0), Max: 3}
    33  		a.True(b.Next(err))
    34  		a.True(b.Next(err))
    35  		a.True(b.Next(err))
    36  		a.False(b.Next(err))
    37  		b.Reset()
    38  		a.True(b.Next(err))
    39  		a.True(b.Next(err))
    40  		a.True(b.Next(err))
    41  		a.False(b.Next(err))
    42  	}
    43  
    44  }
    45  
    46  func TestNewRetryableErrorFromHeader(t *testing.T) {
    47  	a := assert.New(t)
    48  	// no retry-after header
    49  	{
    50  		err := NewRetryableErrorFromHeader(nil, http.Header{})
    51  		a.Empty(err.RetryAfter)
    52  	}
    53  
    54  	// with retry-after header
    55  	{
    56  		header := http.Header{}
    57  		header.Add("retry-after", "120")
    58  		err := NewRetryableErrorFromHeader(nil, header)
    59  		a.EqualValues(time.Duration(120)*time.Second, err.RetryAfter)
    60  	}
    61  }