github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/swift/swift_internal_test.go (about)

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