2525import time
2626import traceback
2727import unittest
28- import urllib2
2928import urlparse
3029
3130from lxml import html
5958GIT_DEFAULT_BRANCH = 'main'
6059
6160
62- class HttpNoRedirectHandler (urllib2 .HTTPRedirectHandler ):
63-
64- def redirect_request (self , req , fp , code , msg , headers , newurl ):
65- raise urllib2 .HTTPError (req .get_full_url (), code , msg , headers , fp )
66-
67- urllib2 .install_opener (urllib2 .build_opener (HttpNoRedirectHandler ()))
68-
69-
7061def d (* args ):
7162 """
7263 Return an absolute path where the given arguments are joined and
@@ -252,8 +243,8 @@ def startTracd(cls, **kwargs):
252243 waittime = 0.1
253244 for _ in range (5 ):
254245 try :
255- urllib2 . urlopen (u ())
256- except urllib2 . URLError :
246+ requests . get (u ())
247+ except requests . ConnectionError :
257248 time .sleep (waittime )
258249 waittime *= 2
259250 else :
@@ -312,8 +303,9 @@ def openGitHubHook(n=1, reponame='', payload=None):
312303 if not payload :
313304 payload = TracGitHubTests .makeGitHubHookPayload (n , reponame )
314305 url = u ('github' , reponame ) if reponame else u ('github' )
315- request = urllib2 .Request (url , json .dumps (payload ), HEADERS )
316- return urllib2 .urlopen (request )
306+ response = requests .post (url , json = payload , headers = HEADERS , allow_redirects = False )
307+ response .raise_for_status ()
308+ return response .text
317309
318310
319311class GitHubBrowserTests (TracGitHubTests ):
@@ -322,13 +314,9 @@ def assertRequestRedirects(self, url, redirection, status=302):
322314 A custom assertion to check that requesting the given url (GET) returns a redirection
323315 response (302 by default) pointed to the given redirection URL.
324316 """
325- try :
326- urllib2 .urlopen (url )
327- except urllib2 .HTTPError as exc :
328- self .assertEqual (exc .code , status )
329- self .assertEqual (exc .headers ['Location' ], redirection )
330- else :
331- self .fail ("URL didn't redirect" )
317+ response = requests .get (url , allow_redirects = False )
318+ self .assertEqual (response .status_code , status )
319+ self .assertEqual (response .headers ['Location' ], redirection )
332320
333321 def testLinkToChangeset (self ):
334322 self .makeGitCommit (GIT , 'myfile' , 'for browser tests' )
@@ -375,12 +363,12 @@ def testNonGitHubLinkToPath(self):
375363 self .assertEqual (response .status_code , 200 )
376364
377365 def testBadChangeset (self ):
378- with self . assertRaisesRegexp ( urllib2 . HTTPError , r'^HTTP Error 404: Not Found$' ):
379- urllib2 . urlopen ( u ( 'changeset/1234567890' ) )
366+ response = requests . get ( u ( 'changeset/1234567890' ))
367+ self . assertEqual ( response . status_code , 404 )
380368
381369 def testBadUrl (self ):
382- with self . assertRaisesRegexp ( urllib2 . HTTPError , r'^HTTP Error 404: Not Found$' ):
383- urllib2 . urlopen ( u ( 'changesetnosuchurl' ) )
370+ response = requests . get ( u ( 'changesetnosuchurl' ))
371+ self . assertEqual ( response . status_code , 404 )
384372
385373 def testTimelineFiltering (self ):
386374 self .makeGitBranch (GIT , 'stable/2.0' )
@@ -395,7 +383,7 @@ def testTimelineFiltering(self):
395383 self .makeGitCommit (ALTGIT , 'myfile' , 'timeline 6\n ' , 'msg 6' , 'unstable/2.0' )
396384 self .openGitHubHook (3 )
397385 self .openGitHubHook (3 , 'alt' )
398- html = urllib2 . urlopen (u ('timeline' )).read ()
386+ html = requests . get (u ('timeline' )).text
399387 self .assertTrue ('msg 1' in html )
400388 self .assertTrue ('msg 2' in html )
401389 self .assertTrue ('msg 3' in html )
@@ -439,7 +427,8 @@ def testOauthInvalidState(self):
439427 self .assertEqual (response .status_code , 302 )
440428
441429 response = session .get (
442- u ('github/oauth' ) + '?code=01234567890123456789&state=wrong_state' ,
430+ u ('github/oauth' ),
431+ params = {'code' : '01234567890123456789' , 'state' : 'wrong_state' },
443432 allow_redirects = False )
444433 self .assertEqual (response .status_code , 302 )
445434 self .assertEqual (response .headers ['Location' ], u ())
@@ -456,7 +445,7 @@ def testOauthInvalidStateWithoutSession(self):
456445 # OAuth callback requests without state must still fail.
457446
458447 response = session .get (
459- u ('github/oauth' ) + '? code= 01234567890123456789' ,
448+ u ('github/oauth' ), params = { ' code' : ' 01234567890123456789'} ,
460449 allow_redirects = False )
461450 self .assertEqual (response .status_code , 302 )
462451 self .assertEqual (response .headers ['Location' ], u ())
@@ -934,20 +923,20 @@ def testPreferredEmailCaseInsensitive(self):
934923class GitHubPostCommitHookTests (TracGitHubTests ):
935924
936925 def testDefaultRepository (self ):
937- output = self .openGitHubHook (0 ). read ()
926+ output = self .openGitHubHook (0 )
938927 self .assertEqual (output , "Running hook on (default)\n "
939928 "* Updating clone\n "
940929 "* Synchronizing with clone\n " )
941930
942931 def testAlternativeRepository (self ):
943- output = self .openGitHubHook (0 , 'alt' ). read ()
932+ output = self .openGitHubHook (0 , 'alt' )
944933 self .assertEqual (output , "Running hook on alt\n "
945934 "* Updating clone\n "
946935 "* Synchronizing with clone\n " )
947936
948937 def testCommit (self ):
949938 self .makeGitCommit (GIT , 'foo' , 'foo content\n ' )
950- output = self .openGitHubHook (). read ()
939+ output = self .openGitHubHook ()
951940 self .assertRegexpMatches (output , r"Running hook on \(default\)\n"
952941 r"\* Updating clone\n"
953942 r"\* Synchronizing with clone\n"
@@ -956,7 +945,7 @@ def testCommit(self):
956945 def testMultipleCommits (self ):
957946 self .makeGitCommit (GIT , 'bar' , 'bar content\n ' )
958947 self .makeGitCommit (GIT , 'bar' , 'more bar content\n ' )
959- output = self .openGitHubHook (2 ). read ()
948+ output = self .openGitHubHook (2 )
960949 self .assertRegexpMatches (output , r"Running hook on \(default\)\n"
961950 r"\* Updating clone\n"
962951 r"\* Synchronizing with clone\n"
@@ -967,7 +956,7 @@ def testCommitOnBranch(self):
967956 self .makeGitCommit (ALTGIT , 'stable' , 'stable branch\n ' , branch = 'stable/1.0' )
968957 self .makeGitBranch (ALTGIT , 'unstable/1.0' )
969958 self .makeGitCommit (ALTGIT , 'unstable' , 'unstable branch\n ' , branch = 'unstable/1.0' )
970- output = self .openGitHubHook (2 , 'alt' ). read ()
959+ output = self .openGitHubHook (2 , 'alt' )
971960 self .assertRegexpMatches (output , r"Running hook on alt\n"
972961 r"\* Updating clone\n"
973962 r"\* Synchronizing with clone\n"
@@ -978,9 +967,8 @@ def testUnknownCommit(self):
978967 # Emulate self.openGitHubHook to use a non-existent commit id
979968 random_id = '' .join (random .choice ('0123456789abcdef' ) for _ in range (40 ))
980969 payload = {'commits' : [{'id' : random_id , 'message' : '' , 'distinct' : True }]}
981- request = urllib2 .Request (u ('github' ), json .dumps (payload ), HEADERS )
982- output = urllib2 .urlopen (request ).read ()
983- self .assertRegexpMatches (output , r"Running hook on \(default\)\n"
970+ response = requests .post (u ('github' ), json = payload , headers = HEADERS )
971+ self .assertRegexpMatches (response .text , r"Running hook on \(default\)\n"
984972 r"\* Updating clone\n"
985973 r"\* Synchronizing with clone\n"
986974 r"\* Unknown commit [0-9a-f]{40}\n" )
@@ -1050,34 +1038,29 @@ def testComplexNotification(self):
10501038 def testPing (self ):
10511039 payload = {'zen' : "Readability counts." }
10521040 headers = {'Content-Type' : 'application/json' , 'X-GitHub-Event' : 'ping' }
1053- request = urllib2 .Request (u ('github' ), json .dumps (payload ), headers )
1054- output = urllib2 .urlopen (request ).read ()
1055- self .assertEqual (output , "Readability counts." )
1041+ response = requests .post (u ('github' ), json = payload , headers = headers )
1042+ self .assertEqual (response .text , "Readability counts." )
10561043
10571044 def testUnknownEvent (self ):
10581045 headers = {'Content-Type' : 'application/json' , 'X-GitHub-Event' : 'pull' }
1059- request = urllib2 .Request (u ('github' ), json .dumps ({}), headers )
1060- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 400: Bad Request$' ):
1061- urllib2 .urlopen (request )
1046+ response = requests .post (u ('github' ), json = {}, headers = headers )
1047+ self .assertEqual (response .status_code , 400 )
10621048
10631049 def testBadMethod (self ):
1064- with self . assertRaisesRegexp ( urllib2 . HTTPError , r'^HTTP Error 405: Method Not Allowed$' ):
1065- urllib2 . urlopen ( u ( 'github' ) )
1050+ response = requests . get ( u ( 'github' ))
1051+ self . assertEqual ( response . status_code , 405 )
10661052
10671053 def testBadPayload (self ):
1068- request = urllib2 .Request (u ('github' ), 'foobar' , HEADERS )
1069- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 400: Bad Request$' ):
1070- urllib2 .urlopen (request )
1054+ response = requests .post (u ('github' ), data = 'foobar' , headers = HEADERS )
1055+ self .assertEqual (response .status_code , 400 )
10711056
10721057 def testBadRepository (self ):
1073- request = urllib2 .Request (u ('github/nosuchrepo' ), '{}' , HEADERS )
1074- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 400: Bad Request$' ):
1075- urllib2 .urlopen (request )
1058+ response = requests .post (u ('github/nosuchrepo' ), data = '{}' , headers = HEADERS )
1059+ self .assertEqual (response .status_code , 400 )
10761060
10771061 def testBadUrl (self ):
1078- request = urllib2 .Request (u ('githubnosuchurl' ), '{}' , HEADERS )
1079- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 404: Not Found$' ):
1080- urllib2 .urlopen (request )
1062+ response = requests .post (u ('githubnosuchurl' ), data = '{}' , headers = HEADERS )
1063+ self .assertEqual (response .status_code , 404 )
10811064
10821065
10831066class GitHubPostCommitHookWithSignedWebHookTests (TracGitHubTests ):
@@ -1092,21 +1075,19 @@ def setUpClass(cls):
10921075 def testUnsignedPing (self ):
10931076 payload = {'zen' : "Readability counts." }
10941077 headers = {'Content-Type' : 'application/json' , 'X-GitHub-Event' : 'ping' }
1095- request = urllib2 .Request (u ('github' ), json .dumps (payload ), headers )
1096- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 403: Forbidden$' ):
1097- urllib2 .urlopen (request ).read ()
1078+ response = requests .post (u ('github' ), json = payload , headers = headers )
1079+ self .assertEqual (response .status_code , 403 )
10981080
10991081 def testSignedPing (self ):
11001082 # Correct signature can be generated with OpenSSL:
1101- # $> printf '{"zen": "Echo me"}\n ' | openssl dgst -sha256 -hmac $webhook_secret
1083+ # $> printf '{"zen": "Echo me"}' | openssl dgst -sha256 -hmac $webhook_secret
11021084 payload = {'zen' : "Echo me" }
1103- signature = "sha256=cacc93c2df1b21313e16d8690fc21e56229b6a9525e7016db38bdf9bad708fed "
1085+ signature = "sha256=68aef42937ffd24dd0b98d00d84b1551784c00932ab4ae22055a916264e194df "
11041086 headers = {'Content-Type' : 'application/json' ,
11051087 'X-GitHub-Event' : 'ping' ,
11061088 'X-Hub-Signature' : signature }
1107- request = urllib2 .Request (u ('github' ), json .dumps (payload ) + '\n ' , headers )
1108- output = urllib2 .urlopen (request ).read ()
1109- self .assertEqual (output , "Echo me" )
1089+ response = requests .post (u ('github' ), json = payload , headers = headers )
1090+ self .assertEqual (response .text , "Echo me" )
11101091
11111092
11121093class GitHubPostCommitHookWithUpdateHookTests (TracGitHubTests ):
@@ -1145,7 +1126,7 @@ def tearDownClass(cls):
11451126 def testUpdateHook (self ):
11461127 self .makeGitCommit (GIT , 'foo' , 'foo content\n ' )
11471128 payload = self .makeGitHubHookPayload ()
1148- output = self .openGitHubHook (payload = payload ). read ()
1129+ output = self .openGitHubHook (payload = payload )
11491130 self .assertRegexpMatches (output , r"Running hook on \(default\)\n"
11501131 r"\* Updating clone\n"
11511132 r"\* Synchronizing with clone\n"
@@ -1157,15 +1138,15 @@ def testUpdateHookExecFailure(self):
11571138 os .chmod (d (UPDATEHOOK ), 0o644 )
11581139 self .makeGitCommit (GIT , 'bar' , 'bar content\n ' )
11591140 payload = self .makeGitHubHookPayload ()
1160- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 500 : Internal Server Error$ ' ):
1161- output = self .openGitHubHook (payload = payload ). read ()
1141+ with self .assertRaisesRegexp (requests .HTTPError , r'^500 Server Error : Internal Server Error' ):
1142+ output = self .openGitHubHook (payload = payload )
11621143
11631144 def testUpdateHookFailure (self ):
11641145 self .createFailingUpdateHook ()
11651146 self .makeGitCommit (GIT , 'baz' , 'baz content\n ' )
11661147 payload = self .makeGitHubHookPayload ()
1167- with self .assertRaisesRegexp (urllib2 .HTTPError , r'^HTTP Error 500 : Internal Server Error$ ' ):
1168- output = self .openGitHubHook (payload = payload ). read ()
1148+ with self .assertRaisesRegexp (requests .HTTPError , r'^500 Server Error : Internal Server Error' ):
1149+ output = self .openGitHubHook (payload = payload )
11691150
11701151
11711152class GitHubBrowserWithCacheTests (GitHubBrowserTests ):
0 commit comments