View Javadoc

1   /*
2    * Copyright 1999,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.commons.feedparser.test;
18  
19  import java.io.BufferedReader;
20  import java.io.InputStreamReader;
21  import java.net.URL;
22  import java.net.URLConnection;
23  
24  import junit.framework.TestCase;
25  
26  import org.apache.commons.feedparser.FeedList;
27  import org.apache.commons.feedparser.locate.BlogServiceDiscovery;
28  import org.apache.commons.feedparser.locate.FeedLocator;
29  import org.apache.commons.feedparser.locate.FeedReference;
30  import org.apache.commons.feedparser.locate.ProbeLocator;
31  import org.apache.commons.feedparser.locate.blogservice.AOLJournal;
32  import org.apache.commons.feedparser.locate.blogservice.BlogService;
33  import org.apache.commons.feedparser.locate.blogservice.Blogger;
34  import org.apache.commons.feedparser.locate.blogservice.Blosxom;
35  import org.apache.commons.feedparser.locate.blogservice.GreyMatter;
36  import org.apache.commons.feedparser.locate.blogservice.LiveJournal;
37  import org.apache.commons.feedparser.locate.blogservice.PMachine;
38  import org.apache.commons.feedparser.locate.blogservice.RadioUserland;
39  import org.apache.commons.feedparser.locate.blogservice.TextAmerica;
40  import org.apache.commons.feedparser.locate.blogservice.TextPattern;
41  import org.apache.commons.feedparser.locate.blogservice.Typepad;
42  import org.apache.commons.feedparser.locate.blogservice.Unknown;
43  import org.apache.commons.feedparser.locate.blogservice.WordPress;
44  import org.apache.commons.feedparser.locate.blogservice.Xanga;
45  
46  /**
47   *
48   * @author <a href="mailto:bkn3@columbia.edu">Brad Neuberg</a>
49   * @version $Id: TestProbeLocator.java 373622 2006-01-30 22:53:00Z mvdb $
50   */
51  public class TestProbeLocator extends TestCase {
52      public static boolean NO_ATOM_FEED = false;
53      public static boolean HAS_ATOM_FEED = true;
54      
55      public static boolean NO_RSS_FEED = false;
56      public static boolean HAS_RSS_FEED = true;
57      
58      public TestProbeLocator(String name) throws Exception {
59          super(name);
60          ProbeLocator.AGGRESIVE_PROBING_ENABLED = true;
61          ProbeLocator.BLOG_SERVICE_PROBING_ENABLED = true;
62      }
63      
64      public static void main( String[] args ) throws Exception {
65          TestProbeLocator test = new TestProbeLocator( null );
66  
67          test.testBlogger();
68          test.testLiveJournal();
69          test.testDiaryLand();
70          test.testMovableType();
71          test.testXanga();
72          test.testWordPress();
73          test.testAOLJournal();
74          test.testTypePad();
75          test.testGreyMatter();
76          test.testPMachine();
77          //test.testBlosxom();
78          test.testRadioUserland();
79          test.testTextPattern();
80          test.testTextAmerica();
81      }
82  
83      public void testBlogger() throws Exception {   
84          System.out.println("\nTesting Blogger...");
85          testSite( "http://edpro.blogspot.com/",
86                    new Blogger(),
87                    1, 
88                    new String[] { FeedReference.ATOM_MEDIA_TYPE },
89                    new String[] { "http://edpro.blogspot.com/atom.xml" },
90                    HAS_ATOM_FEED,
91                    "http://edpro.blogspot.com/atom.xml",
92                    NO_RSS_FEED,
93                    null );
94          
95          testSite("http://carolinascl.blogspot.com/", new Blogger(), 1, 
96                   new String[] { FeedReference.ATOM_MEDIA_TYPE },
97                   new String[] { "http://carolinascl.blogspot.com/atom.xml" },
98                   HAS_ATOM_FEED, "http://carolinascl.blogspot.com/atom.xml", 
99                   NO_RSS_FEED, null);
100         
101         testSite("http://azizindia.blogspot.com/", new Blogger(), 1, 
102                  new String[] { FeedReference.ATOM_MEDIA_TYPE },
103                  new String[] { "http://azizindia.blogspot.com/atom.xml" },
104                  HAS_ATOM_FEED, "http://azizindia.blogspot.com/atom.xml", 
105                  NO_RSS_FEED, null);
106         
107         // This site has no blogs
108         testSite("http://davebarry.blogspot.com/", new Blogger(), 0, 
109                  new String[] { },
110                  new String[] { },
111                  NO_ATOM_FEED, null, 
112                  NO_RSS_FEED, null);
113     }
114 
115     public void testLiveJournal() throws Exception {
116        System.out.println("\nTesting LiveJournal...");
117        testSite("http://www.livejournal.com/community/indiexiankids/", 
118                 new LiveJournal(), 2, 
119                 new String[] { 
120                                FeedReference.ATOM_MEDIA_TYPE, 
121                                FeedReference.RSS_MEDIA_TYPE 
122                              },
123                 new String[] { 
124                                "http://www.livejournal.com/community/indiexiankids/data/atom",
125                                "http://www.livejournal.com/community/indiexiankids/data/rss"
126                              },
127                 HAS_ATOM_FEED, "http://www.livejournal.com/community/indiexiankids/data/atom",
128                 HAS_RSS_FEED, "http://www.livejournal.com/community/indiexiankids/data/rss");
129 
130        testSite("http://www.livejournal.com/community/ajoyforever/", 
131                 new LiveJournal(), 2, 
132                 new String[] { 
133                                FeedReference.ATOM_MEDIA_TYPE, 
134                                FeedReference.RSS_MEDIA_TYPE 
135                              },
136                 new String[] { 
137                                "http://www.livejournal.com/community/ajoyforever/data/atom",
138                                "http://www.livejournal.com/community/ajoyforever/data/rss"
139                              },
140                 HAS_ATOM_FEED, "http://www.livejournal.com/community/ajoyforever/data/atom",
141                 HAS_RSS_FEED, "http://www.livejournal.com/community/ajoyforever/data/rss");
142 
143         testSite("http://www.livejournal.com/users/_jb_/12332.html", 
144                  new LiveJournal(), 2, 
145                  new String[] { 
146                                 FeedReference.ATOM_MEDIA_TYPE, 
147                                 FeedReference.RSS_MEDIA_TYPE 
148                               },
149                  new String[] { 
150                                 "http://www.livejournal.com/users/_jb_/data/atom",
151                                 "http://www.livejournal.com/users/_jb_/data/rss"
152                               },
153                  HAS_ATOM_FEED, "http://www.livejournal.com/users/_jb_/data/atom",
154                  HAS_RSS_FEED, "http://www.livejournal.com/users/_jb_/data/rss");
155     }
156 
157     public void testDiaryLand() throws Exception {
158         System.out.println("\nTesting DiaryLand... No tests currently");
159         // FIXME: Test this
160     }
161 
162     public void testMovableType() throws Exception {
163         System.out.println("\nTesting MovableType... No tests currently");
164         // FIXME: Test this
165     }
166 
167     public void testXanga() throws Exception {
168         System.out.println("\nTesting Xanga...");
169         testSite("http://www.xanga.com/home.aspx?user=lithium98", 
170                  new Xanga(), 1, 
171                  new String[] { FeedReference.RSS_MEDIA_TYPE },
172                  new String[] { "http://www.xanga.com/rss.aspx?user=lithium98" },
173                  NO_ATOM_FEED, null,
174                  HAS_RSS_FEED, "http://www.xanga.com/rss.aspx?user=lithium98");
175 
176         testSite("http://www.xanga.com/home.aspx?user=ChUnSA_86", 
177                  new Xanga(), 1, 
178                  new String[] { FeedReference.RSS_MEDIA_TYPE },
179                  new String[] { "http://www.xanga.com/rss.aspx?user=ChUnSA_86" },
180                  NO_ATOM_FEED, null,
181                  HAS_RSS_FEED, "http://www.xanga.com/rss.aspx?user=ChUnSA_86");
182         
183         testSite("http://www.xanga.com/home.aspx?user=wdfphillz", 
184                  new Xanga(), 1, 
185                  new String[] { FeedReference.RSS_MEDIA_TYPE },
186                  new String[] { "http://www.xanga.com/rss.aspx?user=wdfphillz" },
187                  NO_ATOM_FEED, null,
188                  HAS_RSS_FEED, "http://www.xanga.com/rss.aspx?user=wdfphillz");
189 
190         // FIXME: We should be able to pass this test when we
191         // expand resources inside of the Feed Parser; we don't
192         // currently do this yet, Brad Neuberg, bkn3@columbia.edu
193         /*testSite("http://xanga.com/home.aspx?user=joe" target="alexandria_uri">http://xanga.com/home.aspx?user=joe", 
194                  new Xanga(), 1, 
195                  new String[] { FeedReference.RSS_MEDIA_TYPE },
196                  new String[] { "http://www.xanga.com/rss.aspx?user=joe" },
197                  NO_ATOM_FEED, null,
198                  HAS_RSS_FEED, "http://www.xanga.com/rss.aspx?user=joe");*/
199     }
200 
201     public void testWordPress() throws Exception {
202         System.out.println("\nTesting WordPress...");
203         // This site went down
204         /*testSite("http://zh.yazzy.org/blog/index.php" target="alexandria_uri">http://zh.yazzy.org/blog/index.php", 
205                  new WordPress(), 3, 
206                  new String[] { 
207                                 FeedReference.ATOM_MEDIA_TYPE, 
208                                 FeedReference.RSS_MEDIA_TYPE,
209                                 FeedReference.RSS_MEDIA_TYPE 
210                               },
211                  new String[] { 
212                                 "http://synflood.at/blog/wp-atom.php",
213                                 "http://synflood.at/blog/wp-rss2.php",
214                                 "http://synflood.at/blog/wp-rss.php"
215                               },
216                  HAS_ATOM_FEED, "http://synflood.at/blog/wp-atom.php",
217                  HAS_RSS_FEED, "http://synflood.at/blog/wp-rss2.php");
218         */
219         // We need to firm up our autodiscovery regular expressions before
220         // this will pass; what happens is it has autodiscovery, but those
221         // point to a different location than the usual ones aggresive
222         // discovery would find (which are also there).  We get back different
223         // results at different times
224         /*testSite("http://zh.yazzy.org/blog/index.php" target="alexandria_uri">http://zh.yazzy.org/blog/index.php", 
225                  new WordPress(), 3, 
226                  new String[] { 
227                                 FeedReference.ATOM_MEDIA_TYPE, 
228                                 FeedReference.RSS_MEDIA_TYPE,
229                                 FeedReference.RSS_MEDIA_TYPE 
230                               },
231                  new String[] { 
232                                 "http://zh.yazzy.org/blog/wp-atom.php",
233                                 "http://zh.yazzy.org/blog/wp-rss2.php",
234                                 "http://zh.yazzy.org/blog/wp-rss.php"
235                               },
236                  HAS_ATOM_FEED, "http://zh.yazzy.org/blog/wp-atom.php",
237                  HAS_RSS_FEED, "http://zh.yazzy.org/blog/wp-rss2.php");
238         */
239         testSite("http://holmes.hgen.pitt.edu/~dweeks/wordpress/", 
240                  new WordPress(), 3, 
241                  new String[] { 
242                                 FeedReference.ATOM_MEDIA_TYPE, 
243                                 FeedReference.RSS_MEDIA_TYPE,
244                                 FeedReference.RSS_MEDIA_TYPE 
245                               },
246                  new String[] { 
247                                 "http://holmes.hgen.pitt.edu/~dweeks/wordpress/wp-atom.php",
248                                 "http://holmes.hgen.pitt.edu/~dweeks/wordpress/wp-rss2.php",
249                                 "http://holmes.hgen.pitt.edu/~dweeks/wordpress/wp-rss.php"
250                               },
251                  HAS_ATOM_FEED, "http://holmes.hgen.pitt.edu/~dweeks/wordpress/wp-atom.php",
252                  HAS_RSS_FEED, "http://holmes.hgen.pitt.edu/~dweeks/wordpress/wp-rss2.php");
253     }
254 
255     public void testAOLJournal() throws Exception {
256         System.out.println("\nTesting AOL Journal...");
257         /* AOL recently turned on experimental Atom support, but it is still 
258            buggy; it turns out we can "see" it through autodiscovery but not
259            through aggresive link probing, since their server returns a 500
260            HTTP internal server error if we do a HEAD request.  For this
261            reason we have to divide our testing between the probe locator
262            and feed locator because they give different results for this
263            kind of blog service currently.
264         */
265         testProbeLocator(
266                  "http://journals.aol.com/redhdka/BrandNewDay/", 
267                  new AOLJournal(), 1, 
268                  new String[] { 
269                                 FeedReference.RSS_MEDIA_TYPE
270                               },
271                  new String[] { 
272                      "http://journals.aol.com/redhdka/BrandNewDay/rss.xml" 
273                               },
274                  NO_ATOM_FEED, null,
275                  HAS_RSS_FEED, "http://journals.aol.com/redhdka/BrandNewDay/rss.xml");
276         testFeedLocator(
277                  "http://journals.aol.com/redhdka/BrandNewDay/", 
278                  new AOLJournal(), 2, 
279                  new String[] { 
280                                 FeedReference.ATOM_MEDIA_TYPE,
281                                 FeedReference.RSS_MEDIA_TYPE
282                               },
283                  new String[] { 
284                                 "http://journals.aol.com/redhdka/BrandNewDay/atom.xml",
285                                 "http://journals.aol.com/redhdka/BrandNewDay/rss.xml" 
286                               },
287                  HAS_ATOM_FEED, "http://journals.aol.com/redhdka/BrandNewDay/atom.xml",
288                  HAS_RSS_FEED, "http://journals.aol.com/redhdka/BrandNewDay/rss.xml");
289         
290         testProbeLocator(
291                  "http://journals.aol.com/goldenchildnc/GCS/", 
292                  new AOLJournal(), 1, 
293                  new String[] { 
294                                 FeedReference.RSS_MEDIA_TYPE
295                               },
296                  new String[] { 
297                                 "http://journals.aol.com/goldenchildnc/GCS/rss.xml" 
298                               },
299                  NO_ATOM_FEED, null,
300                  HAS_RSS_FEED, "http://journals.aol.com/goldenchildnc/GCS/rss.xml");
301         testFeedLocator(
302                  "http://journals.aol.com/goldenchildnc/GCS/", 
303                  new AOLJournal(), 2, 
304                  new String[] { 
305                                 FeedReference.ATOM_MEDIA_TYPE,
306                                 FeedReference.RSS_MEDIA_TYPE
307                               },
308                  new String[] { 
309                                 "http://journals.aol.com/goldenchildnc/GCS/atom.xml",
310                                 "http://journals.aol.com/goldenchildnc/GCS/rss.xml" 
311                               },
312                  HAS_ATOM_FEED, "http://journals.aol.com/goldenchildnc/GCS/atom.xml",
313                  HAS_RSS_FEED, "http://journals.aol.com/goldenchildnc/GCS/rss.xml");
314 
315         
316         testProbeLocator(
317                  "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/", 
318                  new AOLJournal(), 1, 
319                  new String[] { 
320                                 FeedReference.RSS_MEDIA_TYPE
321                               },
322                  new String[] { 
323                                 "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/rss.xml" 
324                               },
325                  NO_ATOM_FEED, null,
326                  HAS_RSS_FEED, "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/rss.xml");
327         testFeedLocator(
328                  "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/", 
329                  new AOLJournal(), 2, 
330                  new String[] { 
331                                 FeedReference.ATOM_MEDIA_TYPE,
332                                 FeedReference.RSS_MEDIA_TYPE
333                               },
334                  new String[] { 
335                                 "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/atom.xml",
336                                 "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/rss.xml" 
337                               },
338                  HAS_ATOM_FEED, "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/atom.xml",
339                  HAS_RSS_FEED, "http://journals.aol.com/mkgninja/MelissasMisunderstandingsofLife/rss.xml");
340     }
341 
342     public void testTypePad() throws Exception {
343         System.out.println("\nTesting TypePad...");
344         // This site has no feed that we can link probe for (it's in a different
345         // location then usual).
346         // However, we get a feed when we go through the FeedParser since
347         // the site has autodiscovery
348         testSite("http://lynikers.typepad.com/", 
349                  new Typepad(), 0, 
350                  new String[] { },
351                  new String[] { },
352                  HAS_ATOM_FEED, "http://lynikers.typepad.com/on_buck_lake/atom.xml",
353                  HAS_RSS_FEED, "http://lynikers.typepad.com/on_buck_lake/index.rdf");
354 
355         // This site has no feed that we can link probe for (it's in a different
356         // location then usual).
357         testSite("http://emmeke.typepad.com/", 
358                  new Typepad(), 0, 
359                  new String[] { },
360                  new String[] { },
361                  NO_ATOM_FEED, null,
362                  HAS_RSS_FEED, "http://emmeke.typepad.com/blog/index.rdf");
363 
364         testSite("http://www.prettypolitical.com/", 
365                  new Typepad(), 2, 
366                  new String[] { 
367                                 FeedReference.ATOM_MEDIA_TYPE, 
368                                 FeedReference.RSS_MEDIA_TYPE
369                               },
370                  new String[] { 
371                                 "http://www.prettypolitical.com/atom.xml",
372                                 "http://www.prettypolitical.com/index.rdf"
373                               },
374                  HAS_ATOM_FEED, "http://www.prettypolitical.com/atom.xml",
375                  HAS_RSS_FEED, "http://www.prettypolitical.com/index.rdf");
376     }
377 
378     public void testGreyMatter() throws Exception {
379         System.out.println("\nTesting GreyMatter...");
380         // No feeds supported
381         testSite("http://www.chattbike.com/gilligan/", 
382                  new GreyMatter(), 0, 
383                  new String[] { },
384                  new String[] { },
385                  NO_ATOM_FEED, null,
386                  NO_RSS_FEED, null);
387 
388         // No feeds supported
389         testSite("http://www.electricedge.com/greymatter/", 
390                  new GreyMatter(), 0, 
391                  new String[] { },
392                  new String[] { },
393                  NO_ATOM_FEED, null,
394                  NO_RSS_FEED, null);
395     }
396 
397     public void testPMachine() throws Exception {
398         System.out.println("\nTesting PMachine...");
399         testSite("http://bamph.com", 
400                  new Unknown(), 1, 
401                  new String[] { FeedReference.RSS_MEDIA_TYPE },
402                  new String[] { "http://bamph.com/index.xml" },
403                  NO_ATOM_FEED, null,
404                  HAS_RSS_FEED, "http://bamph.com/index.xml");
405         
406         testSite("http://bucsfishingreport.com/pMachine/weblog.php", 
407                  new PMachine(), 1, 
408                  new String[] { FeedReference.RSS_MEDIA_TYPE },
409                  new String[] { "http://bucsfishingreport.com/pMachine/index.xml" },
410                  NO_ATOM_FEED, null,
411                  HAS_RSS_FEED, "http://bucsfishingreport.com/pMachine/index.xml");
412         
413         testSite("http://www.simplekindoflife.com/pMachine/weblog.php", 
414                  new PMachine(), 1, 
415                  new String[] { FeedReference.RSS_MEDIA_TYPE },
416                  new String[] { "http://www.simplekindoflife.com/pMachine/index.xml" },
417                  NO_ATOM_FEED, null,
418                  HAS_RSS_FEED, "http://www.simplekindoflife.com/pMachine/index.xml");
419         
420         testSite("http://www.mondfish.net/pmachine/weblog.php", 
421                  new PMachine(), 1, 
422                  new String[] { FeedReference.RSS_MEDIA_TYPE },
423                  new String[] { "http://www.mondfish.net/pmachine/index.xml" },
424                  NO_ATOM_FEED, null,
425                  HAS_RSS_FEED, "http://www.mondfish.net/pmachine/index.xml");
426     }
427 
428     public void testBlosxom() throws Exception {
429         System.out.println("\nTesting Blosxom...");
430         testSite("http://mikemason.ca/", 
431                  new Blosxom(), 1, 
432                  new String[] { FeedReference.RSS_MEDIA_TYPE },
433                  new String[] { "http://mikemason.ca/index.rss" },
434                  NO_ATOM_FEED, null,
435                  HAS_RSS_FEED, "http://mikemason.ca/index.rss");
436 
437         // Wed Mar 02 2005 06:07 PM (burton1@rojo.com): note... this no longer
438         // looks like a Bloxsom blog.  It has autodiscovery though.
439         //  
440         //
441         //         testSite("http://www.foobargeek.com/", 
442         //                  new Blosxom(), 1, 
443         //                  new String[] { FeedReference.RSS_MEDIA_TYPE },
444         //                  new String[] { "http://www.foobargeek.com/index.rss" },
445         //                  NO_ATOM_FEED, null,
446         //                  HAS_RSS_FEED, "http://www.foobargeek.com/index.rss");
447         
448         // The FeedParser gets a different location for the XML file then
449         // through the aggresive prober for this feed
450 
451         //         testSite("http://www.pipetree.com/qmacro/", 
452         //                  new Blosxom(), 1, 
453         //                  new String[] { FeedReference.RSS_MEDIA_TYPE },
454         //                  new String[] { "http://www.pipetree.com/qmacro/index.rss" },
455         //                  NO_ATOM_FEED, null,
456         //                  HAS_RSS_FEED, "http://www.pipetree.com/qmacro/xml");
457 
458         testSite("http://www.bitbucketheaven.com/cgi-bin/blosxom.cgi", 
459                  new Blosxom(), 1, 
460                  new String[] { FeedReference.RSS_MEDIA_TYPE },
461                  new String[] { "http://www.bitbucketheaven.com/cgi-bin/blosxom.cgi/index.rss" },
462                  NO_ATOM_FEED, null,
463                  HAS_RSS_FEED, "http://www.bitbucketheaven.com/cgi-bin/blosxom.cgi/index.rss");
464     }
465     
466     public void testRadioUserland() throws Exception {
467         System.out.println("\nTesting Radio Userland...");
468         testSite("http://radio.weblogs.com/0131722/", 
469                  new RadioUserland(), 1, 
470                  new String[] { FeedReference.RSS_MEDIA_TYPE },
471                  new String[] { "http://radio.weblogs.com/0131722/rss.xml" },
472                  NO_ATOM_FEED, null,
473                  HAS_RSS_FEED, "http://radio.weblogs.com/0131722/rss.xml");
474         
475         testSite("http://radio.weblogs.com/0131724/", 
476                  new RadioUserland(), 1, 
477                  new String[] { FeedReference.RSS_MEDIA_TYPE },
478                  new String[] { "http://radio.weblogs.com/0131724/rss.xml" },
479                  NO_ATOM_FEED, null,
480                  HAS_RSS_FEED, "http://radio.weblogs.com/0131724/rss.xml");
481         
482         testSite("http://radio.weblogs.com/0131734/", 
483                  new RadioUserland(), 1, 
484                  new String[] { FeedReference.RSS_MEDIA_TYPE },
485                  new String[] { "http://radio.weblogs.com/0131734/rss.xml" },
486                  NO_ATOM_FEED, null,
487                  HAS_RSS_FEED, "http://radio.weblogs.com/0131734/rss.xml");
488     }
489     
490     public void testTextPattern() throws Exception {
491         System.out.println("\nTesting TextPattern...");
492         testSite("http://www.digitalmediaminute.com/", 
493                  new TextPattern(), 2, 
494                  new String[] { 
495                                 FeedReference.ATOM_MEDIA_TYPE, 
496                                 FeedReference.RSS_MEDIA_TYPE
497                               },
498                  new String[] { 
499                                 "http://www.digitalmediaminute.com/?atom=1",
500                                 "http://www.digitalmediaminute.com/?rss=1"
501                               },
502                  HAS_ATOM_FEED, "http://www.digitalmediaminute.com/?atom=1",
503                  HAS_RSS_FEED, "http://www.digitalmediaminute.com/?rss=1");
504     }
505     
506     public void testTextAmerica() throws Exception {
507         System.out.println("\nTesting TextAmerica...");
508         testSite("http://morganwebb.textamerica.com/", 
509                  new TextAmerica(), 1, 
510                  new String[] { 
511                                 FeedReference.RSS_MEDIA_TYPE
512                               },
513                  new String[] { 
514                                 "http://morganwebb.textamerica.com/rss.aspx"
515                               },
516                  NO_ATOM_FEED, null,
517                  HAS_RSS_FEED, "http://morganwebb.textamerica.com/rss.aspx");
518         
519         testSite("http://northlan.textamerica.com/", 
520                  new TextAmerica(), 1, 
521                  new String[] { 
522                                 FeedReference.RSS_MEDIA_TYPE
523                               },
524                  new String[] { 
525                                 "http://northlan.textamerica.com/rss.aspx"
526                               },
527                  NO_ATOM_FEED, null,
528                  HAS_RSS_FEED, "http://northlan.textamerica.com/rss.aspx");
529         
530         testSite("http://mycamphone.textamerica.com/", 
531                  new TextAmerica(), 1, 
532                  new String[] { 
533                                 FeedReference.RSS_MEDIA_TYPE
534                               },
535                  new String[] { 
536                                 "http://mycamphone.textamerica.com/rss.aspx"
537                               },
538                  NO_ATOM_FEED, null,
539                  HAS_RSS_FEED, "http://mycamphone.textamerica.com/rss.aspx");
540     }
541 
542     /** Grabs all the content for a weblog for testing purposes. */
543     protected String getContent(String resource) throws Exception {
544 
545         //FIXME: use the IO package from NewsMonster for this.
546 
547         URL resourceURL = new URL(resource);
548         URLConnection con = resourceURL.openConnection();
549         con.connect();
550         BufferedReader in = new BufferedReader(new InputStreamReader(con
551                                         .getInputStream()));
552         StringBuffer results = new StringBuffer();
553         String line = null;
554 
555         while ((line = in.readLine()) != null) {
556             results.append(line);
557         }
558 
559         return results.toString();
560     }
561     
562     private void testSite(String resource, BlogService correctBlogService,
563                           int numberOfFeeds, String feedType[],
564                           String feedURL[], boolean hasAtomFeed,
565                           String atomFeedURL, boolean hasRSSFeed,
566                           String rssFeedURL) throws Exception {
567         System.out.println("Testing " + resource + "...");
568         /* Test through the probe locator */
569         testProbeLocator(resource, correctBlogService, numberOfFeeds, 
570                          feedType, feedURL, hasAtomFeed,
571                          atomFeedURL, hasRSSFeed, rssFeedURL);
572         
573         /* Test through the FeedLocator */
574         testFeedLocator(resource, correctBlogService, numberOfFeeds, 
575                         feedType, feedURL, hasAtomFeed,
576                         atomFeedURL, hasRSSFeed, rssFeedURL);
577     }
578     
579     private FeedList testProbeLocator(String resource, BlogService correctBlogService,
580                                       int numberOfFeeds, String feedType[],
581                                       String feedURL[], boolean hasAtomFeed,
582                                       String atomFeedURL, boolean hasRSSFeed,
583                                       String rssFeedURL) throws Exception {
584         String content = getContent(resource);
585         assertNotNull(content);
586         
587         BlogService blogService = BlogServiceDiscovery.discover(resource, content);
588         assertEquals(correctBlogService, blogService);
589         
590         FeedList list = new FeedList();
591         ProbeLocator.locate(resource, content, list);
592         assertEquals(numberOfFeeds, list.size());
593 
594         FeedReference[] feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
595         assertEquals(numberOfFeeds, feeds.length);
596         
597         for (int i = 0; i < feeds.length; i++) {
598             assertEquals(FeedReference.METHOD_PROBE_DISCOVERY, feeds[i].method);
599             assertNull(null, feeds[i].title);
600             assertEquals(feedType[i], feeds[i].type);
601             assertEquals(feedURL[i], feeds[i].resource);
602         }
603         
604         return list;
605     }
606     
607     private FeedList testFeedLocator( String resource,
608                                       BlogService correctBlogService,
609                                       int numberOfFeeds,
610                                       String feedType[],
611                                       String feedURL[],
612                                       boolean hasAtomFeed,
613                                       String atomFeedURL,
614                                       boolean hasRSSFeed,
615                                       String rssFeedURL ) throws Exception {
616 
617         FeedList list = FeedLocator.locate( resource );
618         FeedReference atomFeed = list.getAdAtomFeed();
619         FeedReference rssFeed = list.getAdRSSFeed();
620         if (hasAtomFeed) {
621             assertNotNull(atomFeed);
622             assertEquals(FeedReference.ATOM_MEDIA_TYPE, atomFeed.type);
623             assertEquals(atomFeedURL, atomFeed.resource);
624         }
625         else
626             assertNull(atomFeed);
627         
628         if (hasRSSFeed) {
629             assertNotNull(rssFeed);
630             assertEquals(FeedReference.RSS_MEDIA_TYPE, rssFeed.type);
631             assertEquals(rssFeedURL, rssFeed.resource);
632         }
633         else
634             assertNull(rssFeed);
635         
636         return list;
637     }
638 }