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_directory_listing_parser_unittest.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/format_macros.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_directory_listing_parser_windows.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentypedef FtpDirectoryListingParserTest FtpDirectoryListingParserWindowsTest;
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FtpDirectoryListingParserWindowsTest, Good) {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct SingleLineTestData good_cases[] = {
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "11-02-09  05:32PM       <DIR>          NT",
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::DIRECTORY, "NT", -1,
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2009, 11, 2, 17, 32 },
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-09  02:42PM                  458 Readme.txt",
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Readme.txt", 458,
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2009, 1, 6, 14, 42 },
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-09  02:42AM                  1 Readme.txt",
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Readme.txt", 1,
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2009, 1, 6, 2, 42 },
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-01  02:42AM                  458 Readme.txt",
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Readme.txt", 458,
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2001, 1, 6, 2, 42 },
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-00  02:42AM                  458 Corner1.txt",
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Corner1.txt", 458,
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2000, 1, 6, 2, 42 },
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-99  02:42AM                  458 Corner2.txt",
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Corner2.txt", 458,
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      1999, 1, 6, 2, 42 },
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-80  02:42AM                  458 Corner3.txt",
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Corner3.txt", 458,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      1980, 1, 6, 2, 42 },
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_LINUX)
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // TODO(phajdan.jr): Re-enable when 2038-year problem is fixed on Linux.
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-79  02:42AM                  458 Corner4",
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Corner4", 458,
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2079, 1, 6, 2, 42 },
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // !defined (OS_LINUX)
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "01-06-1979  02:42AM                458 Readme.txt",
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "Readme.txt", 458,
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      1979, 1, 6, 2, 42 },
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "11-02-09  05:32PM       <DIR>          My Directory",
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::DIRECTORY, "My Directory", -1,
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2009, 11, 2, 17, 32 },
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "12-25-10  12:00AM       <DIR>          Christmas Midnight",
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::DIRECTORY, "Christmas Midnight", -1,
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      2010, 12, 25, 0, 0 },
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "12-25-10  12:00PM       <DIR>          Christmas Midday",
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::DIRECTORY, "Christmas Midday", -1,
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      2010, 12, 25, 12, 0 },
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < arraysize(good_cases); i++) {
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    good_cases[i].input));
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<FtpDirectoryListingEntry> entries;
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(ParseFtpDirectoryListingWindows(
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        GetSingleLineTestCase(good_cases[i].input),
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        &entries));
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VerifySingleLineTestCase(good_cases[i], entries);
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(FtpDirectoryListingParserWindowsTest, Ignored) {
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const char* ignored_cases[] = {
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "12-07-10  12:05AM       <DIR>    ",  // http://crbug.com/66097
7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "12-07-10  12:05AM       1234    ",
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  };
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (size_t i = 0; i < arraysize(ignored_cases); i++) {
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                    ignored_cases[i]));
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<FtpDirectoryListingEntry> entries;
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(ParseFtpDirectoryListingWindows(
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    GetSingleLineTestCase(ignored_cases[i]),
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    &entries));
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(0U, entries.size());
8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FtpDirectoryListingParserWindowsTest, Bad) {
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* bad_cases[] = {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "garbage",
9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "11-02-09  05:32PM       <GARBAGE>",
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "11-02-09  05:32PM       <GARBAGE>      NT",
9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "11-02-09  05:32         <DIR>",
9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "11-FEB-09 05:32PM       <DIR>",
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "11-02     05:32PM       <DIR>",
9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "11-02-09  05:32PM                 -1",
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "11-02-09  05:32         <DIR>          NT",
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "11-FEB-09 05:32PM       <DIR>          NT",
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "11-02     05:32PM       <DIR>          NT",
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "11-02-09  05:32PM                 -1   NT",
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "99-25-10  12:00AM                  0",
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "12-99-10  12:00AM                  0",
10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "12-25-10  99:00AM                  0",
10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "12-25-10  12:99AM                  0",
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "12-25-10  12:00ZM                  0",
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "99-25-10  12:00AM                  0   months out of range",
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "12-99-10  12:00AM                  0   days out of range",
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "12-25-10  99:00AM                  0   hours out of range",
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "12-25-10  12:99AM                  0   minutes out of range",
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "12-25-10  12:00ZM                  0   what does ZM mean",
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < arraysize(bad_cases); i++) {
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    bad_cases[i]));
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<FtpDirectoryListingEntry> entries;
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_FALSE(ParseFtpDirectoryListingWindows(
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     GetSingleLineTestCase(bad_cases[i]),
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     &entries));
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace net
127