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"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_directory_listing_parser_ls.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef FtpDirectoryListingParserTest FtpDirectoryListingParserLsTest;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FtpDirectoryListingParserLsTest, Good) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct SingleLineTestData good_cases[] = {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-rw-r--r--    1 ftp      ftp           528 Nov 01  2007 README",
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "README", 528,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2007, 11, 1, 0, 0 },
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxr-xr-x    3 ftp      ftp          4096 May 15 18:11 directory",
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "directory", -1,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1994, 5, 15, 18, 11 },
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "lrwxrwxrwx 1 0  0 26 Sep 18 2008 pub -> vol/1/.CLUSTER/var_ftp/pub",
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::SYMLINK, "pub", -1,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2008, 9, 18, 0, 0 },
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "lrwxrwxrwx 1 0  0 3 Oct 12 13:37 mirror -> pub",
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::SYMLINK, "mirror", -1,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1994, 10, 12, 13, 37 },
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxrwsr-x    4 501      501          4096 Feb 20  2007 pub",
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "pub", -1,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2007, 2, 20, 0, 0 },
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxr-xr-x   4 (?)      (?)          4096 Apr  8  2007 jigdo",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "jigdo", -1,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2007, 4, 8, 0, 0 },
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwx-wx-wt  2 root  wheel  512 Jul  1 02:15 incoming",
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "incoming", -1,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1994, 7, 1, 2, 15 },
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-rw-r--r-- 1 2 3 3447432 May 18  2009 Foo - Manual.pdf",
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "Foo - Manual.pdf", 3447432,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2009, 5, 18, 0, 0 },
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "d-wx-wx-wt+  4 ftp      989          512 Dec  8 15:54 incoming",
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "incoming", -1,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1993, 12, 8, 15, 54 },
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxrwxrwx   1 owner    group               1024 Sep 13  0:30 audio",
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "audio", -1,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1994, 9, 13, 0, 30 },
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "lrwxrwxrwx 1 0  0 26 Sep 18 2008 pub",
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::SYMLINK, "pub", -1,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2008, 9, 18, 0, 0 },
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-rw-r--r--    1 ftp      ftp           -528 Nov 01  2007 README",
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "README", -1,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2007, 11, 1, 0, 0 },
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for the wu-ftpd variant:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxr-xr-x   2 sys          512 Mar 27  2009 pub",
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "pub", -1,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2009, 3, 27, 0, 0 },
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "lrwxrwxrwx 0  0 26 Sep 18 2008 pub -> vol/1/.CLUSTER/var_ftp/pub",
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::SYMLINK, "pub", -1,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2008, 9, 18, 0, 0 },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxr-xr-x   (?)      (?)          4096 Apr  8  2007 jigdo",
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "jigdo", -1,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2007, 4, 8, 0, 0 },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-rw-r--r-- 2 3 3447432 May 18  2009 Foo - Manual.pdf",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "Foo - Manual.pdf", 3447432,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2009, 5, 18, 0, 0 },
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for "ls -l" style listings sent by an OS/2 server (FtpServer):
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-r--r--r--  1 ftp      -A---       13274 Mar  1  2006 UpTime.exe",
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "UpTime.exe", 13274,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2006, 3, 1, 0, 0 },
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "dr--r--r--  1 ftp      -----           0 Nov 17 17:08 kernels",
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "kernels", -1,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1993, 11, 17, 17, 8 },
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for "ls -l" style listing sent by Xplain FTP Server.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxr-xr-x               folder        0 Jul 17  2006 online",
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "online", -1,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2006, 7, 17, 0, 0 },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for "ls -l" style listing with owning group name
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // not separated from file size (http://crbug.com/58963).
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-rw-r--r-- 1 ftpadmin ftpadmin125435904 Apr  9  2008 .pureftpd-upload",
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, ".pureftpd-upload", 0,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2008, 4, 9, 0, 0 },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for "ls -l" style listing with number of links
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // not separated from permission listing (http://crbug.com/70394).
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxr-xr-x1732 266      111        90112 Jun 21  2001 .rda_2",
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, ".rda_2", -1,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2001, 6, 21, 0, 0 },
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for "ls -l" style listing with group name containing spaces.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxrwxr-x   3 %%%%     Domain Users     4096 Dec  9  2009 %%%%%",
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "%%%%%", -1,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2009, 12, 9, 0, 0 },
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests for "ls -l" style listing in Russian locale (note the swapped
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // parts order: the day of month is the first, before month).
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "-rwxrwxr-x 1 ftp ftp 123 23 \xd0\xbc\xd0\xb0\xd0\xb9 2011 test",
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "test", 123,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2011, 5, 23, 0, 0 },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxrwxr-x 1 ftp ftp 4096 19 \xd0\xbe\xd0\xba\xd1\x82 2011 dir",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "dir", -1,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2011, 10, 19, 0, 0 },
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Plan9 sends entry type "a" for append-only files.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ar-xr-xr-x   2 none     none         512 Apr 26 17:52 plan9",
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::FILE, "plan9", 512,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1994, 4, 26, 17, 52 },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hylafax sends a shorter permission listing.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "drwxrwx   2       10     4096 Jul 28 02:41 tmp",
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "tmp", -1,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1994, 7, 28, 2, 41 },
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Completely different date format (YYYY-MM-DD).
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "drwxrwxrwx 2 root root  4096 2012-02-07 00:31 notas_servico",
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "notas_servico", -1,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2012, 2, 7, 0, 31 },
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "-rwxrwxrwx 2 root root  4096 2012-02-07 00:31 notas_servico",
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::FILE, "notas_servico", 4096,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2012, 2, 7, 0, 31 },
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Weird permission bits.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "drwx--l---   2 0        10           512 Dec 22  1994 swetzel",
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "swetzel", -1,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      1994, 12, 22, 0, 0 },
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    { "drwxrwxr-x   1 500     244         660 Jan  1 00:0 bin",
1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      FtpDirectoryListingEntry::DIRECTORY, "bin", -1,
1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      1994, 1, 1, 0, 0 },
1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Garbage in date (but still parseable).
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "lrw-rw-rw-   1 user     group         542 "
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "/t11/member/incomingFeb  8  2007 "
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Shortcut to incoming.lnk -> /t11/member/incoming",
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::SYMLINK, "Shortcut to incoming.lnk", -1,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2007, 2, 8, 0, 0 },
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Garbage in permissions (with no effect on other bits).
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Also test multiple "columns" resulting from the garbage.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "garbage    1 ftp      ftp           528 Nov 01  2007 README",
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::FILE, "README", 528,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2007, 11, 1, 0, 0 },
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "gar bage    1 ftp      ftp           528 Nov 01  2007 README",
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::FILE, "README", 528,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2007, 11, 1, 0, 0 },
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "g a r b a g e    1 ftp      ftp           528 Nov 01  2007 README",
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FtpDirectoryListingEntry::FILE, "README", 528,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2007, 11, 1, 0, 0 },
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(good_cases); i++) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    good_cases[i].input));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<FtpDirectoryListingEntry> entries;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ParseFtpDirectoryListingLs(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetSingleLineTestCase(good_cases[i].input),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetMockCurrentTime(),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &entries));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifySingleLineTestCase(good_cases[i], entries);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FtpDirectoryListingParserLsTest, Ignored) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* ignored_cases[] = {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "drwxr-xr-x 2 0 0 4096 Mar 18  2007  ",  // http://crbug.com/60065
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ftpd: .: Permission denied",
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ftpd-BSD: .: Permission denied",
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ls: .: EDC5111I Permission denied.",
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tests important for security: verify that after we detect the column
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // offset we don't try to access invalid memory on malformed input.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11",
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "drwxr-xr-x 3 ftp     4096 May 15 18:11",
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "drwxr-xr-x   folder     0 May 15 18:11",
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(ignored_cases); i++) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ignored_cases[i]));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<FtpDirectoryListingEntry> entries;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ParseFtpDirectoryListingLs(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GetSingleLineTestCase(ignored_cases[i]),
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GetMockCurrentTime(),
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &entries));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, entries.size());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FtpDirectoryListingParserLsTest, Bad) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* bad_cases[] = {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    " foo",
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "garbage",
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "-rw-r--r-- ftp ftp",
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "-rw-r--r-- ftp ftp 528 Foo 01 2007 README",
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "-rw-r--r-- 1 ftp ftp",
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "-rw-r--r-- 1 ftp ftp 528 Foo 01 2007 README",
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Invalid month value (30).
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "drwxrwxrwx 2 root root  4096 2012-30-07 00:31 notas_servico",
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(bad_cases); i++) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bad_cases[i]));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<FtpDirectoryListingEntry> entries;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ParseFtpDirectoryListingLs(GetSingleLineTestCase(bad_cases[i]),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            GetMockCurrentTime(),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &entries));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
222