View Javadoc
1   package org.apache.maven.wagon.shared.http;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.InputStream;
23  import java.util.Collections;
24  import java.util.List;
25  
26  import junit.framework.TestCase;
27  
28  import org.apache.log4j.Logger;
29  import org.apache.maven.wagon.TransferFailedException;
30  
31  /**
32   * Unit Tests for the HtmlFileListParser
33   */
34  public class HtmlFileListParserTest
35      extends TestCase
36  {
37      private static Logger logger = Logger.getLogger( HtmlFileListParserTest.class );
38  
39      private void assertContainsExpected( List<String> links, String[] expected )
40      {
41          if ( expected.length != links.size() )
42          {
43              Collections.sort( links );
44              for ( String link : links )
45              {
46                  logger.info("   \"" + link + "\", ");
47              }
48              assertEquals( "Links to Expected size", expected.length, links.size() );
49          }
50  
51          for ( String exp : expected )
52          {
53              assertTrue( "Should find [" + exp + "] in link list", links.contains( exp ) );
54          }
55      }
56  
57      private void assertNotContainingAvoided( List<String> links, String[] avoided )
58      {
59          for ( String a : avoided )
60          {
61              assertFalse( "Should not find [" + a + "] in link list", links.contains( a ) );
62          }
63      }
64  
65      private List<String> parseLinks( String url, String filename )
66          throws TransferFailedException
67      {
68          InputStream is = this.getClass().getResourceAsStream( "/filelistings/" + filename );
69          List<String> files = HtmlFileListParser.parseFileList( url, is );
70  
71          assertNotNull( "file list should not be null.", files );
72          assertFalse( "file list should not be empty.", files.isEmpty() );
73  
74          /* Debug */
75          if ( false )
76          {
77              for ( String file : files )
78              {
79                  logger.info( "File: '" + file + "'" );
80              }
81          }
82  
83          return files;
84      }
85  
86      /**
87       * Example showing jetty directory browsing of commons-lang 
88       * 
89       * @throws TransferFailedException
90       */
91      public void testParseCommonsLang()
92          throws TransferFailedException
93      {
94          List<String> links = parseLinks( "http://localhost/repository/commons-lang/commons-lang/2.3",
95                                               "commons-lang.html" );
96  
97          String[] expected = new String[] {
98              "commons-lang-2.3-javadoc.jar",
99              "commons-lang-2.3-javadoc.jar.asc",
100             "commons-lang-2.3-javadoc.jar.md5",
101             "commons-lang-2.3-javadoc.jar.sha1",
102             "commons-lang-2.3-sources.jar",
103             "commons-lang-2.3-sources.jar.asc",
104             "commons-lang-2.3-sources.jar.md5",
105             "commons-lang-2.3-sources.jar.sha1",
106             "commons-lang-2.3.jar",
107             "commons-lang-2.3.jar.asc",
108             "commons-lang-2.3.jar.md5",
109             "commons-lang-2.3.jar.sha1",
110             "commons-lang-2.3.pom",
111             "commons-lang-2.3.pom.md5",
112             "commons-lang-2.3.pom.sha1",
113             "maven-metadata.xml",
114             "maven-metadata.xml.md5",
115             "maven-metadata.xml.sha1" };
116 
117         assertContainsExpected( links, expected );
118 
119         String[] avoided = new String[] { "../" };
120 
121         assertNotContainingAvoided( links, avoided );
122     }
123 
124     public void testParseIbiblio()
125         throws Exception
126     {
127         List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
128                                              "ibiblio-wagon.html" );
129 
130         String[] expected = new String[] {
131             "wagon-1.0-alpha-2.pom",
132             "wagon-1.0-alpha-2.pom.asc",
133             "wagon-1.0-alpha-2.pom.md5",
134             "wagon-1.0-alpha-2.pom.sha1",
135             "wagon-1.0-alpha-3-20050413.021234-4.pom",
136             "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
137             "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
138             "wagon-1.0-alpha-3-20050419.043745-5.pom",
139             "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
140             "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
141             "wagon-1.0-alpha-3-20050419.044035-6.pom",
142             "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
143             "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
144             "wagon-1.0-alpha-3-20050421.162738-7.pom",
145             "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
146             "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
147             "wagon-1.0-alpha-3-20050422.075233-8.pom",
148             "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
149             "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
150             "wagon-1.0-alpha-3-20050429.051847-9.pom",
151             "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
152             "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
153             "wagon-file/",
154             "wagon-ftp/",
155             "wagon-http-lightweight/",
156             "wagon-http/",
157             "wagon-lightweight-http/",
158             "wagon-provider-api/",
159             "wagon-provider-test/",
160             "wagon-provider/",
161             "wagon-providers-1.0-alpha-2.pom",
162             "wagon-providers-1.0-alpha-2.pom.asc",
163             "wagon-providers-1.0-alpha-2.pom.md5",
164             "wagon-providers-1.0-alpha-2.pom.sha1",
165             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
166             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
167             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
168             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
169             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
170             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
171             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
172             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
173             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
174             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
175             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
176             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
177             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
178             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
179             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
180             "wagon-providers/",
181             "wagon-scm/",
182             "wagon-ssh-external/",
183             "wagon-ssh/",
184             "wagon-webdav/",
185             "wagon/" };
186 
187         assertContainsExpected( links, expected );
188 
189         String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A", "?D=A", "?M=A", "?N=D", "?S=A" };
190 
191         assertNotContainingAvoided( links, avoided );
192     }
193 
194     /**
195      * Test of an html which is improperly formatted, and contains full host-specific paths to the resources.
196      * @throws Exception
197      */
198     public void testParseJetty()
199         throws Exception
200     {
201         List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
202                                              "jetty-wagon.html" );
203 
204         String[] expected = new String[] {
205             "wagon-1.0-alpha-2.pom",
206             "wagon-1.0-alpha-2.pom.asc",
207             "wagon-1.0-alpha-2.pom.md5",
208             "wagon-1.0-alpha-2.pom.sha1",
209             "wagon-1.0-alpha-3-20050413.021234-4.pom",
210             "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
211             "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
212             "wagon-1.0-alpha-3-20050419.043745-5.pom",
213             "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
214             "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
215             "wagon-1.0-alpha-3-20050419.044035-6.pom",
216             "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
217             "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
218             "wagon-1.0-alpha-3-20050421.162738-7.pom",
219             "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
220             "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
221             "wagon-1.0-alpha-3-20050422.075233-8.pom",
222             "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
223             "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
224             "wagon-1.0-alpha-3-20050429.051847-9.pom",
225             "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
226             "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
227             "wagon-file/",
228             "wagon-ftp/",
229             "wagon-http-lightweight/",
230             "wagon-http/",
231             "wagon-lightweight-http/",
232             "wagon-provider-api/",
233             "wagon-provider-test/",
234             "wagon-provider/",
235             "wagon-providers-1.0-alpha-2.pom",
236             "wagon-providers-1.0-alpha-2.pom.asc",
237             "wagon-providers-1.0-alpha-2.pom.md5",
238             "wagon-providers-1.0-alpha-2.pom.sha1",
239             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
240             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
241             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
242             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
243             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
244             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
245             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
246             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
247             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
248             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
249             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
250             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
251             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
252             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
253             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
254             "wagon-providers/",
255             "wagon-scm/",
256             "wagon-ssh-external/",
257             "wagon-ssh/",
258             "wagon-webdav/",
259             "wagon/" };
260 
261         assertContainsExpected( links, expected );
262 
263         String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
264 
265         assertNotContainingAvoided( links, avoided );
266     }
267 
268     /**
269      * Test of an html which is improperly formatted, contains full host-specific paths to the resources and uses non-normalized base URI
270      * @throws Exception
271      */
272     public void testParseJettyWithNonNormalizedBaseURI()
273         throws Exception
274     {
275         List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon//",
276                                              "jetty-wagon.html" );
277 
278         String[] expected = new String[] {
279             "wagon-1.0-alpha-2.pom",
280             "wagon-1.0-alpha-2.pom.asc",
281             "wagon-1.0-alpha-2.pom.md5",
282             "wagon-1.0-alpha-2.pom.sha1",
283             "wagon-1.0-alpha-3-20050413.021234-4.pom",
284             "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
285             "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
286             "wagon-1.0-alpha-3-20050419.043745-5.pom",
287             "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
288             "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
289             "wagon-1.0-alpha-3-20050419.044035-6.pom",
290             "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
291             "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
292             "wagon-1.0-alpha-3-20050421.162738-7.pom",
293             "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
294             "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
295             "wagon-1.0-alpha-3-20050422.075233-8.pom",
296             "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
297             "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
298             "wagon-1.0-alpha-3-20050429.051847-9.pom",
299             "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
300             "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
301             "wagon-file/",
302             "wagon-ftp/",
303             "wagon-http-lightweight/",
304             "wagon-http/",
305             "wagon-lightweight-http/",
306             "wagon-provider-api/",
307             "wagon-provider-test/",
308             "wagon-provider/",
309             "wagon-providers-1.0-alpha-2.pom",
310             "wagon-providers-1.0-alpha-2.pom.asc",
311             "wagon-providers-1.0-alpha-2.pom.md5",
312             "wagon-providers-1.0-alpha-2.pom.sha1",
313             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
314             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
315             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
316             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
317             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
318             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
319             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
320             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
321             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
322             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
323             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
324             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
325             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
326             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
327             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
328             "wagon-providers/",
329             "wagon-scm/",
330             "wagon-ssh-external/",
331             "wagon-ssh/",
332             "wagon-webdav/",
333             "wagon/" };
334 
335         assertContainsExpected( links, expected );
336 
337         String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
338 
339         assertNotContainingAvoided( links, avoided );
340     }
341 
342     /**
343      * Using repository.codehaus.org output as an example.
344      * This is an example of an older RHEL installation of apache httpd with old fancy indexing output
345      * This example tests how to detect directories properly.
346      * 
347      * @throws TransferFailedException
348      */
349     public void testParseMevenIde()
350         throws TransferFailedException
351     {
352         List<String> links = parseLinks( "http://repository.codehaus.org/org/codehaus/mevenide/", "mevenide.html" );
353 
354         String[] expected = new String[] {
355             "apisupport/",
356             "autoupdate/",
357             "continuum-rpc/",
358             "continuum/",
359             "debugger-bridge/",
360             "deployment-bridge/",
361             "feature/",
362             "grammar/",
363             "ide-mojos/",
364             "indexer/",
365             "j2ee/",
366             "junit/",
367             "maven-metadata.xml",
368             "maven-metadata.xml.md5",
369             "maven-metadata.xml.sha1",
370             "mevenide2-parent/",
371             "nb-mvn-embedder/",
372             "nb-project/",
373             "nb-repo-browser/",
374             "netbeans-debugger-plugin/",
375             "netbeans-deploy-plugin/",
376             "netbeans-libs/",
377             "netbeans-nbmreload-plugin/",
378             "netbeans-repository/",
379             "netbeans-run-plugin/",
380             "netbeans/",
381             "persistence/",
382             "plugin-bridges/",
383             "plugins/",
384             "reload-nbm-bridge/",
385             "run-jar-bridge/" };
386 
387         assertContainsExpected( links, expected );
388 
389         String[] avoided = new String[] { "/org/codehaus/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
390 
391         assertNotContainingAvoided( links, avoided );
392     }
393 
394     public void testParseMirror()
395         throws Exception
396     {
397         List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
398                                              "mirror-wagon.html" );
399 
400         String[] expected = new String[] {
401             "wagon-1.0-alpha-2.pom",
402             "wagon-1.0-alpha-2.pom.asc",
403             "wagon-1.0-alpha-2.pom.md5",
404             "wagon-1.0-alpha-2.pom.sha1",
405             "wagon-1.0-alpha-3-20050413.021234-4.pom",
406             "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
407             "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
408             "wagon-1.0-alpha-3-20050419.043745-5.pom",
409             "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
410             "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
411             "wagon-1.0-alpha-3-20050419.044035-6.pom",
412             "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
413             "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
414             "wagon-1.0-alpha-3-20050421.162738-7.pom",
415             "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
416             "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
417             "wagon-1.0-alpha-3-20050422.075233-8.pom",
418             "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
419             "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
420             "wagon-1.0-alpha-3-20050429.051847-9.pom",
421             "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
422             "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
423             "wagon-file/",
424             "wagon-ftp/",
425             "wagon-http-lightweight/",
426             "wagon-http/",
427             "wagon-lightweight-http/",
428             "wagon-provider-api/",
429             "wagon-provider-test/",
430             "wagon-provider/",
431             "wagon-providers-1.0-alpha-2.pom",
432             "wagon-providers-1.0-alpha-2.pom.asc",
433             "wagon-providers-1.0-alpha-2.pom.md5",
434             "wagon-providers-1.0-alpha-2.pom.sha1",
435             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
436             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
437             "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
438             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
439             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
440             "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
441             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
442             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
443             "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
444             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
445             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
446             "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
447             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
448             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
449             "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
450             "wagon-providers/",
451             "wagon-scm/",
452             "wagon-ssh-external/",
453             "wagon-ssh/",
454             "wagon-webdav/",
455             "wagon/" };
456 
457         assertContainsExpected( links, expected );
458 
459         String[] avoided = new String[] {
460             "/org/codehaus/",
461             "?C=S;O=A",
462             "?C=D;O=A",
463             "?C=M;O=A",
464             "mailto:mirror.admin@mirror.com" };
465 
466         assertNotContainingAvoided( links, avoided );
467     }
468 
469     /**
470      * Example of output from repo1.maven.org
471      * This example is of nekohtml specifically.
472      * 
473      * @throws TransferFailedException
474      */
475     public void testParseNekoHtml()
476         throws TransferFailedException
477     {
478         List<String> links = parseLinks( "http://repo1.maven.org//maven2/nekohtml/nekohtml/1.9.6/", "nekohtml.html" );
479 
480         String[] expected = new String[] {
481             "nekohtml-1.9.6-javadoc.jar",
482             "nekohtml-1.9.6-javadoc.jar.md5",
483             "nekohtml-1.9.6-javadoc.jar.sha1",
484             "nekohtml-1.9.6-sources.jar",
485             "nekohtml-1.9.6-sources.jar.md5",
486             "nekohtml-1.9.6-sources.jar.sha1",
487             "nekohtml-1.9.6.jar",
488             "nekohtml-1.9.6.jar.md5",
489             "nekohtml-1.9.6.jar.sha1",
490             "nekohtml-1.9.6.pom",
491             "nekohtml-1.9.6.pom.md5",
492             "nekohtml-1.9.6.pom.sha1" };
493 
494         assertContainsExpected( links, expected );
495 
496         String[] avoided = new String[] { "/maven2/nekohtml/nekohtml/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
497 
498         assertNotContainingAvoided( links, avoided );
499     }
500 
501     /**
502      * Example of detecting directories on repo1.maven.org
503      * 
504      * @throws TransferFailedException
505      */
506     public void testParseNetSourceforge()
507         throws TransferFailedException
508     {
509         List<String> links = parseLinks( "http://repo1.maven.org/maven2/net/sf/", "net_sf.html" );
510 
511         String[] expected = new String[] {
512             "a2j/",
513             "aislib/",
514             "alchim/",
515             "antenna/",
516             "apt-jelly/",
517             "beanlib/",
518             "bluecove/",
519             "buildbox/",
520             "click/",
521             "clirr/",
522             "datavision/",
523             "dozer/",
524             "dtddoc/",
525             "dynpageplus/",
526             "ehcache/",
527             "ezmorph/",
528             "falcon/",
529             "grester/",
530             "gwt-widget/",
531             "hermesftp/",
532             "hibernate/",
533             "jcharts/",
534             "jdatabaseimport/",
535             "jeceira/",
536             "jfcunit/",
537             "jfig/",
538             "jguard/",
539             "jipcam/",
540             "jlynx/",
541             "jour/",
542             "jpf/",
543             "json-lib/",
544             "jsptest/",
545             "jsr107cache/",
546             "jt400/",
547             "jxls/",
548             "kxml/",
549             "ldaptemplate/",
550             "locale4j/",
551             "mapasuta/",
552             "maven-har/",
553             "maven-sar/",
554             "opencsv/",
555             "oval/",
556             "proguard/",
557             "qdwizard/",
558             "resultsetmapper/",
559             "retrotranslator/",
560             "saxon/",
561             "shadesdb/",
562             "smc/",
563             "speculoos/",
564             "springlayout/",
565             "stat-scm/",
566             "statsvn/",
567             "stax/",
568             "struts/",
569             "tacos/",
570             "testextensions/",
571             "webdav-servlet/" };
572 
573         assertContainsExpected( links, expected );
574 
575         String[] avoided = new String[] { "/maven2/net/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
576 
577         assertNotContainingAvoided( links, avoided );
578     }
579 
580     /**
581      * Another larger example of the directory link detection on repository.codehaus.org
582      * 
583      * @throws TransferFailedException
584      */
585     public void testParseOrgCodehaus()
586         throws TransferFailedException
587     {
588         List<String> links = parseLinks( "http://repository.codehaus.org/org/codehaus", "org.codehaus.html" );
589 
590         String[] expected = new String[] {
591             "agilifier/",
592             "benji/",
593             "bruce/",
594             "btm/",
595             "cargo/",
596             "castor-spring/",
597             "castor/",
598             "cozmos/",
599             "dataforge/",
600             "dimple/",
601             "droolsdotnet/",
602             "enunciate/",
603             "fabric3/",
604             "gant/",
605             "grails-plugins/",
606             "groovy/",
607             "gsoc/",
608             "guessencoding/",
609             "gumtree/",
610             "gwt-openlayers/",
611             "haus/",
612             "izpack/",
613             "javasim/",
614             "jedi/",
615             "jequel/",
616             "jet/",
617             "jettison/",
618             "jfdi/",
619             "jikesrvm/",
620             "jra/",
621             "jremoting/",
622             "jtestme/",
623             "jtestr/",
624             "labs-ng/",
625             "logicabyss/",
626             "marionette/",
627             "mevenide/",
628             "modello/",
629             "mojo/",
630             "mvel/",
631             "mvflex/",
632             "native-mojo/",
633             "openim/",
634             "plexus/",
635             "polymap/",
636             "prometheus/",
637             "prophit/",
638             "quaere/",
639             "redback/",
640             "rulessandpit/",
641             "rvm/",
642             "savana/",
643             "scala-ide/",
644             "senro/",
645             "sonar/",
646             "staxmate/",
647             "stomp/",
648             "svn4j/",
649             "swiby/",
650             "swizzle/",
651             "sxc/",
652             "testdox/",
653             "wadi/",
654             "waffle/",
655             "woodstox/",
656             "xdoclet/",
657             "xfire/",
658             "xharness/",
659             "xsite/",
660             "xstream/",
661             "xwire/" };
662 
663         assertContainsExpected( links, expected );
664 
665         String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
666 
667         assertNotContainingAvoided( links, avoided );
668     }
669 
670     /**
671      * Test the output found from apache httpd with fancy indexing and dav module.
672      * Using people.apache.org output as source material.
673      * 
674      * @throws TransferFailedException
675      */
676     public void testParsePeopleApacheOrg()
677         throws TransferFailedException
678     {
679         List<String> links = parseLinks(
680                                              "http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/maven/archiva/archiva-plexus-runtime/1.0.1/",
681                                              "org.apache.maven.html" );
682 
683         String[] expected = new String[] {
684             "archiva-plexus-runtime-1.0.1-bin.tar.gz",
685             "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc",
686             "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc.md5",
687             "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc.sha1",
688             "archiva-plexus-runtime-1.0.1-bin.tar.gz.md5",
689             "archiva-plexus-runtime-1.0.1-bin.tar.gz.sha1",
690             "archiva-plexus-runtime-1.0.1-bin.zip",
691             "archiva-plexus-runtime-1.0.1-bin.zip.asc",
692             "archiva-plexus-runtime-1.0.1-bin.zip.asc.md5",
693             "archiva-plexus-runtime-1.0.1-bin.zip.asc.sha1",
694             "archiva-plexus-runtime-1.0.1-bin.zip.md5",
695             "archiva-plexus-runtime-1.0.1-bin.zip.sha1",
696             "archiva-plexus-runtime-1.0.1-sources.jar",
697             "archiva-plexus-runtime-1.0.1-sources.jar.asc",
698             "archiva-plexus-runtime-1.0.1-sources.jar.asc.md5",
699             "archiva-plexus-runtime-1.0.1-sources.jar.asc.sha1",
700             "archiva-plexus-runtime-1.0.1-sources.jar.md5",
701             "archiva-plexus-runtime-1.0.1-sources.jar.sha1",
702             "archiva-plexus-runtime-1.0.1.jar",
703             "archiva-plexus-runtime-1.0.1.jar.asc",
704             "archiva-plexus-runtime-1.0.1.jar.asc.md5",
705             "archiva-plexus-runtime-1.0.1.jar.asc.sha1",
706             "archiva-plexus-runtime-1.0.1.jar.md5",
707             "archiva-plexus-runtime-1.0.1.jar.sha1",
708             "archiva-plexus-runtime-1.0.1.pom",
709             "archiva-plexus-runtime-1.0.1.pom.asc",
710             "archiva-plexus-runtime-1.0.1.pom.asc.md5",
711             "archiva-plexus-runtime-1.0.1.pom.asc.sha1",
712             "archiva-plexus-runtime-1.0.1.pom.md5",
713             "archiva-plexus-runtime-1.0.1.pom.sha1",
714             "readme artifacts.txt"};
715 
716         assertContainsExpected( links, expected );
717 
718         String[] avoided = new String[] {
719             "/repo/m2-ibiblio-rsync-repository/org/apache/maven/archiva/archiva-plexus-runtime/",
720             "?C=S;O=A",
721             "?C=D;O=A",
722             "?C=M;O=A" };
723 
724         assertNotContainingAvoided( links, avoided );
725     }
726 }