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 }