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  }