1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_util.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/format_macros.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpUtilTest, UnixFilePathToVMS) {
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* input;
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* expected_output;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } kTestCases[] = {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "",           ""            },
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/",          "[]"          },
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a",         "a"           },
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b",       "a:[000000]b" },
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c",     "a:[b]c"      },
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/d",   "a:[b.c]d"    },
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/d/e", "a:[b.c.d]e"  },
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a",          "a"           },
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b",        "[.a]b"       },
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/c",      "[.a.b]c"     },
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/c/d",    "[.a.b.c]d"   },
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_output,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              net::FtpUtil::UnixFilePathToVMS(kTestCases[i].input))
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        << kTestCases[i].input;
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpUtilTest, UnixDirectoryPathToVMS) {
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* input;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* expected_output;
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } kTestCases[] = {
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "",            ""            },
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/",           ""            },
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a",          "a:[000000]"  },
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/",         "a:[000000]"  },
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b",        "a:[b]"       },
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/",       "a:[b]"       },
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c",      "a:[b.c]"     },
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/",     "a:[b.c]"     },
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/d",    "a:[b.c.d]"   },
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/d/",   "a:[b.c.d]"   },
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/d/e",  "a:[b.c.d.e]" },
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "/a/b/c/d/e/", "a:[b.c.d.e]" },
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a",           "[.a]"        },
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/",          "[.a]"        },
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b",         "[.a.b]"      },
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/",        "[.a.b]"      },
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/c",       "[.a.b.c]"    },
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/c/",      "[.a.b.c]"    },
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/c/d",     "[.a.b.c.d]"  },
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a/b/c/d/",    "[.a.b.c.d]"  },
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_output,
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              net::FtpUtil::UnixDirectoryPathToVMS(kTestCases[i].input))
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        << kTestCases[i].input;
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpUtilTest, VMSPathToUnix) {
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* input;
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* expected_output;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } kTestCases[] = {
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "",            "."          },
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[]",          "/"          },
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a",           "/a"         },
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[000000]",  "/a"         },
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[000000]b", "/a/b"       },
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b]",       "/a/b"       },
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b]c",      "/a/b/c"     },
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b.c]",     "/a/b/c"     },
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b.c]d",    "/a/b/c/d"   },
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b.c.d]",   "/a/b/c/d"   },
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b.c.d]e",  "/a/b/c/d/e" },
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "a:[b.c.d.e]", "/a/b/c/d/e" },
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a]",        "a"          },
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a]b",       "a/b"        },
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a.b]",      "a/b"        },
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a.b]c",     "a/b/c"      },
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a.b.c]",    "a/b/c"      },
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a.b.c]d",   "a/b/c/d"    },
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "[.a.b.c.d]",  "a/b/c/d"    },
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "[.",          ""           },
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_output,
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              net::FtpUtil::VMSPathToUnix(kTestCases[i].input))
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        << kTestCases[i].input;
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpUtilTest, LsDateListingToTime) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time mock_current_time;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(base::Time::FromString(L"Tue, 15 Nov 1994 12:45:26 GMT",
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     &mock_current_time));
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Input.
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* month;
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* day;
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* rest;
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Expected output.
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int expected_year;
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int expected_month;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int expected_day_of_month;
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int expected_hour;
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int expected_minute;
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } kTestCases[] = {
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "Nov", "01", "2007", 2007, 11, 1, 0, 0 },
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Jul", "25", "13:37", 1994, 7, 25, 13, 37 },
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Test date listings in German.
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "M\xc3\xa4r", "13", "2009", 2009, 3, 13, 0, 0 },
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Mai", "1", "10:10", 1994, 5, 1, 10, 10 },
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Okt", "14", "21:18", 1994, 10, 14, 21, 18 },
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "Dez", "25", "2008", 2008, 12, 25, 0, 0 },
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Test date listings in Russian.
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd1\x8f\xd0\xbd\xd0\xb2", "1", "2011", 2011, 1, 1, 0, 0 },
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd1\x84\xd0\xb5\xd0\xb2", "1", "2011", 2011, 2, 1, 0, 0 },
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xbc\xd0\xb0\xd1\x80", "1", "2011", 2011, 3, 1, 0, 0 },
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xb0\xd0\xbf\xd1\x80", "1", "2011", 2011, 4, 1, 0, 0 },
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xbc\xd0\xb0\xd0\xb9", "1", "2011", 2011, 5, 1, 0, 0 },
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xb8\xd1\x8e\xd0\xbd", "1", "2011", 2011, 6, 1, 0, 0 },
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xb8\xd1\x8e\xd0\xbb", "1", "2011", 2011, 7, 1, 0, 0 },
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xb0\xd0\xb2\xd0\xb3", "1", "2011", 2011, 8, 1, 0, 0 },
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd1\x81\xd0\xb5\xd0\xbd", "1", "2011", 2011, 9, 1, 0, 0 },
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xbe\xd0\xba\xd1\x82", "1", "2011", 2011, 10, 1, 0, 0 },
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xbd\xd0\xbe\xd1\x8f", "1", "2011", 2011, 11, 1, 0, 0 },
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "\xd0\xb4\xd0\xb5\xd0\xba", "1", "2011", 2011, 12, 1, 0, 0 },
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Test current year detection.
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Nov", "01", "12:00", 1994, 11, 1, 12, 0 },
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Nov", "15", "12:00", 1994, 11, 15, 12, 0 },
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Nov", "16", "12:00", 1993, 11, 16, 12, 0 },
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Jan", "01", "08:30", 1994, 1, 1, 8, 30 },
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Sep", "02", "09:00", 1994, 9, 2, 9, 0 },
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    { "Dec", "06", "21:00", 1993, 12, 6, 21, 0 },
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s %s %s", i,
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    kTestCases[i].month, kTestCases[i].day,
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    kTestCases[i].rest));
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    base::Time time;
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(net::FtpUtil::LsDateListingToTime(
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        UTF8ToUTF16(kTestCases[i].month), UTF8ToUTF16(kTestCases[i].day),
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        UTF8ToUTF16(kTestCases[i].rest), mock_current_time, &time));
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    base::Time::Exploded time_exploded;
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    time.LocalExplode(&time_exploded);
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_year, time_exploded.year);
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_month, time_exploded.month);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_day_of_month, time_exploded.day_of_month);
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_hour, time_exploded.hour);
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(kTestCases[i].expected_minute, time_exploded.minute);
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, time_exploded.second);
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, time_exploded.millisecond);
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(FtpUtilTest, GetStringPartAfterColumns) {
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* text;
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int column;
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* expected_result;
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } kTestCases[] = {
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "", 0, "" },
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "", 1, "" },
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "foo abc", 0, "foo abc" },
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "foo abc", 1, "abc" },
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "  foo   abc", 0, "foo   abc" },
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "  foo   abc", 1, "abc" },
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "  foo   abc", 2, "" },
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "  foo   abc ", 0, "foo   abc" },
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "  foo   abc ", 1, "abc" },
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "  foo   abc ", 2, "" },
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s %d", i,
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    kTestCases[i].text, kTestCases[i].column));
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(ASCIIToUTF16(kTestCases[i].expected_result),
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              net::FtpUtil::GetStringPartAfterColumns(
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                  ASCIIToUTF16(kTestCases[i].text), kTestCases[i].column));
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
206