github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/swift/swift_internal_test.go (about)

     1  package swift
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/ncw/swift/v2"
     9  	"github.com/rclone/rclone/fs/fserrors"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestInternalUrlEncode(t *testing.T) {
    14  	for _, test := range []struct {
    15  		in   string
    16  		want string
    17  	}{
    18  		{"", ""},
    19  		{"abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"},
    20  		{"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"},
    21  		{"0123456789", "0123456789"},
    22  		{"abc/ABC/123", "abc/ABC/123"},
    23  		{"   ", "%20%20%20"},
    24  		{"&", "%26"},
    25  		{"ߣ", "%C3%9F%C2%A3"},
    26  		{"Vidéo Potato Sausage?&£.mkv", "Vid%C3%A9o%20Potato%20Sausage%3F%26%C2%A3.mkv"},
    27  	} {
    28  		got := urlEncode(test.in)
    29  		if got != test.want {
    30  			t.Logf("%q: want %q got %q", test.in, test.want, got)
    31  		}
    32  	}
    33  }
    34  
    35  func TestInternalShouldRetryHeaders(t *testing.T) {
    36  	ctx := context.Background()
    37  	headers := swift.Headers{
    38  		"Content-Length": "64",
    39  		"Content-Type":   "text/html; charset=UTF-8",
    40  		"Date":           "Mon: 18 Mar 2019 12:11:23 GMT",
    41  		"Retry-After":    "1",
    42  	}
    43  	err := &swift.Error{
    44  		StatusCode: 429,
    45  		Text:       "Too Many Requests",
    46  	}
    47  
    48  	// Short sleep should just do the sleep
    49  	start := time.Now()
    50  	retry, gotErr := shouldRetryHeaders(ctx, headers, err)
    51  	dt := time.Since(start)
    52  	assert.True(t, retry)
    53  	assert.Equal(t, err, gotErr)
    54  	assert.True(t, dt > time.Second/2)
    55  
    56  	// Long sleep should return RetryError
    57  	headers["Retry-After"] = "3600"
    58  	start = time.Now()
    59  	retry, gotErr = shouldRetryHeaders(ctx, headers, err)
    60  	dt = time.Since(start)
    61  	assert.True(t, dt < time.Second)
    62  	assert.False(t, retry)
    63  	assert.Equal(t, true, fserrors.IsRetryAfterError(gotErr))
    64  	after := gotErr.(fserrors.RetryAfter).RetryAfter()
    65  	dt = after.Sub(start)
    66  	assert.True(t, dt >= time.Hour-time.Second && dt <= time.Hour+time.Second)
    67  
    68  }