2005-02-02 07:03:09 +01:00
###
# Copyright (c) 2002-2004, Jeremiah Fincher
2012-09-01 16:16:48 +02:00
# Copyright (c) 2009, James McCoy
2005-02-02 07:03:09 +01:00
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
2014-07-31 00:00:20 +02:00
import sys
import feedparser
2005-02-02 07:03:09 +01:00
from supybot . test import *
2014-07-31 00:00:20 +02:00
import supybot . conf as conf
2015-08-11 16:50:23 +02:00
import supybot . utils . minisix as minisix
2014-07-31 00:00:20 +02:00
xkcd_old = """ <?xml version= " 1.0 " encoding= " utf-8 " ?>
< rss version = " 2.0 " > < channel > < title > xkcd . com < / title > < link > http : / / xkcd . com / < / link > < description > xkcd . com : A webcomic of romance and math humor . < / description > < language > en < / language > < item > < title > Snake Facts < / title > < link > http : / / xkcd . com / 1398 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/snake_facts.png " title = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " alt = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " / & gt ; < / description > < pubDate > Wed , 23 Jul 2014 04 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1398 / < / guid > < / item > < / channel > < / rss >
"""
xkcd_new = """ <?xml version= " 1.0 " encoding= " utf-8 " ?>
2017-01-27 21:00:49 +01:00
< rss version = " 2.0 " > < channel > < title > xkcd . com < / title > < link > http : / / xkcd . com / < / link > < description > xkcd . com : A webcomic of romance and math humor . < / description > < language > en < / language > < item > < title > Telescopes : Refractor vs Reflector < / title > < link > http : / / xkcd . com / 1791 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/telescopes_refractor_vs_reflector.png " title = " On the other hand, the refractor ' s limited light-gathering means it ' s unable to make out shadow people or the dark god Chernabog. " alt = " On the other hand, the refractor ' s limited light-gathering means it ' s unable to make out shadow people or the dark god Chernabog. " / & gt ; < / description > < pubDate > Fri , 27 Jan 2017 05 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1791 / < / guid > < / item > < item > < title > Chaos < / title > < link > http : / / xkcd . com / 1399 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/chaos.png " title = " Although the oral exam for the doctorate was just ' can you do that weird laugh? ' " alt = " Although the oral exam for the doctorate was just ' can you do that weird laugh? ' " / & gt ; < / description > < pubDate > Fri , 25 Jul 2014 04 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1399 / < / guid > < / item > < item > < title > Snake Facts < / title > < link > http : / / xkcd . com / 1398 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/snake_facts.png " title = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " alt = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " / & gt ; < / description > < pubDate > Wed , 23 Jul 2014 04 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1398 / < / guid > < / item > < / channel > < / rss >
2014-07-31 00:00:20 +02:00
"""
2018-10-14 21:41:43 +02:00
not_well_formed = """ <?xml version= " 1.0 " encoding= " utf-8 " ?>
< rss version = " 2.0 " >
< channel >
< title > this is missing a close tag
< link > http : / / example . com / < / link >
< description > this dummy feed has no elements < / description >
< language > en < / language >
< / channel >
< / rss >
"""
2014-08-01 00:16:17 +02:00
2014-07-31 00:00:20 +02:00
def constant ( content ) :
2015-08-09 00:23:03 +02:00
if minisix . PY3 :
2014-08-01 00:16:17 +02:00
content = content . encode ( )
2014-07-31 00:00:20 +02:00
def f ( * args , * * kwargs ) :
2015-08-10 17:55:25 +02:00
return minisix . io . BytesIO ( content )
2014-07-31 00:00:20 +02:00
return f
2005-02-02 07:03:09 +01:00
url = ' http://www.advogato.org/rss/articles.xml '
class RSSTestCase ( ChannelPluginTestCase ) :
2006-05-01 19:49:37 +02:00
plugins = ( ' RSS ' , ' Plugin ' )
2005-02-02 07:03:09 +01:00
def testRssAddBadName ( self ) :
self . assertError ( ' rss add " foo bar " %s ' % url )
def testCantAddFeedNamedRss ( self ) :
self . assertError ( ' rss add rss %s ' % url )
def testCantRemoveMethodThatIsntFeed ( self ) :
self . assertError ( ' rss remove rss ' )
2014-07-31 23:56:27 +02:00
def testCantAddDuplicatedFeed ( self ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
try :
self . assertError ( ' rss add xkcddup http://xkcd.com/rss.xml ' )
finally :
self . assertNotError ( ' rss remove xkcd ' )
2015-09-02 09:43:29 +02:00
def testInitialAnnounceNewest ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_new )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2015-09-02 09:43:29 +02:00
try :
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' newestFirst ' ) :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 1 ) :
2015-09-02 09:43:29 +02:00
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
2015-09-02 09:43:29 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
def testInitialAnnounceOldest ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_new )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2015-09-02 09:43:29 +02:00
try :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 1 ) :
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
2015-09-02 09:43:29 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
def testNoInitialAnnounce ( self ) :
2014-08-13 16:42:47 +02:00
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2014-08-13 16:42:47 +02:00
try :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 0 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNoResponse ( ' ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
2014-07-31 00:00:20 +02:00
def testAnnounce ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2014-07-31 00:00:20 +02:00
try :
2014-10-10 16:41:30 +02:00
self . assertError ( ' rss announce add xkcd ' )
2014-07-31 00:00:20 +02:00
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNotError ( ' ' )
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
self . assertNoResponse ( ' ' )
feedparser . _open_resource = constant ( xkcd_new )
self . assertNoResponse ( ' ' )
time . sleep ( 1.1 )
self . assertRegexp ( ' ' , ' Chaos ' )
self . assertRegexp ( ' ' , ' Telescopes ' )
self . assertNoResponse ( ' ' )
2014-07-31 00:00:20 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
2017-10-12 21:21:50 +02:00
def testMaxAnnounces ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2017-10-12 21:21:50 +02:00
try :
self . assertError ( ' rss announce add xkcd ' )
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNotError ( ' ' )
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
with conf . supybot . plugins . RSS . maximumAnnounceHeadlines . context ( 1 ) :
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
self . assertNoResponse ( ' ' )
feedparser . _open_resource = constant ( xkcd_new )
self . assertNoResponse ( ' ' )
time . sleep ( 1.1 )
self . assertRegexp ( ' ' , ' Telescopes ' )
self . assertNoResponse ( ' ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
2015-10-10 20:40:25 +02:00
def testAnnounceAnonymous ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2015-10-10 20:40:25 +02:00
try :
self . assertNotError ( ' rss announce add http://xkcd.com/rss.xml ' )
self . assertNotError ( ' ' )
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
self . assertNoResponse ( ' ' )
feedparser . _open_resource = constant ( xkcd_new )
self . assertNoResponse ( ' ' )
time . sleep ( 1.1 )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
2015-10-10 20:40:25 +02:00
finally :
self . _feedMsg ( ' rss announce remove http://xkcd.com/rss.xml ' )
self . _feedMsg ( ' rss remove http://xkcd.com/rss.xml ' )
feedparser . _open_resource = old_open
2014-07-31 22:53:03 +02:00
def testAnnounceReload ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2014-07-31 22:53:03 +02:00
try :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNotError ( ' ' )
self . assertNotError ( ' reload RSS ' )
self . assertNoResponse ( ' ' )
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
2017-10-21 16:48:44 +02:00
def testReload ( self ) :
2017-01-27 21:00:49 +01:00
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
try :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNotError ( ' ' )
feedparser . _open_resource = constant ( xkcd_new )
self . assertNotError ( ' reload RSS ' )
self . assertRegexp ( ' ' , ' Telescopes ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
2017-12-10 09:38:27 +01:00
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
def testReloadNoDelay ( self ) :
# https://github.com/ProgVal/Limnoria/issues/922
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
time . sleep ( 1.1 )
try :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertRegexp ( ' xkcd ' , ' Snake Facts ' )
self . assertNotError ( ' reload RSS ' )
self . assertRegexp ( ' xkcd ' , ' Snake Facts ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
2017-10-21 16:48:44 +02:00
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
def testReannounce ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
time . sleep ( 1.1 )
2017-01-27 21:00:49 +01:00
try :
self . assertError ( ' rss announce add xkcd ' )
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2017-10-21 16:48:44 +02:00
self . assertRegexp ( ' ' , ' Snake Facts ' )
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 1 ) :
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
self . assertNoResponse ( ' ' )
self . _feedMsg ( ' rss announce remove xkcd ' )
feedparser . _open_resource = constant ( xkcd_new )
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
self . assertNoResponse ( ' ' )
self . assertNotError ( ' rss announce add xkcd ' )
time . sleep ( 1.1 )
2017-10-21 16:48:44 +02:00
self . assertRegexp ( ' ' , ' Chaos ' )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
self . assertNoResponse ( ' ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
feedparser . _open_resource = old_open
2014-07-31 23:50:27 +02:00
def testFeedSpecificFormat ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2014-07-31 23:50:27 +02:00
try :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss add xkcdsec https://xkcd.com/rss.xml ' )
self . assertNotError ( ' config plugins.RSS.feeds.xkcd.format foo ' )
self . assertRegexp ( ' config plugins.RSS.feeds.xkcd.format ' , ' foo ' )
self . assertRegexp ( ' xkcd ' , ' foo ' )
self . assertNotRegexp ( ' xkcdsec ' , ' foo ' )
finally :
self . _feedMsg ( ' rss remove xkcd ' )
self . _feedMsg ( ' rss remove xkcdsec ' )
feedparser . _open_resource = old_open
2015-09-23 11:05:25 +02:00
def testFeedSpecificWaitPeriod ( self ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_old )
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2015-09-23 11:05:25 +02:00
try :
self . assertNotError ( ' rss add xkcd1 http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd1 ' )
self . assertNotError ( ' rss add xkcd2 http://xkcd.com/rss.xml&foo ' )
self . assertNotError ( ' rss announce add xkcd2 ' )
self . assertNotError ( ' ' )
self . assertNotError ( ' ' )
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
with conf . supybot . plugins . RSS . feeds . xkcd1 . waitPeriod . context ( 1 ) :
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
self . assertNoResponse ( ' ' )
feedparser . _open_resource = constant ( xkcd_new )
self . assertNoResponse ( ' ' )
time . sleep ( 1.1 )
self . assertRegexp ( ' ' , ' xkcd1.*Chaos ' )
self . assertRegexp ( ' ' , ' xkcd1.*Telescopes ' )
self . assertNoResponse ( ' ' )
time . sleep ( 1.1 )
self . assertNoResponse ( ' ' )
2015-09-23 11:05:25 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd1 ' )
self . _feedMsg ( ' rss remove xkcd1 ' )
self . _feedMsg ( ' rss announce remove xkcd2 ' )
self . _feedMsg ( ' rss remove xkcd2 ' )
feedparser . _open_resource = old_open
2016-09-08 21:42:31 +02:00
def testDescription ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2016-09-08 21:42:31 +02:00
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
old_open = feedparser . _open_resource
feedparser . _open_resource = constant ( xkcd_new )
try :
self . assertRegexp ( ' rss http://xkcd.com/rss.xml ' ,
2017-01-27 21:00:49 +01:00
' On the other hand, the refractor \' s ' )
2016-09-08 21:42:31 +02:00
finally :
feedparser . _open_resource = old_open
2018-10-14 21:41:43 +02:00
def testBadlyFormedFeedWithNoItems ( self ) :
# This combination will cause the RSS command to show the last parser
# error.
old_open = feedparser . _open_resource
time . sleep ( 1.1 )
feedparser . _open_resource = constant ( not_well_formed )
try :
self . assertRegexp ( ' rss http://example.com/ ' ,
' Parser error ' )
finally :
feedparser . _open_resource = old_open
2005-02-02 07:03:09 +01:00
if network :
def testRssinfo ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotError ( ' rss info %s ' % url )
self . assertNotError ( ' rss add advogato %s ' % url )
self . assertNotError ( ' rss info advogato ' )
self . assertNotError ( ' rss info AdVogATo ' )
self . assertNotError ( ' rss remove advogato ' )
def testRssinfoDoesTimeProperly ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotRegexp ( ' rss info http://slashdot.org/slashdot.rss ' ,
' -1 years ' )
2014-07-31 00:00:20 +02:00
def testAnnounceAdd ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2005-02-22 15:27:59 +01:00
self . assertNotError ( ' rss add advogato %s ' % url )
2009-02-28 06:10:10 +01:00
self . assertNotError ( ' rss announce add advogato ' )
2005-02-22 15:27:59 +01:00
self . assertNotRegexp ( ' rss announce ' , r ' ValueError ' )
2009-02-28 06:10:10 +01:00
self . assertNotError ( ' rss announce remove advogato ' )
2005-05-30 02:52:54 +02:00
self . assertNotError ( ' rss remove advogato ' )
2005-02-22 15:27:59 +01:00
2005-02-02 07:03:09 +01:00
def testRss ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotError ( ' rss %s ' % url )
m = self . assertNotError ( ' rss %s 2 ' % url )
2014-07-31 20:12:37 +02:00
self . failUnless ( m . args [ 1 ] . count ( ' | ' ) == 1 )
2005-02-02 07:03:09 +01:00
def testRssAdd ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotError ( ' rss add advogato %s ' % url )
self . assertNotError ( ' advogato ' )
self . assertNotError ( ' rss advogato ' )
self . assertNotError ( ' rss remove advogato ' )
2006-05-01 19:49:37 +02:00
self . assertNotRegexp ( ' list RSS ' , ' advogato ' )
2005-02-02 07:03:09 +01:00
self . assertError ( ' advogato ' )
self . assertError ( ' rss advogato ' )
2005-07-07 16:13:53 +02:00
def testNonAsciiFeeds ( self ) :
2017-10-21 16:48:44 +02:00
time . sleep ( 1.1 )
2005-07-07 16:13:53 +02:00
self . assertNotError ( ' rss http://www.heise.de/newsticker/heise.rdf ' )
2006-04-06 17:00:53 +02:00
self . assertNotError ( ' rss info http://br-linux.org/main/index.xml ' )
2005-07-07 16:13:53 +02:00
2005-02-02 07:03:09 +01:00
2016-09-08 21:42:31 +02:00
2006-02-11 16:52:51 +01:00
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: