@@ -646,26 +646,23 @@ def test_group_without_user_agent(self):
646646)
647647class BaseLocalNetworkTestCase :
648648
649- def setUp (self ):
649+ @classmethod
650+ def setUpClass (cls ):
650651 # clear _opener global variable
651- self . addCleanup (urllib .request .urlcleanup )
652+ cls . addClassCleanup (urllib .request .urlcleanup )
652653
653- self .server = HTTPServer ((socket_helper .HOST , 0 ), self .RobotHandler )
654+ cls .server = HTTPServer ((socket_helper .HOST , 0 ), cls .RobotHandler )
655+ cls .addClassCleanup (cls .server .server_close )
654656
655- self . t = threading .Thread (
657+ t = threading .Thread (
656658 name = 'HTTPServer serving' ,
657- target = self .server .serve_forever ,
659+ target = cls .server .serve_forever ,
658660 # Short poll interval to make the test finish quickly.
659661 # Time between requests is short enough that we won't wake
660662 # up spuriously too many times.
661663 kwargs = {'poll_interval' :0.01 })
662- self .t .daemon = True # In case this function raises.
663- self .t .start ()
664-
665- def tearDown (self ):
666- self .server .shutdown ()
667- self .t .join ()
668- self .server .server_close ()
664+ cls .enterClassContext (threading_helper .start_threads ([t ]))
665+ cls .addClassCleanup (cls .server .shutdown )
669666
670667
671668SAMPLE_ROBOTS_TXT = b'''\
@@ -687,7 +684,6 @@ def do_GET(self):
687684 def log_message (self , format , * args ):
688685 pass
689686
690- @threading_helper .reap_threads
691687 def testRead (self ):
692688 # Test that reading a weird robots.txt doesn't fail.
693689 addr = self .server .server_address
@@ -702,31 +698,79 @@ def testRead(self):
702698 self .assertTrue (parser .can_fetch (agent , url + '/utf8/' ))
703699 self .assertFalse (parser .can_fetch (agent , url + '/utf8/\U0001f40d ' ))
704700 self .assertFalse (parser .can_fetch (agent , url + '/utf8/%F0%9F%90%8D' ))
705- self .assertFalse (parser .can_fetch (agent , url + '/utf8/\U0001f40d ' ))
706701 self .assertTrue (parser .can_fetch (agent , url + '/non-utf8/' ))
707702 self .assertFalse (parser .can_fetch (agent , url + '/non-utf8/%F0' ))
708703 self .assertFalse (parser .can_fetch (agent , url + '/non-utf8/\U0001f40d ' ))
709704 self .assertFalse (parser .can_fetch (agent , url + '/%2F[spam]/path' ))
710705
711706
712- class PasswordProtectedSiteTestCase (BaseLocalNetworkTestCase , unittest .TestCase ):
707+ class HttpErrorsTestCase (BaseLocalNetworkTestCase , unittest .TestCase ):
713708 class RobotHandler (BaseHTTPRequestHandler ):
714709
715710 def do_GET (self ):
716- self .send_error (403 , "Forbidden access" )
711+ self .send_error (self . server . return_code )
717712
718713 def log_message (self , format , * args ):
719714 pass
720715
721- @threading_helper .reap_threads
722- def testPasswordProtectedSite (self ):
716+ def setUp (self ):
717+ # Make sure that a valid code is set in the test.
718+ self .server .return_code = None
719+
720+ def testUnauthorized (self ):
721+ self .server .return_code = 401
722+ addr = self .server .server_address
723+ url = f'http://{ socket_helper .HOST } :{ addr [1 ]} '
724+ robots_url = url + "/robots.txt"
725+ parser = urllib .robotparser .RobotFileParser ()
726+ parser .set_url (url )
727+ parser .read ()
728+ self .assertFalse (parser .can_fetch ("*" , robots_url ))
729+ self .assertFalse (parser .can_fetch ("*" , url + '/some/file.html' ))
730+
731+ def testForbidden (self ):
732+ self .server .return_code = 403
733+ addr = self .server .server_address
734+ url = f'http://{ socket_helper .HOST } :{ addr [1 ]} '
735+ robots_url = url + "/robots.txt"
736+ parser = urllib .robotparser .RobotFileParser ()
737+ parser .set_url (url )
738+ parser .read ()
739+ self .assertFalse (parser .can_fetch ("*" , robots_url ))
740+ self .assertFalse (parser .can_fetch ("*" , url + '/some/file.html' ))
741+
742+ def testNotFound (self ):
743+ self .server .return_code = 404
723744 addr = self .server .server_address
724- url = 'http://' + socket_helper .HOST + ':' + str (addr [1 ])
745+ url = f'http://{ socket_helper .HOST } :{ addr [1 ]} '
746+ robots_url = url + "/robots.txt"
747+ parser = urllib .robotparser .RobotFileParser ()
748+ parser .set_url (url )
749+ parser .read ()
750+ self .assertTrue (parser .can_fetch ("*" , robots_url ))
751+ self .assertTrue (parser .can_fetch ("*" , url + '/path/file.html' ))
752+
753+ def testTeapot (self ):
754+ self .server .return_code = 418
755+ addr = self .server .server_address
756+ url = f'http://{ socket_helper .HOST } :{ addr [1 ]} '
757+ robots_url = url + "/robots.txt"
758+ parser = urllib .robotparser .RobotFileParser ()
759+ parser .set_url (url )
760+ parser .read ()
761+ self .assertTrue (parser .can_fetch ("*" , robots_url ))
762+ self .assertTrue (parser .can_fetch ("*" , url + '/pot-1?milk-type=Cream' ))
763+
764+ def testServiceUnavailable (self ):
765+ self .server .return_code = 503
766+ addr = self .server .server_address
767+ url = f'http://{ socket_helper .HOST } :{ addr [1 ]} '
725768 robots_url = url + "/robots.txt"
726769 parser = urllib .robotparser .RobotFileParser ()
727770 parser .set_url (url )
728771 parser .read ()
729772 self .assertFalse (parser .can_fetch ("*" , robots_url ))
773+ self .assertFalse (parser .can_fetch ("*" , url + '/path/file.html' ))
730774
731775
732776@support .requires_working_socket ()
@@ -738,6 +782,7 @@ class NetworkTestCase(unittest.TestCase):
738782 @classmethod
739783 def setUpClass (cls ):
740784 support .requires ('network' )
785+ cls .addClassCleanup (urllib .request .urlcleanup )
741786 with socket_helper .transient_internet (cls .base_url ):
742787 cls .parser = urllib .robotparser .RobotFileParser (cls .robots_txt )
743788 cls .parser .read ()
0 commit comments