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"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_split.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_directory_listing_parser_vms.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentypedef FtpDirectoryListingParserTest FtpDirectoryListingParserVmsTest;
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FtpDirectoryListingParserVmsTest, Good) {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct SingleLineTestData good_cases[] = {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "README.TXT;4  2  18-APR-2000 10:40:39.90",
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "readme.txt", 1024,
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2000, 4, 18, 10, 40 },
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { ".WELCOME;1    2  13-FEB-2002 23:32:40.47",
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, ".welcome", 1024,
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2002, 2, 13, 23, 32 },
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "FILE.;1    2  13-FEB-2002 23:32:40.47",
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "file.", 1024,
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2002, 2, 13, 23, 32 },
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "EXAMPLE.TXT;1  1   4-NOV-2009 06:02 [JOHNDOE] (RWED,RWED,,)",
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "example.txt", 512,
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2009, 11, 4, 6, 2 },
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "ANNOUNCE.TXT;2 1/16 12-MAR-2005 08:44:57 [SYSTEM] (RWED,RWED,RE,RE)",
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "announce.txt", 512,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2005, 3, 12, 8, 44 },
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "TEST.DIR;1 1 4-MAR-1999 22:14:34 [UCX$NOBO,ANONYMOUS] (RWE,RWE,RWE,RWE)",
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::DIRECTORY, "test", -1,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      1999, 3, 4, 22, 14 },
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "ANNOUNCE.TXT;2 1 12-MAR-2005 08:44:57 [X] (,,,)",
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "announce.txt", 512,
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2005, 3, 12, 8, 44 },
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "ANNOUNCE.TXT;2 1 12-MAR-2005 08:44:57 [X] (R,RW,RWD,RE)",
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "announce.txt", 512,
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2005, 3, 12, 8, 44 },
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "ANNOUNCE.TXT;2 1 12-MAR-2005 08:44:57 [X] (ED,RED,WD,WED)",
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FtpDirectoryListingEntry::FILE, "announce.txt", 512,
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2005, 3, 12, 8, 44 },
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < arraysize(good_cases); i++) {
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    good_cases[i].input));
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<string16> lines(GetSingleLineTestCase(good_cases[i].input));
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // The parser requires a directory header before accepting regular input.
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    lines.insert(lines.begin(),
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 ASCIIToUTF16("Directory ANONYMOUS_ROOT:[000000]"));
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // A valid listing must also have a "Total" line at the end.
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    lines.insert(lines.end(),
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 ASCIIToUTF16("Total of 1 file, 2 blocks."));
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<FtpDirectoryListingEntry> entries;
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(ParseFtpDirectoryListingVms(lines,
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &entries));
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VerifySingleLineTestCase(good_cases[i], entries);
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FtpDirectoryListingParserVmsTest, Bad) {
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* bad_cases[] = {
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "garbage",
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Missing file version number.
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT 2 18-APR-2000 10:40:39",
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Missing extension.
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README;1 2 18-APR-2000 10:40:39",
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Malformed file size.
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 garbage 18-APR-2000 10:40:39",
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 -2 18-APR-2000 10:40:39",
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Malformed date.
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 2 APR-2000 10:40:39",
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 2 -18-APR-2000 10:40:39",
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 2 18-APR 10:40:39",
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 2 18-APR-2000 10",
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 2 18-APR-2000 10:40.25",
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "README.TXT;1 2 18-APR-2000 10:40.25.25",
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Malformed security information.
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 (RWED,RWED,RE,RE)",
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [SYSTEM]",
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 (SYSTEM) (RWED,RWED,RE,RE)",
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [SYSTEM] [RWED,RWED,RE,RE]",
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED)",
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RWED,RE,RE,RE)",
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RWEDRWED,RE,RE)",
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,DEWR,RE,RE)",
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RWED,Q,RE)",
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RRWWEEDD,RE,RE)",
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < arraysize(bad_cases); i++) {
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i, bad_cases[i]));
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<string16> lines(GetSingleLineTestCase(bad_cases[i]));
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // The parser requires a directory header before accepting regular input.
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    lines.insert(lines.begin(),
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 ASCIIToUTF16("Directory ANONYMOUS_ROOT:[000000]"));
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // A valid listing must also have a "Total" line at the end.
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    lines.insert(lines.end(),
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 ASCIIToUTF16("Total of 1 file, 2 blocks."));
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<FtpDirectoryListingEntry> entries;
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_FALSE(ParseFtpDirectoryListingVms(lines,
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             &entries));
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(FtpDirectoryListingParserVmsTest, BadDataAfterFooter) {
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const char* bad_cases[] = {
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "garbage",
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "Total of 1 file, 2 blocks.",
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "Directory ANYNYMOUS_ROOT:[000000]",
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < arraysize(bad_cases); i++) {
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i, bad_cases[i]));
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<string16> lines(
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        GetSingleLineTestCase("README.TXT;4  2  18-APR-2000 10:40:39.90"));
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // The parser requires a directory header before accepting regular input.
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    lines.insert(lines.begin(),
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 ASCIIToUTF16("Directory ANONYMOUS_ROOT:[000000]"));
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // A valid listing must also have a "Total" line at the end.
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    lines.insert(lines.end(),
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 ASCIIToUTF16("Total of 1 file, 2 blocks."));
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    {
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Make sure the listing is valid before we add data after footer.
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::vector<FtpDirectoryListingEntry> entries;
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_TRUE(ParseFtpDirectoryListingVms(lines,
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                              &entries));
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    {
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Insert a line at the end of the listing that should make it invalid.
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      lines.insert(lines.end(),
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   ASCIIToUTF16(bad_cases[i]));
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::vector<FtpDirectoryListingEntry> entries;
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_FALSE(ParseFtpDirectoryListingVms(lines,
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               &entries));
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace net
165