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 }