source: filezilla/trunk/fuentes/tests/dirparsertest.cpp @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 2 years ago

Update new version: 3.15.02

File size: 32.9 KB
Line 
1#include <libfilezilla_engine.h>
2#include <directorylistingparser.h>
3
4#include <cppunit/extensions/HelperMacros.h>
5#include <list>
6
7/*
8 * This testsuite asserts the correctness of the directory listing parser.
9 * It's main purpose is to ensure that all known formats are recognized and
10 * parsed as expected. Due to the high amount of variety and unfortunately
11 * also ambiguity, the parser is very fragile.
12 */
13
14typedef struct
15{
16        std::string data;
17        CDirentry reference;
18        enum ServerType serverType;
19} t_entry;
20
21class CDirectoryListingParserTest : public CppUnit::TestFixture
22{
23        CPPUNIT_TEST_SUITE(CDirectoryListingParserTest);
24        InitEntries();
25        for (unsigned int i = 0; i < m_entries.size(); i++)
26                CPPUNIT_TEST(testIndividual);
27        CPPUNIT_TEST(testAll);
28        CPPUNIT_TEST_SUITE_END();
29
30public:
31        void setUp();
32        void tearDown() {}
33
34        void testIndividual();
35        void testAll();
36        void testSpecial();
37
38        static std::vector<t_entry> m_entries;
39
40        static wxCriticalSection m_sync;
41
42protected:
43        static void InitEntries();
44
45        t_entry m_entry;
46};
47
48wxCriticalSection CDirectoryListingParserTest::m_sync;
49std::vector<t_entry> CDirectoryListingParserTest::m_entries;
50
51CPPUNIT_TEST_SUITE_REGISTRATION(CDirectoryListingParserTest);
52
53typedef CRefcountObject<std::wstring> R;
54typedef CSparseOptional<std::wstring> O;
55
56static int calcYear(int month, int day)
57{
58        const int cur_year = wxDateTime::GetCurrentYear();
59        const int cur_month = wxDateTime::GetCurrentMonth() + 1;
60        const int cur_day = wxDateTime::Now().GetDay();
61
62        // Not exact but good enough for our purpose
63        const int day_of_year = month * 31 + day;
64        const int cur_day_of_year = cur_month * 31 + cur_day;
65        if (day_of_year > (cur_day_of_year + 1))
66                return cur_year - 1;
67        else
68                return cur_year;
69}
70
71void CDirectoryListingParserTest::InitEntries()
72{
73        // Unix-style listings
74        // -------------------
75
76        // We start with a perfect example of a unix style directory listing without anomalies.
77        m_entries.push_back((t_entry){
78                        "dr-xr-xr-x   2 root     other        512 Apr  8  1994 01-unix-std dir",
79                        {
80                                _T("01-unix-std dir"),
81                                512,
82                                R(_T("dr-xr-xr-x")),
83                                R(_T("root other")),
84                                CDirentry::flag_dir,
85                                O(),
86                                fz::datetime(fz::datetime::utc, 1994, 4, 8)
87                        },
88                        DEFAULT
89                });
90
91        // This one is a recent file with a time instead of the year.
92        m_entries.push_back((t_entry){
93                        "-rw-r--r--   1 root     other        531 3 29 03:26 02-unix-std file",
94                        {
95                                _T("02-unix-std file"),
96                                531,
97                                R(_T("-rw-r--r--")),
98                                R(_T("root other")),
99                                0,
100                                O(),
101                                fz::datetime(fz::datetime::utc, calcYear(3, 29), 3, 29, 3, 26)
102                        },
103                        DEFAULT
104                });
105
106        // Group omitted
107        m_entries.push_back((t_entry){
108                        "dr-xr-xr-x   2 root                  512 Apr  8  1994 03-unix-nogroup dir",
109                        {
110                                _T("03-unix-nogroup dir"),
111                                512,
112                                R(_T("dr-xr-xr-x")),
113                                R(_T("root")),
114                                CDirentry::flag_dir,
115                                O(),
116                                fz::datetime(fz::datetime::utc, 1994, 4, 8)
117                        },
118                        DEFAULT
119                });
120
121        // Symbolic link
122        m_entries.push_back((t_entry){
123                        "lrwxrwxrwx   1 root     other          7 Jan 25 00:17 04-unix-std link -> usr/bin",
124                        {
125                                _T("04-unix-std link"),
126                                7,
127                                R(_T("lrwxrwxrwx")),
128                                R(_T("root other")),
129                                CDirentry::flag_dir | CDirentry::flag_link,
130                                O(_T("usr/bin")),
131                                fz::datetime(fz::datetime::utc, calcYear(1, 25), 1, 25, 0, 17)
132                        },
133                        DEFAULT
134                });
135
136        // Some listings with uncommon date/time format
137        // --------------------------------------------
138
139        m_entries.push_back((t_entry){
140                        "-rw-r--r--   1 root     other        531 09-26 2000 05-unix-date file",
141                        {
142                                _T("05-unix-date file"),
143                                531,
144                                R(_T("-rw-r--r--")),
145                                R(_T("root other")),
146                                0,
147                                O(),
148                                fz::datetime(fz::datetime::utc, 2000, 9, 26)
149                        },
150                        DEFAULT
151                });
152
153        m_entries.push_back((t_entry){
154                        "-rw-r--r--   1 root     other        531 09-26 13:45 06-unix-date file",
155                        {
156                                _T("06-unix-date file"),
157                                531,
158                                R(_T("-rw-r--r--")),
159                                R(_T("root other")),
160                                0,
161                                O(),
162                                fz::datetime(fz::datetime::utc, calcYear(9, 26), 9, 26, 13, 45)
163                        },
164                        DEFAULT
165                });
166
167        m_entries.push_back((t_entry){
168                        "-rw-r--r--   1 root     other        531 2005-06-07 21:22 07-unix-date file",
169                        {
170                                _T("07-unix-date file"),
171                                531,
172                                R(_T("-rw-r--r--")),
173                                R(_T("root other")),
174                                0,
175                                O(),
176                                fz::datetime(fz::datetime::utc, 2005, 6, 7, 21, 22)
177                        },
178                        DEFAULT
179                });
180
181
182        // Unix style with size information in kilobytes
183        m_entries.push_back((t_entry){
184                        "-rw-r--r--   1 root     other  33.5k Oct 5 21:22 08-unix-namedsize file",
185                        {
186                                _T("08-unix-namedsize file"),
187                                335 * 1024 / 10,
188                                R(_T("-rw-r--r--")),
189                                R(_T("root other")),
190                                0,
191                                O(),
192                                fz::datetime(fz::datetime::utc, calcYear(10, 5), 10, 5, 21, 22)
193                        },
194                        DEFAULT
195                });
196
197        // NetWare style listings
198        // ----------------------
199
200        m_entries.push_back((t_entry){
201                        "d [R----F--] supervisor            512       Jan 16 18:53    09-netware dir",
202                        {
203                                _T("09-netware dir"),
204                                512,
205                                R(_T("d [R----F--]")),
206                                R(_T("supervisor")),
207                                CDirentry::flag_dir,
208                                O(),
209                                fz::datetime(fz::datetime::utc, calcYear(1, 16), 1, 16, 18, 53)
210                        },
211                        DEFAULT
212                });
213
214        m_entries.push_back((t_entry){
215                        "- [R----F--] rhesus             214059       Oct 20 15:27    10-netware file",
216                        {
217                                _T("10-netware file"),
218                                214059,
219                                R(_T("- [R----F--]")),
220                                R(_T("rhesus")),
221                                0,
222                                O(),
223                                fz::datetime(fz::datetime::utc, calcYear(10, 20), 10, 20, 15, 27)
224                        },
225                        DEFAULT
226                });
227
228        // NetPresenz for the Mac
229        // ----------------------
230
231        // Actually this one isn't parsed properly:
232        // The numerical username is mistaken as size. However,
233        // this is ambiguous to the normal unix style listing.
234        // It's not possible to recognize both formats the right way.
235        m_entries.push_back((t_entry){
236                        "-------r--         326  1391972  1392298 Nov 22  1995 11-netpresenz file",
237                        {
238                                _T("11-netpresenz file"),
239                                1392298,
240                                R(_T("-------r--")),
241                                R(_T("1391972")),
242                                0,
243                                O(),
244                                fz::datetime(fz::datetime::utc, 1995, 11, 22)
245                        },
246                        DEFAULT
247                });
248
249        m_entries.push_back((t_entry){
250                        "drwxrwxr-x               folder        2 May 10  1996 12-netpresenz dir",
251                        {
252                                _T("12-netpresenz dir"),
253                                2,
254                                R(_T("drwxrwxr-x")),
255                                R(_T("folder")),
256                                CDirentry::flag_dir,
257                                O(),
258                                fz::datetime(fz::datetime::utc, 1996, 5, 10)
259                        },
260                        DEFAULT
261                });
262
263        // A format with domain field some windows servers send
264        m_entries.push_back((t_entry){
265                        "-rw-r--r--   1 group domain user 531 Jan 29 03:26 13-unix-domain file",
266                        {
267                                _T("13-unix-domain file"),
268                                531,
269                                R(_T("-rw-r--r--")),
270                                R(_T("group domain user")),
271                                0,
272                                O(),
273                                fz::datetime(fz::datetime::utc, calcYear(1, 29), 1, 29, 3, 26)
274                        },
275                        DEFAULT
276                });
277
278        // EPLF directory listings
279        // -----------------------
280
281        // See http://cr.yp.to/ftp/list/eplf.html (mirrored at https://filezilla-project.org/specs/eplf.html)
282
283        m_entries.push_back((t_entry){
284                        "+i8388621.48594,m825718503,r,s280,up755\t14-eplf file",
285                        {
286                                _T("14-eplf file"),
287                                280,
288                                R(_T("755")),
289                                R(),
290                                0,
291                                O(),
292                                fz::datetime(fz::datetime::utc, 1996, 3, 1, 22, 15, 3)
293                        },
294                        DEFAULT
295                });
296
297        m_entries.push_back((t_entry){
298                        "+i8388621.50690,m824255907,/,\t15-eplf dir",
299                        {
300                                _T("15-eplf dir"),
301                                -1,
302                                R(),
303                                R(),
304                                CDirentry::flag_dir | 0,
305                                O(),
306                                fz::datetime(fz::datetime::utc, 1996, 2, 13, 23, 58, 27)
307                        },
308                        DEFAULT
309                });
310
311        // MSDOS type listing used by old IIS
312        // ----------------------------------
313
314        m_entries.push_back((t_entry){
315                        "04-27-00  12:09PM       <DIR>          16-dos-dateambiguous dir",
316                        {
317                                _T("16-dos-dateambiguous dir"),
318                                -1,
319                                R(),
320                                R(),
321                                CDirentry::flag_dir,
322                                O(),
323                                fz::datetime(fz::datetime::utc, 2000, 4, 27, 12, 9)
324                        },
325                        DEFAULT
326                });
327
328        // Ambiguous date and AM/PM crap. Some evil manager must have forced the poor devs to implement this
329        m_entries.push_back((t_entry){
330                        "04-06-00  03:47PM                  589 17-dos-dateambiguous file",
331                        {
332                                _T("17-dos-dateambiguous file"),
333                                589,
334                                R(),
335                                R(),
336                                0,
337                                O(),
338                                fz::datetime(fz::datetime::utc, 2000, 4, 6, 15, 47)
339                        },
340                        DEFAULT
341                });
342
343        m_entries.push_back((t_entry){
344                        "2002-09-02  18:48       <DIR>          18-dos-longyear dir",
345                        {
346                                _T("18-dos-longyear dir"),
347                                -1,
348                                R(),
349                                R(),
350                                CDirentry::flag_dir,
351                                O(),
352                                fz::datetime(fz::datetime::utc, 2002, 9, 2, 18, 48)
353                        },
354                        DEFAULT
355                });
356
357        m_entries.push_back((t_entry){
358                        "2002-09-02  19:06                9,730 19-dos-longyear file",
359                        {
360                                _T("19-dos-longyear file"),
361                                9730,
362                                R(),
363                                R(),
364                                0,
365                                O(),
366                                fz::datetime(fz::datetime::utc, 2002, 9, 2, 19, 6)
367                        },
368                        DEFAULT
369                });
370
371        // Numerical unix style listing
372        m_entries.push_back((t_entry){
373                        "0100644   500  101   12345    123456789       20-unix-numerical file",
374                        {
375                                _T("20-unix-numerical file"),
376                                12345,
377                                R(_T("0100644")),
378                                R(_T("500 101")),
379                                0,
380                                O(),
381                                fz::datetime(fz::datetime::utc, 1973, 11, 29, 21, 33, 9)
382                        },
383                        DEFAULT
384                });
385
386        // VShell servers
387        // --------------
388
389        m_entries.push_back((t_entry){
390                        "206876  Apr 04, 2000 21:06 21-vshell-old file",
391                        {
392                                _T("21-vshell-old file"),
393                                206876,
394                                R(),
395                                R(),
396                                0,
397                                O(),
398                                fz::datetime(fz::datetime::utc, 2000, 4, 4, 21, 6)
399                        },
400                        DEFAULT
401                });
402
403        m_entries.push_back((t_entry){
404                        "0  Dec 12, 2002 02:13 22-vshell-old dir/",
405                        {
406                                _T("22-vshell-old dir"),
407                                0,
408                                R(),
409                                R(),
410                                CDirentry::flag_dir,
411                                O(),
412                                fz::datetime(fz::datetime::utc, 2002, 12, 12, 2, 13)
413                        },
414                        DEFAULT
415                });
416
417        /* This type of directory listings is sent by some newer versions of VShell
418         * both year and time in one line is uncommon. */
419        m_entries.push_back((t_entry){
420                        "-rwxr-xr-x    1 user group        9 Oct 08, 2002 09:47 23-vshell-new file",
421                        {
422                                _T("23-vshell-new file"),
423                                9,
424                                R(_T("-rwxr-xr-x")),
425                                R(_T("user group")),
426                                0,
427                                O(),
428                                fz::datetime(fz::datetime::utc, 2002, 10, 8, 9, 47)
429                        },
430                        DEFAULT
431                });
432
433        // OS/2 server format
434        // ------------------
435
436        // This server obviously isn't Y2K aware
437        m_entries.push_back((t_entry){
438                        "36611      A    04-23-103  10:57  24-os2 file",
439                        {
440                                _T("24-os2 file"),
441                                36611,
442                                R(),
443                                R(),
444                                0,
445                                O(),
446                                fz::datetime(fz::datetime::utc, 2003, 4, 23, 10, 57)
447                        },
448                        DEFAULT
449                });
450
451        m_entries.push_back((t_entry){
452                        " 1123      A    07-14-99   12:37  25-os2 file",
453                        {
454                                _T("25-os2 file"),
455                                1123,
456                                R(),
457                                R(),
458                                0,
459                                O(),
460                                fz::datetime(fz::datetime::utc, 1999, 7, 14, 12, 37)
461                        },
462                        DEFAULT
463                });
464
465        // Another server not aware of Y2K
466        m_entries.push_back((t_entry){
467                        "    0 DIR       02-11-103  16:15  26-os2 dir",
468                        {
469                                _T("26-os2 dir"),
470                                0,
471                                R(),
472                                R(),
473                                CDirentry::flag_dir,
474                                O(),
475                                fz::datetime(fz::datetime::utc, 2003, 2, 11, 16, 15)
476                        },
477                        DEFAULT
478                });
479
480        // Again Y2K
481        m_entries.push_back((t_entry){
482                        " 1123 DIR  A    10-05-100  23:38  27-os2 dir",
483                        {
484                                _T("27-os2 dir"),
485                                1123,
486                                R(),
487                                R(),
488                                CDirentry::flag_dir,
489                                O(),
490                                fz::datetime(fz::datetime::utc, 2000, 10, 5, 23, 38)
491                        },
492                        DEFAULT
493                });
494
495        // Localized date formats
496        // ----------------------
497
498        m_entries.push_back((t_entry){
499                        "dr-xr-xr-x   2 root     other      2235 26. Juli, 20:10 28-datetest-ger dir",
500                        {
501                                _T("28-datetest-ger dir"),
502                                2235,
503                                R(_T("dr-xr-xr-x")),
504                                R(_T("root other")),
505                                CDirentry::flag_dir,
506                                O(),
507                                fz::datetime(fz::datetime::utc, calcYear(7, 26), 7, 26, 20, 10)
508                        },
509                        DEFAULT
510                });
511
512        m_entries.push_back((t_entry){
513                        "dr-xr-xr-x   2 root     other      2235 szept 26 20:10 28b-datetest-hungarian dir",
514                        {
515                                _T("28b-datetest-hungarian dir"),
516                                2235,
517                                R(_T("dr-xr-xr-x")),
518                                R(_T("root other")),
519                                CDirentry::flag_dir,
520                                O(),
521                                fz::datetime(fz::datetime::utc, calcYear(9, 26), 9, 26, 20, 10)
522                        },
523                        DEFAULT
524                });
525
526        m_entries.push_back((t_entry){
527                        "-r-xr-xr-x   2 root     other      2235 2.   Okt.  2003 29-datetest-ger file",
528                        {
529                                _T("29-datetest-ger file"),
530                                2235,
531                                R(_T("-r-xr-xr-x")),
532                                R(_T("root other")),
533                                0,
534                                O(),
535                                fz::datetime(fz::datetime::utc, 2003, 10, 2)
536                        },
537                        DEFAULT
538                });
539
540        m_entries.push_back((t_entry){
541                        "-r-xr-xr-x   2 root     other      2235 1999/10/12 17:12 30-datetest file",
542                        {
543                                _T("30-datetest file"),
544                                2235,
545                                R(_T("-r-xr-xr-x")),
546                                R(_T("root other")),
547                                0,
548                                O(),
549                                fz::datetime(fz::datetime::utc, 1999, 10, 12, 17, 12)
550                        },
551                        DEFAULT
552                });
553
554        m_entries.push_back((t_entry){
555                        "-r-xr-xr-x   2 root     other      2235 24-04-2003 17:12 31-datetest file",
556                        {
557                                _T("31-datetest file"),
558                                2235,
559                                R(_T("-r-xr-xr-x")),
560                                R(_T("root other")),
561                                0,
562                                O(),
563                                fz::datetime(fz::datetime::utc, 2003, 4, 24, 17, 12)
564                        },
565                        DEFAULT
566                });
567
568        // Japanese listing
569        // Remark: I'v no idea in which encoding the foreign characters are, but
570        // it's not valid UTF-8. Parser has to be able to cope with it somehow.
571        m_entries.push_back((t_entry){
572                        "-rw-r--r--   1 root       sys           8473  4\x8c\x8e 18\x93\xfa 2003\x94\x4e 32-datatest-japanese file",
573                        {
574                                _T("32-datatest-japanese file"),
575                                8473,
576                                R(_T("-rw-r--r--")),
577                                R(_T("root sys")),
578                                0,
579                                O(),
580                                fz::datetime(fz::datetime::utc, 2003, 4, 18)
581                        },
582                        DEFAULT
583                });
584
585        // Some other asian listing format. Those >127 chars are just examples
586
587        m_entries.push_back((t_entry){
588                        "-rwxrwxrwx   1 root     staff          0 2003   3\xed\xef 20 33-asian date file",
589                        {
590                                _T("33-asian date file"),
591                                0,
592                                R(_T("-rwxrwxrwx")),
593                                R(_T("root staff")),
594                                0,
595                                O(),
596                                fz::datetime(fz::datetime::utc, 2003, 3, 20)
597                        },
598                        DEFAULT
599                });
600
601        m_entries.push_back((t_entry){
602                        "-r--r--r-- 1 root root 2096 8\xed 17 08:52 34-asian date file",
603                        {
604                                _T("34-asian date file"),
605                                2096,
606                                R(_T("-r--r--r--")),
607                                R(_T("root root")),
608                                0,
609                                O(),
610                                fz::datetime(fz::datetime::utc, calcYear(8, 17), 8, 17, 8, 52)
611                        },
612                        DEFAULT
613                });
614
615        m_entries.push_back((t_entry){
616                        "-r-xr-xr-x   2 root  root  96 2004.07.15   35-dotted-date file",
617                        {
618                                _T("35-dotted-date file"),
619                                96,
620                                R(_T("-r-xr-xr-x")),
621                                R(_T("root root")),
622                                0,
623                                O(),
624                                fz::datetime(fz::datetime::utc, 2004, 7, 15)
625                        },
626                        DEFAULT
627                });
628
629        // VMS listings
630        // ------------
631
632        m_entries.push_back((t_entry){
633                        "36-vms-dir.DIR;1  1 19-NOV-2001 21:41 [root,root] (RWE,RWE,RE,RE)",
634                        {
635                                _T("36-vms-dir"),
636                                512,
637                                R(_T("RWE,RWE,RE,RE")),
638                                R(_T("root,root")),
639                                CDirentry::flag_dir,
640                                O(),
641                                fz::datetime(fz::datetime::utc, 2001, 11, 19, 21, 41)
642                        },
643                        DEFAULT
644                });
645
646
647        m_entries.push_back((t_entry){
648                        "37-vms-file;1       155   2-JUL-2003 10:30:13.64",
649                        {
650                                _T("37-vms-file;1"),
651                                79360,
652                                R(),
653                                R(),
654                                0,
655                                O(),
656                                fz::datetime(fz::datetime::utc, 2003, 7, 2, 10, 30, 13)
657                        },
658                        DEFAULT
659                });
660
661        /* VMS style listing without time */
662        m_entries.push_back((t_entry){
663                        "38-vms-notime-file;1    2/8    7-JAN-2000    [IV2_XXX]   (RWED,RWED,RE,)",
664                        {
665                                _T("38-vms-notime-file;1"),
666                                1024,
667                                R(_T("RWED,RWED,RE,")),
668                                R(_T("IV2_XXX")),
669                                0,
670                                O(),
671                                fz::datetime(fz::datetime::utc, 2000, 1, 7)
672                        },
673                        DEFAULT
674                });
675
676        /* Localized month */
677        m_entries.push_back((t_entry){
678                        "39-vms-notime-file;1    6/8    15-JUI-2002    PRONAS   (RWED,RWED,RE,)",
679                        {
680                                _T("39-vms-notime-file;1"),
681                                3072,
682                                R(_T("RWED,RWED,RE,")),
683                                R(_T("PRONAS")),
684                                0,
685                                O(),
686                                fz::datetime(fz::datetime::utc, 2002, 7, 15)
687                        },
688                        DEFAULT
689                });
690
691        m_entries.push_back((t_entry){
692                        "40-vms-multiline-file;1\r\n170774/170775     24-APR-2003 08:16:15  [FTP_CLIENT,SCOT]      (RWED,RWED,RE,)",
693                        {
694                                _T("40-vms-multiline-file;1"),
695                                87436288,
696                                R(_T("RWED,RWED,RE,")),
697                                R(_T("FTP_CLIENT,SCOT")),
698                                0,
699                                O(),
700                                fz::datetime(fz::datetime::utc, 2003, 4, 24, 8, 16, 15)
701                        },
702                        DEFAULT
703                });
704
705        m_entries.push_back((t_entry){
706                        "41-vms-multiline-file;1\r\n10     2-JUL-2003 10:30:08.59  [FTP_CLIENT,SCOT]      (RWED,RWED,RE,)",
707                        {
708                                _T("41-vms-multiline-file;1"),
709                                5120,
710                                R(_T("RWED,RWED,RE,")),
711                                R(_T("FTP_CLIENT,SCOT")),
712                                0,
713                                O(),
714                                fz::datetime(fz::datetime::utc, 2003, 7, 2, 10, 30, 8)
715                        },
716                        DEFAULT
717                });
718
719        // VMS style listings with a different field order
720        m_entries.push_back((t_entry){
721                        "42-vms-alternate-field-order-file;1   [SUMMARY]    1/3     2-AUG-2006 13:05  (RWE,RWE,RE,)",
722                        {
723                                _T("42-vms-alternate-field-order-file;1"),
724                                512,
725                                R(_T("RWE,RWE,RE,")),
726                                R(_T("SUMMARY")),
727                                0,
728                                O(),
729                                fz::datetime(fz::datetime::utc, 2006, 8, 2, 13, 5)
730                        },
731                        DEFAULT
732                });
733
734        m_entries.push_back((t_entry){
735                        "43-vms-alternate-field-order-file;1       17-JUN-1994 17:25:37     6308/13     (RWED,RWED,R,)",
736                        {
737                                _T("43-vms-alternate-field-order-file;1"),
738                                3229696,
739                                R(_T("RWED,RWED,R,")),
740                                R(),
741                                0,
742                                O(),
743                                fz::datetime(fz::datetime::utc, 1994, 6, 17, 17, 25, 37)
744                        },
745                        DEFAULT
746                });
747
748        // Miscellaneous listings
749        // ----------------------
750
751        /* IBM AS/400 style listing */
752        m_entries.push_back((t_entry){
753                        "QSYS            77824 02/23/00 15:09:55 *DIR 44-ibm-as400 dir/",
754                        {
755                                _T("44-ibm-as400 dir"),
756                                77824,
757                                R(),
758                                R(_T("QSYS")),
759                                CDirentry::flag_dir | 0,
760                                O(),
761                                fz::datetime(fz::datetime::utc, 2000, 2, 23, 15, 9, 55)
762                        },
763                        DEFAULT
764                });
765
766        m_entries.push_back((t_entry){
767                        "QSYS            77824 23/02/00 15:09:55 *FILE 45-ibm-as400-date file",
768                        {
769                                _T("45-ibm-as400-date file"),
770                                77824,
771                                R(),
772                                R(_T("QSYS")),
773                                0,
774                                O(),
775                                fz::datetime(fz::datetime::utc, 2000, 2, 23, 15, 9, 55)
776                        },
777                        DEFAULT
778                });
779
780        /* aligned directory listing with too long size */
781        m_entries.push_back((t_entry){
782                        "-r-xr-xr-x longowner longgroup123456 Feb 12 17:20 46-unix-concatsize file",
783                        {
784                                _T("46-unix-concatsize file"),
785                                123456,
786                                R(_T("-r-xr-xr-x")),
787                                R(_T("longowner longgroup")),
788                                0,
789                                O(),
790                                fz::datetime(fz::datetime::utc, calcYear(2, 12), 2, 12, 17, 20)
791                        },
792                        DEFAULT
793                });
794
795        /* short directory listing with month name */
796        m_entries.push_back((t_entry){
797                        "-r-xr-xr-x 2 owner group 4512 01-jun-99 47_unix_shortdatemonth file",
798                        {
799                                _T("47_unix_shortdatemonth file"),
800                                4512,
801                                R(_T("-r-xr-xr-x")),
802                                R(_T("owner group")),
803                                0,
804                                O(),
805                                fz::datetime(fz::datetime::utc, 1999, 6, 1)
806                        },
807                        DEFAULT
808                });
809
810        /* Nortel wfFtp router */
811        m_entries.push_back((t_entry){
812                        "48-nortel-wfftp-file       1014196  06/03/04  Thur.   10:20:03",
813                        {
814                                _T("48-nortel-wfftp-file"),
815                                1014196,
816                                R(),
817                                R(),
818                                0,
819                                O(),
820                                fz::datetime(fz::datetime::utc, 2004, 6, 3, 10, 20, 3)
821                        },
822                        DEFAULT
823                });
824
825        /* VxWorks based server used in Nortel routers */
826        m_entries.push_back((t_entry){
827                        "2048    Feb-28-1998  05:23:30   49-nortel-vxworks dir <DIR>",
828                        {
829                                _T("49-nortel-vxworks dir"),
830                                2048,
831                                R(),
832                                R(),
833                                CDirentry::flag_dir | 0,
834                                O(),
835                                fz::datetime(fz::datetime::utc, 1998, 2, 28, 5, 23, 30)
836                        },
837                        DEFAULT
838                });
839
840        /* the following format is sent by the Connect:Enterprise server by Sterling Commerce */
841        m_entries.push_back((t_entry){
842                        "-C--E-----FTP B BCC3I1       7670  1294495 Jan 13 07:42 50-conent file",
843                        {
844                                _T("50-conent file"),
845                                1294495,
846                                R(_T("-C--E-----FTP")),
847                                R(_T("B BCC3I1 7670")),
848                                0,
849                                O(),
850                                fz::datetime(fz::datetime::utc, calcYear(1, 13), 1, 13, 7, 42)
851                        },
852                        DEFAULT
853                });
854
855        /* Microware OS-9
856         * Notice the yy/mm/dd date format */
857        m_entries.push_back((t_entry){
858                        "20.20 07/03/29 1026 d-ewrewr 2650 85920 51-OS-9 dir",
859                        {
860                                _T("51-OS-9 dir"),
861                                85920,
862                                R(_T("d-ewrewr")),
863                                R(_T("20.20")),
864                                CDirentry::flag_dir,
865                                O(),
866                                fz::datetime(fz::datetime::utc, 2007, 3, 29)
867                        },
868                        DEFAULT
869                });
870
871        /* Localised Unix style listing. Month and day fields are swapped */
872        m_entries.push_back((t_entry){
873                        "drwxr-xr-x 3 user group 512 01 oct 2004 52-swapped-daymonth dir",
874                        {
875                                _T("52-swapped-daymonth dir"),
876                                512,
877                                R(_T("drwxr-xr-x")),
878                                R(_T("user group")),
879                                CDirentry::flag_dir,
880                                O(),
881                                fz::datetime(fz::datetime::utc, 2004, 10, 1)
882                        },
883                        DEFAULT
884                });
885
886        m_entries.push_back((t_entry){
887                        "-r--r--r-- 0125039 12 Nov 11 2005 53-noownergroup file",
888                        {
889                                _T("53-noownergroup file"),
890                                12,
891                                R(_T("-r--r--r--")),
892                                R(),
893                                0,
894                                O(),
895                                fz::datetime(fz::datetime::utc, 2005, 11, 11)
896                        },
897                        DEFAULT
898                });
899
900        m_entries.push_back((t_entry){
901                        // Valid UTF-8 encoding
902                        "drwxr-xr-x   5 root     sys          512 2005\xEB\x85\x84  1\xEC\x9B\x94  6\xEC\x9D\xBC 54-asian date year first dir",
903                        {
904                                _T("54-asian date year first dir"),
905                                512,
906                                R(_T("drwxr-xr-x")),
907                                R(_T("root sys")),
908                                CDirentry::flag_dir,
909                                O(),
910                                fz::datetime(fz::datetime::utc, 2005, 1, 6)
911                        },
912                        DEFAULT
913                });
914
915        /* IBM AS/400 style listing with localized date*/
916        m_entries.push_back((t_entry){
917                        "QPGMR           36864 18.09.06 14:21:26 *FILE      55-AS400.FILE",
918                        {
919                                _T("55-AS400.FILE"),
920                                36864,
921                                R(),
922                                R(_T("QPGMR")),
923                                0,
924                                O(),
925                                fz::datetime(fz::datetime::utc, 2006, 9, 18, 14, 21, 26)
926                        },
927                        DEFAULT
928                });
929
930        /* VMS style listing with complex size */
931        m_entries.push_back((t_entry){
932                        "56-VMS-complex-size;1 2KB 23-SEP-2005 14:57:07.27",
933                        {
934                                _T("56-VMS-complex-size;1"),
935                                2048,
936                                R(),
937                                R(),
938                                0,
939                                O(),
940                                fz::datetime(fz::datetime::utc, 2005, 9, 23, 14, 57, 7)
941                        },
942                        DEFAULT
943                });
944
945        /* HP NonStop */
946        m_entries.push_back((t_entry){
947                        "57-HP_NonStop 101 528 6-Apr-07 14:21:18 255, 0 \"oooo\"",
948                        {
949                                _T("57-HP_NonStop"),
950                                528,
951                                R(_T("\"oooo\"")),
952                                R(_T("255, 0")),
953                                0,
954                                O(),
955                                fz::datetime(fz::datetime::utc, 2007, 4, 6, 14, 21, 18)
956                        },
957                        HPNONSTOP
958                });
959
960        // Only difference is in the owner/group field, no delimiting space.
961        m_entries.push_back((t_entry){
962                        "58-HP_NonStop 101 528 6-Apr-07 14:21:18 255,255 \"oooo\"",
963                        {
964                                _T("58-HP_NonStop"),
965                                528,
966                                R(_T("\"oooo\"")),
967                                R(_T("255,255")),
968                                0,
969                                O(),
970                                fz::datetime(fz::datetime::utc, 2007, 4, 6, 14, 21, 18)
971                        },
972                        HPNONSTOP
973                });
974
975
976        m_entries.push_back((t_entry){
977                        "drwxr-xr-x 6 user sys 1024 30. Jan., 12:40 59-localized-date-dir",
978                        {
979                                _T("59-localized-date-dir"),
980                                1024,
981                                R(_T("drwxr-xr-x")),
982                                R(_T("user sys")),
983                                CDirentry::flag_dir,
984                                O(),
985                                fz::datetime(fz::datetime::utc, calcYear(1, 30), 1, 30, 12, 40)
986                        },
987                        DEFAULT
988                });
989
990        // MVS variants
991        //
992        // Note: I am not quite sure of these get parsed correctly, but so far
993        //       nobody did complain. Formats added here with what I think
994        //       is at least somewhat correct, so that there won't be any
995        //       regressions at least.
996
997        // The following 5 are loosely based on this format:
998        // Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
999        m_entries.push_back((t_entry){
1000                        "WYOSPT 3420   2003/05/21  1  200  FB      80  8053  PS  60-MVS.FILE",
1001                        {
1002                                _T("60-MVS.FILE"),
1003                                100,
1004                                R(),
1005                                R(),
1006                                0,
1007                                O(),
1008                                fz::datetime(fz::datetime::utc, 2003, 5, 21)
1009                },
1010                DEFAULT
1011        });
1012
1013        m_entries.push_back((t_entry){
1014                        "WPTA01 3290   2004/03/04  1    3  FB      80  3125  PO  61-MVS.DATASET",
1015                        {
1016                                _T("61-MVS.DATASET"),
1017                                -1,
1018                                R(),
1019                                R(),
1020                                CDirentry::flag_dir,
1021                                O(),
1022                                fz::datetime(fz::datetime::utc, 2004, 3, 04)
1023                },
1024                DEFAULT
1025        });
1026
1027        m_entries.push_back((t_entry){
1028                        "NRP004 3390   **NONE**    1   15  NONE     0     0  PO  62-MVS-NONEDATE.DATASET",
1029                        {
1030                                _T("62-MVS-NONEDATE.DATASET"),
1031                                -1,
1032                                R(),
1033                                R(),
1034                                CDirentry::flag_dir,
1035                                O(),
1036                                fz::datetime()
1037                },
1038                DEFAULT
1039        });
1040
1041        m_entries.push_back((t_entry){
1042                        "TSO005 3390   2005/06/06 213000 U 0 27998 PO 63-MVS.DATASET",
1043                        {
1044                                _T("63-MVS.DATASET"),
1045                                -1,
1046                                R(),
1047                                R(),
1048                                CDirentry::flag_dir,
1049                                O(),
1050                                fz::datetime(fz::datetime::utc, 2005, 6, 6)
1051                },
1052                DEFAULT
1053        });
1054
1055        m_entries.push_back((t_entry){
1056                        "TSO004 3390   VSAM 64-mvs-file",
1057                        {
1058                                _T("64-mvs-file"),
1059                                -1,
1060                                R(),
1061                                R(),
1062                                0,
1063                                O(),
1064                                fz::datetime()
1065                },
1066                DEFAULT
1067        });
1068
1069        // MVS Dataset members
1070        //
1071        // As common with IBM misdesign, multiple styles exist.
1072
1073        // Speciality: Some members have no attributes at all.
1074        // Requires servertype to be MVS or it won't be parsed, as
1075        // it would conflict with lots of other servers.
1076        m_entries.push_back((t_entry){
1077                        "65-MVS-PDS-MEMBER",
1078                        {
1079                                _T("65-MVS-PDS-MEMBER"),
1080                                -1,
1081                                R(),
1082                                R(),
1083                                0,
1084                                O(),
1085                                fz::datetime()
1086                },
1087                MVS
1088        });
1089
1090        // Name         VV.MM   Created      Changed       Size  Init  Mod Id
1091        m_entries.push_back((t_entry){
1092                        "66-MVSPDSMEMBER 01.01 2004/06/22 2004/06/22 16:32   128   128    0 BOBY12",
1093                        {
1094                                _T("66-MVSPDSMEMBER"),
1095                                128,
1096                                R(),
1097                                R(),
1098                                0,
1099                                O(),
1100                                fz::datetime(fz::datetime::utc, 2004, 6, 22, 16, 32)
1101                },
1102                MVS
1103        });
1104
1105        // Hexadecimal size
1106        m_entries.push_back((t_entry){
1107                        "67-MVSPDSMEMBER2 00B308 000411  00 FO                31    ANY",
1108                        {
1109                                _T("67-MVSPDSMEMBER2"),
1110                                45832,
1111                                R(),
1112                                R(),
1113                                0,
1114                                O(),
1115                                fz::datetime()
1116                },
1117                MVS
1118        });
1119
1120        m_entries.push_back((t_entry){
1121                        "68-MVSPDSMEMBER3 00B308 000411  00 FO        RU      ANY    24",
1122                        {
1123                                _T("68-MVSPDSMEMBER3"),
1124                                45832,
1125                                R(),
1126                                R(),
1127                                0,
1128                                O(),
1129                                fz::datetime()
1130                        },
1131                        MVS
1132                });
1133
1134        // Migrated MVS file
1135        m_entries.push_back((t_entry){
1136                        "Migrated                               69-SOME.FILE",
1137                        {
1138                                _T("69-SOME.FILE"),
1139                                -1,
1140                                R(),
1141                                R(),
1142                                0,
1143                                O(),
1144                                fz::datetime()
1145                        },
1146                        MVS
1147                });
1148
1149        // z/VM, another IBM abomination. Description by Alexandre Charbey
1150        // Requires type set to ZVM or it cannot be parsed.
1151        //
1152        // 70-ZVMFILE
1153        //   is a filename
1154        // TRACE
1155        //   is a filetype (extension, like exe or com or jpg...)
1156        // V
1157        //   is the file format. Designates how records are arranged in a file. F=Fixed and V=Variable. I don't think you care
1158        // 65
1159        //   is the logical record length.
1160        // 107
1161        //   is Number of records in a file.
1162        // 2
1163        //   (seems wrong) is the block size ( iirc 1 is 127, 2 is 381, 3 is 1028 and 4 is 4072 - not sure - the numbers are not the usual binary numbers)
1164        // there is the date/time
1165        // 060191
1166        //   I think it is some internal stuff saying who the file belongs to.  191 is the "handle" of the user's disk. I don't know what 060 is. This 060191 is what FZ shows in its file list.
1167        m_entries.push_back((t_entry){
1168                        "70-ZVMFILE  TRACE   V        65      107        2 2005-10-04 15:28:42 060191",
1169                        {
1170                                _T("70-ZVMFILE.TRACE"),
1171                                6955,
1172                                R(),
1173                                R(_T("060191")),
1174                                0,
1175                                O(),
1176                                fz::datetime(fz::datetime::utc, 2005, 10, 4, 15, 28, 42)
1177                        },
1178                        ZVM
1179                });
1180
1181        m_entries.push_back((t_entry){
1182                        "drwxr-xr-x 3 slopri devlab 512 71-unix-dateless",
1183                        {
1184                                _T("71-unix-dateless"),
1185                                512,
1186                                R(_T("drwxr-xr-x")),
1187                                R(_T("slopri devlab")),
1188                                CDirentry::flag_dir,
1189                                O(),
1190                                fz::datetime()
1191                        },
1192                        DEFAULT
1193                });
1194
1195        m_entries.push_back((t_entry){
1196                        "Type=file;mOdIfY=20081105165215;size=1234; 72-MLSD-file",
1197                        {
1198                                _T("72-MLSD-file"),
1199                                1234,
1200                                R(),
1201                                R(),
1202                                0,
1203                                O(),
1204                                fz::datetime(fz::datetime::utc, 2008, 11, 5, 16, 52, 15)
1205                        },
1206                        DEFAULT
1207                });
1208
1209        // Yet another MVS format.
1210        // Follows the below structure but with all but the first two and the last field empty.
1211        // Furthermore, Unit is "Tape"
1212        // Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
1213        m_entries.push_back((t_entry) {
1214                        "V43525 Tape                                             73-MSV-TAPE.FILE",
1215                        {
1216                                _T("73-MSV-TAPE.FILE"),
1217                                -1,
1218                                R(),
1219                                R(),
1220                                0,
1221                                O(),
1222                                fz::datetime()
1223                        },
1224                        MVS
1225                });
1226
1227        m_entries.push_back((t_entry){
1228                        "Type=file; 74-MLSD-whitespace trailing\t ",
1229                        {
1230                                _T("74-MLSD-whitespace trailing\t "),
1231                                -1,
1232                                R(),
1233                                R(),
1234                                0,
1235                                O(),
1236                                fz::datetime()
1237                        },
1238                        DEFAULT
1239                });
1240
1241                m_entries.push_back((t_entry){
1242                        "Type=file; \t 75-MLSD-whitespace leading",
1243                        {
1244                                _T("\t 75-MLSD-whitespace leading"),
1245                                -1,
1246                                R(),
1247                                R(),
1248                                0,
1249                                O(),
1250                                fz::datetime()
1251                        },
1252                        DEFAULT
1253                });
1254
1255                m_entries.push_back((t_entry){
1256                        "modify=20080426135501;perm=;size=65718921;type=file;unique=802U1066013B;UNIX.group=1179;UNIX.mode=00;UNIX.owner=1179; 75 MLSD file with empty permissions",
1257                        {
1258                                _T("75 MLSD file with empty permissions"),
1259                                65718921,
1260                                R(_T("00")),
1261                                R(_T("1179 1179")),
1262                                0,
1263                                O(),
1264                                fz::datetime(fz::datetime::utc, 2008, 4, 26, 13, 55, 1)
1265                        },
1266                        DEFAULT
1267                });
1268
1269                m_entries.push_back((t_entry){
1270                        "type=OS.unix=slink:/foo; 76 MLSD symlink",
1271                        {
1272                                _T("76 MLSD symlink"),
1273                                -1,
1274                                R(),
1275                                R(),
1276                                CDirentry::flag_dir | CDirentry::flag_link,
1277                                O(_T("/foo")),
1278                                fz::datetime()
1279                        },
1280                        DEFAULT
1281                });
1282
1283                m_entries.push_back((t_entry){
1284                        "type=OS.UNIX=symlink; 76b MLSD symlink",
1285                        {
1286                                _T("76b MLSD symlink"),
1287                                -1,
1288                                R(),
1289                                R(),
1290                                CDirentry::flag_dir | CDirentry::flag_link,
1291                                O(),
1292                                fz::datetime()
1293                        },
1294                        DEFAULT
1295                });
1296
1297                // Old ietf draft for MLST earlier than mlst-07 has no trailing semicolon after facts
1298                m_entries.push_back((t_entry){
1299                        "type=file 77 MLSD file no trailing semicolon after facts < mlst-07",
1300                        {
1301                                _T("77 MLSD file no trailing semicolon after facts < mlst-07"),
1302                                -1,
1303                                R(),
1304                                R(),
1305                                0,
1306                                O(),
1307                                fz::datetime()
1308                        },
1309                        DEFAULT
1310                });
1311
1312                m_entries.push_back((t_entry){
1313                        "type=OS.unix=slink; 77 MLSD symlink notarget",
1314                        {
1315                                _T("77 MLSD symlink notarget"),
1316                                -1,
1317                                R(),
1318                                R(),
1319                                CDirentry::flag_dir | CDirentry::flag_link,
1320                                O(),
1321                                fz::datetime()
1322                        },
1323                        DEFAULT
1324                });
1325
1326        m_entries.push_back((t_entry){
1327                "size=1365694195;type=file;modify=20090722092510;\tadsl TV 2009-07-22 08-25-10 78 mlsd file that can get parsed as unix.file",
1328                {
1329                        _T("adsl TV 2009-07-22 08-25-10 78 mlsd file that can get parsed as unix.file"),
1330                        1365694195,
1331                        R(),
1332                        R(),
1333                        0,
1334                        O(),
1335                        fz::datetime(fz::datetime::utc, 2009, 7, 22, 9, 25, 10)
1336                },
1337                DEFAULT
1338        });
1339
1340        // MVS entry with a large number of used blocks:
1341        // Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
1342        m_entries.push_back((t_entry){
1343                "WYOSPT 3420   2003/05/21  1 ????  FB      80  8053  PS  79-MVS.FILE",
1344                {
1345                        _T("79-MVS.FILE"),
1346                        100,
1347                        R(),
1348                        R(),
1349                        0,
1350                        O(),
1351                        fz::datetime(fz::datetime::utc, 2003, 5, 21)
1352                },
1353                DEFAULT
1354        });
1355
1356        // MVS entry with a large number of used blocks:
1357        // https://forum.filezilla-project.org/viewtopic.php?t=21667
1358        // Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
1359        m_entries.push_back((t_entry){
1360                "GISBWI 3390   2011/08/25  2 ++++  FB     904 18080  PS  80-MVS.FILE",
1361                {
1362                        _T("80-MVS.FILE"),
1363                        100,
1364                        R(),
1365                        R(),
1366                        0,
1367                        O(),
1368                        fz::datetime(fz::datetime::utc, 2011, 8, 25)
1369                },
1370                DEFAULT
1371        });
1372
1373        // MVS entry with PO-E Dsorg indicating direrctory. See
1374        // https://forum.filezilla-project.org/viewtopic.php?t=19374 for reference.
1375        // Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
1376        m_entries.push_back((t_entry){
1377                "WYOSPT 3420   2003/05/21  1 3 U 6447    6447  PO-E 81-MVS.DIR",
1378                {
1379                        _T("81-MVS.DIR"),
1380                        -1,
1381                        R(),
1382                        R(),
1383                        CDirentry::flag_dir,
1384                        O(),
1385                        fz::datetime(fz::datetime::utc, 2003, 5, 21)
1386                },
1387                DEFAULT
1388        });
1389
1390        m_entries.push_back((t_entry){
1391                "drwxrwxrwx   1 0        0               0 29 Jul 02:27 2014 Invoices",
1392                {
1393                        _T("2014 Invoices"),
1394                        0,
1395                        R(_T("drwxrwxrwx")),
1396                        R(_T("0 0")),
1397                        CDirentry::flag_dir,
1398                        O(),
1399                        fz::datetime(fz::datetime::utc, calcYear(7, 29), 7, 29, 2, 27)
1400                },
1401                DEFAULT
1402        });
1403
1404
1405        m_entries.push_back((t_entry){
1406                "Type=file;mOdIfY=19681105165215;size=1234; MLSD pre-epoch",
1407                {
1408                        _T("MLSD pre-epoch"),
1409                        1234,
1410                        R(),
1411                        R(),
1412                        0,
1413                        O(),
1414                        fz::datetime(fz::datetime::utc, 1968, 11, 5, 16, 52, 15)
1415                },
1416                DEFAULT
1417        });
1418
1419/*
1420        std::wstring name;
1421        int64_t size;
1422        std::wstring permissions;
1423        std::wstring ownerGroup;
1424        int flags;
1425        std::wstring target; // Set to linktarget it link is true
1426
1427        wxDateTime time;
1428*/
1429
1430        // Fix line endings
1431        for (auto iter = m_entries.begin(); iter != m_entries.end(); iter++)
1432                iter->data += "\r\n";
1433}
1434
1435void CDirectoryListingParserTest::testIndividual()
1436{
1437        m_sync.Enter();
1438
1439        static int index = 0;
1440        const t_entry &entry = m_entries[index++];
1441
1442        m_sync.Leave();
1443
1444        CServer server;
1445        server.SetType(entry.serverType);
1446
1447        CDirectoryListingParser parser(0, server);
1448
1449        const char* str = entry.data.c_str();
1450        const int len = strlen(str);
1451        char* data = new char[len];
1452        memcpy(data, str, len);
1453        parser.AddData(data, len);
1454
1455        CDirectoryListing listing = parser.Parse(CServerPath());
1456
1457        wxString msg = wxString::Format(_T("Data: %s, count: %d"), wxString(entry.data.c_str(), wxConvUTF8).c_str(), listing.GetCount());
1458        msg.Replace(_T("\r"), _T(""));
1459        msg.Replace(_T("\n"), _T(""));
1460        wxWX2MBbuf mb_buf = msg.mb_str(wxConvUTF8);
1461        CPPUNIT_ASSERT_MESSAGE((const char*)mb_buf, listing.GetCount() == 1);
1462
1463        msg = wxString::Format(_T("Data: %s  Expected:\n%s\n  Got:\n%s"), wxString(entry.data.c_str(), wxConvUTF8).c_str(), entry.reference.dump().c_str(), listing[0].dump().c_str());
1464        mb_buf = msg.mb_str(wxConvUTF8);
1465        CPPUNIT_ASSERT_MESSAGE((const char*)mb_buf, listing[0] == entry.reference);
1466}
1467
1468void CDirectoryListingParserTest::testAll()
1469{
1470        CServer server;
1471        CDirectoryListingParser parser(0, server);
1472        for (std::vector<t_entry>::const_iterator iter = m_entries.begin(); iter != m_entries.end(); iter++)
1473        {
1474                server.SetType(iter->serverType);
1475                parser.SetServer(server);
1476                const char* str = iter->data.c_str();
1477                const int len = strlen(str);
1478                char* data = new char[len];
1479                memcpy(data, str, len);
1480                parser.AddData(data, len);
1481        }
1482        CDirectoryListing listing = parser.Parse(CServerPath());
1483
1484        CPPUNIT_ASSERT(listing.GetCount() == m_entries.size());
1485
1486        unsigned int i = 0;
1487        for (std::vector<t_entry>::const_iterator iter = m_entries.begin(); iter != m_entries.end(); iter++, i++)
1488        {
1489                wxString msg = wxString::Format(_T("Data: %s  Expected:\n%s\n  Got:\n%s"), wxString(iter->data.c_str(), wxConvUTF8).c_str(), iter->reference.dump().c_str(), listing[i].dump().c_str());
1490
1491                CPPUNIT_ASSERT_MESSAGE((const char*)msg.mb_str(wxConvUTF8), listing[i] == iter->reference);
1492        }
1493}
1494
1495void CDirectoryListingParserTest::setUp()
1496{
1497}
Note: See TracBrowser for help on using the repository browser.