Use requests instead of urllib.request in tests

For the web tests the remote calls using urllib have bits of
boilerplate. Extract it into a method so that we can get the host/port
stuff done in just one place.

Change-Id: Ief2df0e0927b599dbf6e81966e66c2835faa7e74
This commit is contained in:
Monty Taylor
2018-03-27 13:47:09 -05:00
parent 7a6761e78c
commit ffe36ad95b
3 changed files with 47 additions and 75 deletions
+9 -12
View File
@@ -29,6 +29,7 @@ import os
import queue
import random
import re
import requests
import select
import shutil
import socket
@@ -40,7 +41,6 @@ import threading
import traceback
import time
import uuid
import urllib
import socketserver
import http.server
@@ -1030,11 +1030,10 @@ class FakeGithubConnection(githubconnection.GithubConnection):
headers = {'x-github-event': name, 'x-hub-signature': signature}
if use_zuulweb:
req = urllib.request.Request(
return requests.post(
'http://127.0.0.1:%s/connection/%s/payload'
% (self.zuul_web_port, self.connection_name),
data=payload, headers=headers)
return urllib.request.urlopen(req)
json=data, headers=headers)
else:
job = self.rpcclient.submitJob(
'github:%s:payload' % self.connection_name,
@@ -1834,17 +1833,15 @@ class WebProxyFixture(fixtures.Fixture):
path = self.path
for (pattern, replace) in rules:
path = re.sub(pattern, replace, path)
try:
remote = urllib.request.urlopen(path)
except urllib.error.HTTPError as e:
self.send_response(e.code)
resp = requests.get(path)
self.send_response(resp.status_code)
if resp.status_code >= 300:
self.end_headers()
return
self.send_response(int(remote.getcode()))
for header in remote.info():
self.send_header(header, remote.info()[header])
for key, val in resp.headers.items():
self.send_header(key, val)
self.end_headers()
self.wfile.write(remote.read())
self.wfile.write(resp.content)
self.httpd = socketserver.ThreadingTCPServer(('', 0), Proxy)
self.port = self.httpd.socket.getsockname()[1]
+2 -2
View File
@@ -740,8 +740,8 @@ class TestGithubDriver(ZuulTestCase):
def test_ping_event(self):
# Test valid ping
pevent = {'repository': {'full_name': 'org/project'}}
req = self.fake_github.emitEvent(('ping', pevent))
self.assertEqual(req.status, 200, "Ping event didn't succeed")
resp = self.fake_github.emitEvent(('ping', pevent))
self.assertEqual(resp.status_code, 200, "Ping event didn't succeed")
# Test invalid ping
pevent = {'repository': {'full_name': 'unknown-project'}}
+36 -61
View File
@@ -18,11 +18,12 @@
import asyncio
import threading
import os
import json
import urllib
import urllib.parse
import time
import socket
import requests
import zuul.web
from tests.base import ZuulTestCase, FIXTURE_DIR
@@ -86,6 +87,12 @@ class BaseTestWeb(ZuulTestCase):
break
except ConnectionRefusedError:
pass
self.base_url = "http://{host}:{port}".format(
host=self.host, port=self.port)
def get_url(self, url, *args, **kwargs):
return requests.get(
urllib.parse.urljoin(self.base_url, url), *args, **kwargs)
def tearDown(self):
self.executor_server.hold_jobs_in_build = False
@@ -107,24 +114,20 @@ class TestWeb(BaseTestWeb):
self.executor_server.release('project-merge')
self.waitUntilSettled()
req = urllib.request.Request(
"http://localhost:%s/tenant-one/status" % self.port)
f = urllib.request.urlopen(req)
headers = f.info()
self.assertIn('Content-Length', headers)
self.assertIn('Content-Type', headers)
resp = self.get_url("tenant-one/status")
self.assertIn('Content-Length', resp.headers)
self.assertIn('Content-Type', resp.headers)
self.assertEqual(
'application/json; charset=utf-8', headers['Content-Type'])
self.assertIn('Access-Control-Allow-Origin', headers)
self.assertIn('Cache-Control', headers)
self.assertIn('Last-Modified', headers)
data = f.read().decode('utf8')
'application/json; charset=utf-8', resp.headers['Content-Type'])
self.assertIn('Access-Control-Allow-Origin', resp.headers)
self.assertIn('Cache-Control', resp.headers)
self.assertIn('Last-Modified', resp.headers)
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
self.waitUntilSettled()
data = json.loads(data)
data = resp.json()
status_jobs = []
for p in data['pipelines']:
for q in p['change_queues']:
@@ -208,19 +211,15 @@ class TestWeb(BaseTestWeb):
self.executor_server.release('project-merge')
self.waitUntilSettled()
req = urllib.request.Request(
"http://127.0.0.1:%s/tenants" % self.port)
f = urllib.request.urlopen(req)
headers = f.info()
self.assertIn('Content-Length', headers)
self.assertIn('Content-Type', headers)
resp = self.get_url("tenants")
self.assertIn('Content-Length', resp.headers)
self.assertIn('Content-Type', resp.headers)
self.assertEqual(
'application/json; charset=utf-8', headers['Content-Type'])
# self.assertIn('Access-Control-Allow-Origin', headers)
# self.assertIn('Cache-Control', headers)
# self.assertIn('Last-Modified', headers)
data = f.read().decode('utf8')
data = json.loads(data)
'application/json; charset=utf-8', resp.headers['Content-Type'])
# self.assertIn('Access-Control-Allow-Origin', resp.headers)
# self.assertIn('Cache-Control', resp.headers)
# self.assertIn('Last-Modified', resp.headers)
data = resp.json()
self.assertEqual('tenant-one', data[0]['name'])
self.assertEqual(3, data[0]['projects'])
@@ -231,36 +230,24 @@ class TestWeb(BaseTestWeb):
self.executor_server.release()
self.waitUntilSettled()
req = urllib.request.Request(
"http://127.0.0.1:%s/tenants" % self.port)
f = urllib.request.urlopen(req)
data = f.read().decode('utf8')
data = json.loads(data)
data = self.get_url("tenants").json()
self.assertEqual('tenant-one', data[0]['name'])
self.assertEqual(3, data[0]['projects'])
self.assertEqual(0, data[0]['queue'])
def test_web_bad_url(self):
# do we 404 correctly
req = urllib.request.Request(
"http://localhost:%s/status/foo" % self.port)
self.assertRaises(urllib.error.HTTPError, urllib.request.urlopen, req)
resp = self.get_url("status/foo")
self.assertEqual(404, resp.status_code)
def test_web_find_change(self):
# can we filter by change id
req = urllib.request.Request(
"http://localhost:%s/tenant-one/status/change/1,1" % self.port)
f = urllib.request.urlopen(req)
data = json.loads(f.read().decode('utf8'))
data = self.get_url("tenant-one/status/change/1,1").json()
self.assertEqual(1, len(data), data)
self.assertEqual("org/project", data[0]['project'])
req = urllib.request.Request(
"http://localhost:%s/tenant-one/status/change/2,1" % self.port)
f = urllib.request.urlopen(req)
data = json.loads(f.read().decode('utf8'))
data = self.get_url("tenant-one/status/change/2,1").json()
self.assertEqual(1, len(data), data)
self.assertEqual("org/project1", data[0]['project'], data)
@@ -269,18 +256,12 @@ class TestWeb(BaseTestWeb):
with open(os.path.join(FIXTURE_DIR, 'public.pem'), 'rb') as f:
public_pem = f.read()
req = urllib.request.Request(
"http://localhost:%s/tenant-one/org/project.pub" %
self.port)
f = urllib.request.urlopen(req)
self.assertEqual(f.read(), public_pem)
resp = self.get_url("tenant-one/org/project.pub")
self.assertEqual(resp.content, public_pem)
def test_web_404_on_unknown_tenant(self):
req = urllib.request.Request(
"http://localhost:{}/non-tenant/status".format(self.port))
e = self.assertRaises(
urllib.error.HTTPError, urllib.request.urlopen, req)
self.assertEqual(404, e.code)
resp = self.get_url("non-tenant/status")
self.assertEqual(404, resp.status_code)
class TestInfo(BaseTestWeb):
@@ -294,10 +275,7 @@ class TestInfo(BaseTestWeb):
self.stats_prefix = statsd_config.get('prefix')
def test_info(self):
req = urllib.request.Request(
"http://localhost:%s/info" % self.port)
f = urllib.request.urlopen(req)
info = json.loads(f.read().decode('utf8'))
info = self.get_url("info").json()
self.assertEqual(
info, {
"info": {
@@ -315,10 +293,7 @@ class TestInfo(BaseTestWeb):
})
def test_tenant_info(self):
req = urllib.request.Request(
"http://localhost:%s/tenant-one/info" % self.port)
f = urllib.request.urlopen(req)
info = json.loads(f.read().decode('utf8'))
info = self.get_url("tenant-one/info").json()
self.assertEqual(
info, {
"info": {