github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/b2/b2_internal_test.go (about) 1 package b2 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/rclone/rclone/fstest" 8 ) 9 10 // Test b2 string encoding 11 // https://www.backblaze.com/b2/docs/string_encoding.html 12 13 var encodeTest = []struct { 14 fullyEncoded string 15 minimallyEncoded string 16 plainText string 17 }{ 18 {fullyEncoded: "%20", minimallyEncoded: "+", plainText: " "}, 19 {fullyEncoded: "%21", minimallyEncoded: "!", plainText: "!"}, 20 {fullyEncoded: "%22", minimallyEncoded: "%22", plainText: "\""}, 21 {fullyEncoded: "%23", minimallyEncoded: "%23", plainText: "#"}, 22 {fullyEncoded: "%24", minimallyEncoded: "$", plainText: "$"}, 23 {fullyEncoded: "%25", minimallyEncoded: "%25", plainText: "%"}, 24 {fullyEncoded: "%26", minimallyEncoded: "%26", plainText: "&"}, 25 {fullyEncoded: "%27", minimallyEncoded: "'", plainText: "'"}, 26 {fullyEncoded: "%28", minimallyEncoded: "(", plainText: "("}, 27 {fullyEncoded: "%29", minimallyEncoded: ")", plainText: ")"}, 28 {fullyEncoded: "%2A", minimallyEncoded: "*", plainText: "*"}, 29 {fullyEncoded: "%2B", minimallyEncoded: "%2B", plainText: "+"}, 30 {fullyEncoded: "%2C", minimallyEncoded: "%2C", plainText: ","}, 31 {fullyEncoded: "%2D", minimallyEncoded: "-", plainText: "-"}, 32 {fullyEncoded: "%2E", minimallyEncoded: ".", plainText: "."}, 33 {fullyEncoded: "%2F", minimallyEncoded: "/", plainText: "/"}, 34 {fullyEncoded: "%30", minimallyEncoded: "0", plainText: "0"}, 35 {fullyEncoded: "%31", minimallyEncoded: "1", plainText: "1"}, 36 {fullyEncoded: "%32", minimallyEncoded: "2", plainText: "2"}, 37 {fullyEncoded: "%33", minimallyEncoded: "3", plainText: "3"}, 38 {fullyEncoded: "%34", minimallyEncoded: "4", plainText: "4"}, 39 {fullyEncoded: "%35", minimallyEncoded: "5", plainText: "5"}, 40 {fullyEncoded: "%36", minimallyEncoded: "6", plainText: "6"}, 41 {fullyEncoded: "%37", minimallyEncoded: "7", plainText: "7"}, 42 {fullyEncoded: "%38", minimallyEncoded: "8", plainText: "8"}, 43 {fullyEncoded: "%39", minimallyEncoded: "9", plainText: "9"}, 44 {fullyEncoded: "%3A", minimallyEncoded: ":", plainText: ":"}, 45 {fullyEncoded: "%3B", minimallyEncoded: ";", plainText: ";"}, 46 {fullyEncoded: "%3C", minimallyEncoded: "%3C", plainText: "<"}, 47 {fullyEncoded: "%3D", minimallyEncoded: "=", plainText: "="}, 48 {fullyEncoded: "%3E", minimallyEncoded: "%3E", plainText: ">"}, 49 {fullyEncoded: "%3F", minimallyEncoded: "%3F", plainText: "?"}, 50 {fullyEncoded: "%40", minimallyEncoded: "@", plainText: "@"}, 51 {fullyEncoded: "%41", minimallyEncoded: "A", plainText: "A"}, 52 {fullyEncoded: "%42", minimallyEncoded: "B", plainText: "B"}, 53 {fullyEncoded: "%43", minimallyEncoded: "C", plainText: "C"}, 54 {fullyEncoded: "%44", minimallyEncoded: "D", plainText: "D"}, 55 {fullyEncoded: "%45", minimallyEncoded: "E", plainText: "E"}, 56 {fullyEncoded: "%46", minimallyEncoded: "F", plainText: "F"}, 57 {fullyEncoded: "%47", minimallyEncoded: "G", plainText: "G"}, 58 {fullyEncoded: "%48", minimallyEncoded: "H", plainText: "H"}, 59 {fullyEncoded: "%49", minimallyEncoded: "I", plainText: "I"}, 60 {fullyEncoded: "%4A", minimallyEncoded: "J", plainText: "J"}, 61 {fullyEncoded: "%4B", minimallyEncoded: "K", plainText: "K"}, 62 {fullyEncoded: "%4C", minimallyEncoded: "L", plainText: "L"}, 63 {fullyEncoded: "%4D", minimallyEncoded: "M", plainText: "M"}, 64 {fullyEncoded: "%4E", minimallyEncoded: "N", plainText: "N"}, 65 {fullyEncoded: "%4F", minimallyEncoded: "O", plainText: "O"}, 66 {fullyEncoded: "%50", minimallyEncoded: "P", plainText: "P"}, 67 {fullyEncoded: "%51", minimallyEncoded: "Q", plainText: "Q"}, 68 {fullyEncoded: "%52", minimallyEncoded: "R", plainText: "R"}, 69 {fullyEncoded: "%53", minimallyEncoded: "S", plainText: "S"}, 70 {fullyEncoded: "%54", minimallyEncoded: "T", plainText: "T"}, 71 {fullyEncoded: "%55", minimallyEncoded: "U", plainText: "U"}, 72 {fullyEncoded: "%56", minimallyEncoded: "V", plainText: "V"}, 73 {fullyEncoded: "%57", minimallyEncoded: "W", plainText: "W"}, 74 {fullyEncoded: "%58", minimallyEncoded: "X", plainText: "X"}, 75 {fullyEncoded: "%59", minimallyEncoded: "Y", plainText: "Y"}, 76 {fullyEncoded: "%5A", minimallyEncoded: "Z", plainText: "Z"}, 77 {fullyEncoded: "%5B", minimallyEncoded: "%5B", plainText: "["}, 78 {fullyEncoded: "%5C", minimallyEncoded: "%5C", plainText: "\\"}, 79 {fullyEncoded: "%5D", minimallyEncoded: "%5D", plainText: "]"}, 80 {fullyEncoded: "%5E", minimallyEncoded: "%5E", plainText: "^"}, 81 {fullyEncoded: "%5F", minimallyEncoded: "_", plainText: "_"}, 82 {fullyEncoded: "%60", minimallyEncoded: "%60", plainText: "`"}, 83 {fullyEncoded: "%61", minimallyEncoded: "a", plainText: "a"}, 84 {fullyEncoded: "%62", minimallyEncoded: "b", plainText: "b"}, 85 {fullyEncoded: "%63", minimallyEncoded: "c", plainText: "c"}, 86 {fullyEncoded: "%64", minimallyEncoded: "d", plainText: "d"}, 87 {fullyEncoded: "%65", minimallyEncoded: "e", plainText: "e"}, 88 {fullyEncoded: "%66", minimallyEncoded: "f", plainText: "f"}, 89 {fullyEncoded: "%67", minimallyEncoded: "g", plainText: "g"}, 90 {fullyEncoded: "%68", minimallyEncoded: "h", plainText: "h"}, 91 {fullyEncoded: "%69", minimallyEncoded: "i", plainText: "i"}, 92 {fullyEncoded: "%6A", minimallyEncoded: "j", plainText: "j"}, 93 {fullyEncoded: "%6B", minimallyEncoded: "k", plainText: "k"}, 94 {fullyEncoded: "%6C", minimallyEncoded: "l", plainText: "l"}, 95 {fullyEncoded: "%6D", minimallyEncoded: "m", plainText: "m"}, 96 {fullyEncoded: "%6E", minimallyEncoded: "n", plainText: "n"}, 97 {fullyEncoded: "%6F", minimallyEncoded: "o", plainText: "o"}, 98 {fullyEncoded: "%70", minimallyEncoded: "p", plainText: "p"}, 99 {fullyEncoded: "%71", minimallyEncoded: "q", plainText: "q"}, 100 {fullyEncoded: "%72", minimallyEncoded: "r", plainText: "r"}, 101 {fullyEncoded: "%73", minimallyEncoded: "s", plainText: "s"}, 102 {fullyEncoded: "%74", minimallyEncoded: "t", plainText: "t"}, 103 {fullyEncoded: "%75", minimallyEncoded: "u", plainText: "u"}, 104 {fullyEncoded: "%76", minimallyEncoded: "v", plainText: "v"}, 105 {fullyEncoded: "%77", minimallyEncoded: "w", plainText: "w"}, 106 {fullyEncoded: "%78", minimallyEncoded: "x", plainText: "x"}, 107 {fullyEncoded: "%79", minimallyEncoded: "y", plainText: "y"}, 108 {fullyEncoded: "%7A", minimallyEncoded: "z", plainText: "z"}, 109 {fullyEncoded: "%7B", minimallyEncoded: "%7B", plainText: "{"}, 110 {fullyEncoded: "%7C", minimallyEncoded: "%7C", plainText: "|"}, 111 {fullyEncoded: "%7D", minimallyEncoded: "%7D", plainText: "}"}, 112 {fullyEncoded: "%7E", minimallyEncoded: "~", plainText: "~"}, 113 {fullyEncoded: "%7F", minimallyEncoded: "%7F", plainText: "\u007f"}, 114 {fullyEncoded: "%E8%87%AA%E7%94%B1", minimallyEncoded: "%E8%87%AA%E7%94%B1", plainText: "自由"}, 115 {fullyEncoded: "%F0%90%90%80", minimallyEncoded: "%F0%90%90%80", plainText: "𐐀"}, 116 } 117 118 func TestUrlEncode(t *testing.T) { 119 for _, test := range encodeTest { 120 got := urlEncode(test.plainText) 121 if got != test.minimallyEncoded && got != test.fullyEncoded { 122 t.Errorf("urlEncode(%q) got %q wanted %q or %q", test.plainText, got, test.minimallyEncoded, test.fullyEncoded) 123 } 124 } 125 } 126 127 func TestTimeString(t *testing.T) { 128 for _, test := range []struct { 129 in time.Time 130 want string 131 }{ 132 {fstest.Time("1970-01-01T00:00:00.000000000Z"), "0"}, 133 {fstest.Time("2001-02-03T04:05:10.123123123Z"), "981173110123"}, 134 {fstest.Time("2001-02-03T05:05:10.123123123+01:00"), "981173110123"}, 135 } { 136 got := timeString(test.in) 137 if test.want != got { 138 t.Logf("%v: want %v got %v", test.in, test.want, got) 139 } 140 } 141 142 } 143 144 func TestParseTimeString(t *testing.T) { 145 for _, test := range []struct { 146 in string 147 want time.Time 148 wantError string 149 }{ 150 {"0", fstest.Time("1970-01-01T00:00:00.000000000Z"), ""}, 151 {"981173110123", fstest.Time("2001-02-03T04:05:10.123000000Z"), ""}, 152 {"", time.Time{}, ""}, 153 {"potato", time.Time{}, `strconv.ParseInt: parsing "potato": invalid syntax`}, 154 } { 155 o := Object{} 156 err := o.parseTimeString(test.in) 157 got := o.modTime 158 var gotError string 159 if err != nil { 160 gotError = err.Error() 161 } 162 if test.want != got { 163 t.Logf("%v: want %v got %v", test.in, test.want, got) 164 } 165 if test.wantError != gotError { 166 t.Logf("%v: want error %v got error %v", test.in, test.wantError, gotError) 167 } 168 } 169 170 }