15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/stringprintf.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_directory_listing_parser.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FtpDirectoryListingParserTest 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public testing::TestWithParam<const char*> { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(FtpDirectoryListingParserTest, Parse) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_dir; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &test_dir); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dir = test_dir.AppendASCII("net"); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dir = test_dir.AppendASCII("data"); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dir = test_dir.AppendASCII("ftp"); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Exploded mock_current_time_exploded = { 0 }; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_current_time_exploded.year = 1994; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_current_time_exploded.month = 11; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_current_time_exploded.day_of_month = 15; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_current_time_exploded.hour = 12; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_current_time_exploded.minute = 45; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time mock_current_time( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::FromLocalExploded(mock_current_time_exploded)); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Test case: %s", GetParam())); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_listing; 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(test_dir.AppendASCII(GetParam()), 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &test_listing)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FtpDirectoryListingEntry> entries; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, ParseFtpDirectoryListing(test_listing, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_current_time, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &entries)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_listing; 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dir.AppendASCII(std::string(GetParam()) + ".expected"), 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &expected_listing)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> lines; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitStringUsingSubstr(expected_listing, "\r\n", &lines); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special case for empty listings. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lines.size() == 1 && lines[0].empty()) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines.clear(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(9 * entries.size(), lines.size()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < lines.size() / 9; i++) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string type(lines[9 * i]); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name(lines[9 * i + 1]); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 size; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt64(lines[9 * i + 2], &size); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Filename: %s", name.c_str())); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int year, month, day_of_month, hour, minute; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(lines[9 * i + 3], &year); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(lines[9 * i + 4], &month); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(lines[9 * i + 5], &day_of_month); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(lines[9 * i + 6], &hour); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(lines[9 * i + 7], &minute); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FtpDirectoryListingEntry& entry = entries[i]; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == "d") { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FtpDirectoryListingEntry::DIRECTORY, entry.type); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == "-") { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FtpDirectoryListingEntry::FILE, entry.type); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == "l") { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FtpDirectoryListingEntry::SYMLINK, entry.type); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "invalid gold test data: " << type; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16(name), entry.name); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size, entry.size); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Exploded time_exploded; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.last_modified.LocalExplode(&time_exploded); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(year, time_exploded.year); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(month, time_exploded.month); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(day_of_month, time_exploded.day_of_month); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(hour, time_exploded.hour); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(minute, time_exploded.minute); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kTestFiles[] = { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-1", 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-1-utf8", 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-2", 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-3", 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-4", 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-5", 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-6", 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-7", 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-8", 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-9", 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-10", 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-11", 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-12", 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-13", 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-14", 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-15", 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-16", 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-17", 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-18", 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-19", 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-20", // TODO(phajdan.jr): should use windows-1251 encoding. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-21", // TODO(phajdan.jr): should use windows-1251 encoding. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-22", // TODO(phajdan.jr): should use windows-1251 encoding. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-23", 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-24", 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests for Russian listings. The only difference between those 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // files is character encoding: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-25", // UTF-8 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-26", // KOI8-R 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-27", // windows-1251 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-28", // Hylafax FTP server 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-ls-29", 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dir-listing-ls-30", 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dir-listing-ls-31", 1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) "dir-listing-ls-32", // busybox 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-netware-1", 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-netware-2", 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dir-listing-netware-3", // Spaces in file names. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-os2-1", 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-vms-1", 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-vms-2", 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-vms-3", 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-vms-4", 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-vms-5", 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dir-listing-vms-6", 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dir-listing-vms-7", 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dir-listing-vms-8", 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-windows-1", 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dir-listing-windows-2", 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(, FtpDirectoryListingParserTest, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::ValuesIn(kTestFiles)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 168