ftp_directory_listing_parser_vms_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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_directory_listing_parser_unittest.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_split.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_directory_listing_parser_vms.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef FtpDirectoryListingParserTest FtpDirectoryListingParserVmsTest; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FtpDirectoryListingParserVmsTest, Good) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct SingleLineTestData good_cases[] = { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "README.TXT;4 2 18-APR-2000 10:40:39.90", 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "readme.txt", 1024, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2000, 4, 18, 10, 40 }, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ".WELCOME;1 2 13-FEB-2002 23:32:40.47", 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, ".welcome", 1024, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2002, 2, 13, 23, 32 }, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "FILE.;1 2 13-FEB-2002 23:32:40.47", 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "file.", 1024, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2002, 2, 13, 23, 32 }, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "EXAMPLE.TXT;1 1 4-NOV-2009 06:02 [JOHNDOE] (RWED,RWED,,)", 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "example.txt", 512, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2009, 11, 4, 6, 2 }, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ANNOUNCE.TXT;2 1/16 12-MAR-2005 08:44:57 [SYSTEM] (RWED,RWED,RE,RE)", 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "announce.txt", 512, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005, 3, 12, 8, 44 }, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "TEST.DIR;1 1 4-MAR-1999 22:14:34 [UCX$NOBO,ANONYMOUS] (RWE,RWE,RWE,RWE)", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::DIRECTORY, "test", -1, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1999, 3, 4, 22, 14 }, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ANNOUNCE.TXT;2 1 12-MAR-2005 08:44:57 [X] (,,,)", 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "announce.txt", 512, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005, 3, 12, 8, 44 }, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ANNOUNCE.TXT;2 1 12-MAR-2005 08:44:57 [X] (R,RW,RWD,RE)", 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "announce.txt", 512, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005, 3, 12, 8, 44 }, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ANNOUNCE.TXT;2 1 12-MAR-2005 08:44:57 [X] (ED,RED,WD,WED)", 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FtpDirectoryListingEntry::FILE, "announce.txt", 512, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005, 3, 12, 8, 44 }, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(good_cases); i++) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_cases[i].input)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> lines(GetSingleLineTestCase(good_cases[i].input)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parser requires a directory header before accepting regular input. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.begin(), 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Directory ANONYMOUS_ROOT:[000000]")); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A valid listing must also have a "Total" line at the end. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.end(), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Total of 1 file, 2 blocks.")); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FtpDirectoryListingEntry> entries; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ParseFtpDirectoryListingVms(lines, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &entries)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifySingleLineTestCase(good_cases[i], entries); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FtpDirectoryListingParserVmsTest, Bad) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* bad_cases[] = { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "garbage", 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Missing file version number. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT 2 18-APR-2000 10:40:39", 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Missing extension. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README;1 2 18-APR-2000 10:40:39", 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Malformed file size. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 garbage 18-APR-2000 10:40:39", 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 -2 18-APR-2000 10:40:39", 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Malformed date. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 2 APR-2000 10:40:39", 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 2 -18-APR-2000 10:40:39", 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 2 18-APR 10:40:39", 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 2 18-APR-2000 10", 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 2 18-APR-2000 10:40.25", 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "README.TXT;1 2 18-APR-2000 10:40.25.25", 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Malformed security information. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 (RWED,RWED,RE,RE)", 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [SYSTEM]", 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 (SYSTEM) (RWED,RWED,RE,RE)", 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [SYSTEM] [RWED,RWED,RE,RE]", 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED)", 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RWED,RE,RE,RE)", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RWEDRWED,RE,RE)", 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,DEWR,RE,RE)", 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RWED,Q,RE)", 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "X.TXT;2 1 12-MAR-2005 08:44:57 [X] (RWED,RRWWEEDD,RE,RE)", 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(bad_cases); i++) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i, bad_cases[i])); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> lines(GetSingleLineTestCase(bad_cases[i])); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parser requires a directory header before accepting regular input. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.begin(), 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Directory ANONYMOUS_ROOT:[000000]")); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A valid listing must also have a "Total" line at the end. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.end(), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Total of 1 file, 2 blocks.")); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FtpDirectoryListingEntry> entries; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ParseFtpDirectoryListingVms(lines, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &entries)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FtpDirectoryListingParserVmsTest, BadDataAfterFooter) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* bad_cases[] = { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "garbage", 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Total of 1 file, 2 blocks.", 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Directory ANYNYMOUS_ROOT:[000000]", 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(bad_cases); i++) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i, bad_cases[i])); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> lines( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSingleLineTestCase("README.TXT;4 2 18-APR-2000 10:40:39.90")); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parser requires a directory header before accepting regular input. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.begin(), 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Directory ANONYMOUS_ROOT:[000000]")); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A valid listing must also have a "Total" line at the end. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.end(), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Total of 1 file, 2 blocks.")); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the listing is valid before we add data after footer. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FtpDirectoryListingEntry> entries; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ParseFtpDirectoryListingVms(lines, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &entries)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a line at the end of the listing that should make it invalid. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines.insert(lines.end(), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16(bad_cases[i])); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FtpDirectoryListingEntry> entries; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ParseFtpDirectoryListingVms(lines, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &entries)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 165