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