15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h"
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF8ToUTF16;
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FtpUtilTest, UnixFilePathToVMS) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* input;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_output;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTestCases[] = {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "",           ""            },
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/",          "[]"          },
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a",         "a"           },
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b",       "a:[000000]b" },
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c",     "a:[b]c"      },
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/d",   "a:[b.c]d"    },
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/d/e", "a:[b.c.d]e"  },
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a",          "a"           },
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b",        "[.a]b"       },
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/c",      "[.a.b]c"     },
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/c/d",    "[.a.b.c]d"   },
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_output,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              net::FtpUtil::UnixFilePathToVMS(kTestCases[i].input))
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << kTestCases[i].input;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FtpUtilTest, UnixDirectoryPathToVMS) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* input;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_output;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTestCases[] = {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "",            ""            },
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/",           ""            },
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a",          "a:[000000]"  },
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/",         "a:[000000]"  },
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b",        "a:[b]"       },
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/",       "a:[b]"       },
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c",      "a:[b.c]"     },
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/",     "a:[b.c]"     },
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/d",    "a:[b.c.d]"   },
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/d/",   "a:[b.c.d]"   },
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/d/e",  "a:[b.c.d.e]" },
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "/a/b/c/d/e/", "a:[b.c.d.e]" },
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a",           "[.a]"        },
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/",          "[.a]"        },
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b",         "[.a.b]"      },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/",        "[.a.b]"      },
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/c",       "[.a.b.c]"    },
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/c/",      "[.a.b.c]"    },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/c/d",     "[.a.b.c.d]"  },
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a/b/c/d/",    "[.a.b.c.d]"  },
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_output,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              net::FtpUtil::UnixDirectoryPathToVMS(kTestCases[i].input))
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << kTestCases[i].input;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FtpUtilTest, VMSPathToUnix) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* input;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_output;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTestCases[] = {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "",            "."          },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[]",          "/"          },
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a",           "/a"         },
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[000000]",  "/a"         },
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[000000]b", "/a/b"       },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b]",       "/a/b"       },
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b]c",      "/a/b/c"     },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b.c]",     "/a/b/c"     },
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b.c]d",    "/a/b/c/d"   },
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b.c.d]",   "/a/b/c/d"   },
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b.c.d]e",  "/a/b/c/d/e" },
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a:[b.c.d.e]", "/a/b/c/d/e" },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a]",        "a"          },
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a]b",       "a/b"        },
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a.b]",      "a/b"        },
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a.b]c",     "a/b/c"      },
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a.b.c]",    "a/b/c"      },
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a.b.c]d",   "a/b/c/d"    },
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.a.b.c.d]",  "a/b/c/d"    },
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[.",          ""           },
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // UNIX emulation:
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "/",           "/"          },
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "/a",          "/a"         },
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "/a/b",        "/a/b"       },
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "/a/b/c",      "/a/b/c"     },
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "/a/b/c/d",    "/a/b/c/d"   },
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_output,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              net::FtpUtil::VMSPathToUnix(kTestCases[i].input))
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << kTestCases[i].input;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FtpUtilTest, LsDateListingToTime) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time mock_current_time;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::Time::FromString("Tue, 15 Nov 1994 12:45:26 GMT",
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &mock_current_time));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Input.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* month;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* day;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* rest;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected output.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_year;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_month;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_day_of_month;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_hour;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_minute;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTestCases[] = {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Nov", "01", "2007", 2007, 11, 1, 0, 0 },
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Jul", "25", "13:37", 1994, 7, 25, 13, 37 },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test date listings in German.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "M\xc3\xa4r", "13", "2009", 2009, 3, 13, 0, 0 },
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Mai", "1", "10:10", 1994, 5, 1, 10, 10 },
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Okt", "14", "21:18", 1994, 10, 14, 21, 18 },
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Dez", "25", "2008", 2008, 12, 25, 0, 0 },
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test date listings in Russian.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd1\x8f\xd0\xbd\xd0\xb2", "1", "2011", 2011, 1, 1, 0, 0 },
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd1\x84\xd0\xb5\xd0\xb2", "1", "2011", 2011, 2, 1, 0, 0 },
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xbc\xd0\xb0\xd1\x80", "1", "2011", 2011, 3, 1, 0, 0 },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xb0\xd0\xbf\xd1\x80", "1", "2011", 2011, 4, 1, 0, 0 },
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xbc\xd0\xb0\xd0\xb9", "1", "2011", 2011, 5, 1, 0, 0 },
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xb8\xd1\x8e\xd0\xbd", "1", "2011", 2011, 6, 1, 0, 0 },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xb8\xd1\x8e\xd0\xbb", "1", "2011", 2011, 7, 1, 0, 0 },
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xb0\xd0\xb2\xd0\xb3", "1", "2011", 2011, 8, 1, 0, 0 },
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd1\x81\xd0\xb5\xd0\xbd", "1", "2011", 2011, 9, 1, 0, 0 },
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xbe\xd0\xba\xd1\x82", "1", "2011", 2011, 10, 1, 0, 0 },
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xbd\xd0\xbe\xd1\x8f", "1", "2011", 2011, 11, 1, 0, 0 },
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "\xd0\xb4\xd0\xb5\xd0\xba", "1", "2011", 2011, 12, 1, 0, 0 },
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test current year detection.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Nov", "01", "12:00", 1994, 11, 1, 12, 0 },
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Nov", "15", "12:00", 1994, 11, 15, 12, 0 },
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Nov", "16", "12:00", 1993, 11, 16, 12, 0 },
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Jan", "01", "08:30", 1994, 1, 1, 8, 30 },
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Sep", "02", "09:00", 1994, 9, 2, 9, 0 },
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Dec", "06", "21:00", 1993, 12, 6, 21, 0 },
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s %s %s", i,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    kTestCases[i].month, kTestCases[i].day,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    kTestCases[i].rest));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time time;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(net::FtpUtil::LsDateListingToTime(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF8ToUTF16(kTestCases[i].month), UTF8ToUTF16(kTestCases[i].day),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF8ToUTF16(kTestCases[i].rest), mock_current_time, &time));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time::Exploded time_exploded;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time.LocalExplode(&time_exploded);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_year, time_exploded.year);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_month, time_exploded.month);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_day_of_month, time_exploded.day_of_month);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_hour, time_exploded.hour);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_minute, time_exploded.minute);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, time_exploded.second);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, time_exploded.millisecond);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FtpUtilTest, WindowsDateListingToTime) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Input.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* date;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* time;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected output.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_year;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_month;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_day_of_month;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_hour;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_minute;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTestCases[] = {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "11-01-07", "12:42", 2007, 11, 1, 12, 42 },
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "11-01-07", "12:42AM", 2007, 11, 1, 0, 42 },
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "11-01-07", "12:42PM", 2007, 11, 1, 12, 42 },
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "11-01-2007", "12:42", 2007, 11, 1, 12, 42 },
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s %s", i,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    kTestCases[i].date, kTestCases[i].time));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time time;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(net::FtpUtil::WindowsDateListingToTime(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    UTF8ToUTF16(kTestCases[i].date),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    UTF8ToUTF16(kTestCases[i].time),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &time));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time::Exploded time_exploded;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time.LocalExplode(&time_exploded);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_year, time_exploded.year);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_month, time_exploded.month);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_day_of_month, time_exploded.day_of_month);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_hour, time_exploded.hour);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestCases[i].expected_minute, time_exploded.minute);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, time_exploded.second);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, time_exploded.millisecond);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FtpUtilTest, GetStringPartAfterColumns) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* text;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int column;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_result;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTestCases[] = {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "", 0, "" },
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "", 1, "" },
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo abc", 0, "foo abc" },
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo abc", 1, "abc" },
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  foo   abc", 0, "foo   abc" },
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  foo   abc", 1, "abc" },
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  foo   abc", 2, "" },
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  foo   abc ", 0, "foo   abc" },
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  foo   abc ", 1, "abc" },
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  foo   abc ", 2, "" },
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s %d", i,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    kTestCases[i].text, kTestCases[i].column));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(kTestCases[i].expected_result),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              net::FtpUtil::GetStringPartAfterColumns(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ASCIIToUTF16(kTestCases[i].text), kTestCases[i].column));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
257