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