Fix unit tests to succeed on any PYTHONHASHSEED

Many tests rely on order of parameters in URL query, but
queries are constructed from dicts and order of parameters
is non-deterministic. The issue doesn't occur if PYTHONHASHSEED
stays constant, but breaks if random. The fix is needed for
tox>1.7 and Py3.

Closes-Bug: 1348818

Change-Id: I01145df689e90ccd6100fa82092ba3ed222af8fc
This commit is contained in:
Ilya Shakhat
2014-07-28 16:07:32 +04:00
parent 7524234833
commit ef39ff0002
6 changed files with 69 additions and 23 deletions

View File

@@ -23,6 +23,7 @@ from mox3 import mox
from oslotest import base from oslotest import base
import requests import requests
import six import six
import six.moves.urllib.parse as urlparse
from neutronclient.common import constants from neutronclient.common import constants
from neutronclient.common import exceptions from neutronclient.common import exceptions
@@ -85,7 +86,13 @@ class MyUrlComparator(mox.Comparator):
self.client = client self.client = client
def equals(self, rhs): def equals(self, rhs):
return str(self) == rhs lhsp = urlparse.urlparse(self.lhs)
rhsp = urlparse.urlparse(rhs)
return (lhsp.scheme == rhsp.scheme and
lhsp.netloc == rhsp.netloc and
lhsp.path == rhsp.path and
urlparse.parse_qs(lhsp.query) == urlparse.parse_qs(rhsp.query))
def __str__(self): def __str__(self):
if self.client and self.client.format != FORMAT: if self.client and self.client.format != FORMAT:
@@ -408,7 +415,8 @@ class CLITestV20Base(base.BaseTestCase):
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
'X-Auth-Token', TOKEN)).AndReturn((MyResp(200), resstr1)) 'X-Auth-Token', TOKEN)).AndReturn((MyResp(200), resstr1))
self.client.httpclient.request( self.client.httpclient.request(
end_url(path, fake_query, format=self.format), 'GET', MyUrlComparator(end_url(path, fake_query, format=self.format),
self.client), 'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
'X-Auth-Token', TOKEN)).AndReturn((MyResp(200), resstr2)) 'X-Auth-Token', TOKEN)).AndReturn((MyResp(200), resstr2))
@@ -571,7 +579,8 @@ class ClientV2TestJson(CLITestV20Base):
self.client.httpclient.auth_token = 'token' self.client.httpclient.auth_token = 'token'
self.client.httpclient.request( self.client.httpclient.request(
end_url('/test', query=expect_query, format=self.format), MyUrlComparator(end_url(
'/test', query=expect_query, format=self.format), self.client),
'PUT', body='', 'PUT', body='',
headers=mox.ContainsKeyValue('X-Auth-Token', 'token') headers=mox.ContainsKeyValue('X-Auth-Token', 'token')
).AndReturn((MyResp(400, reason='An error'), '')) ).AndReturn((MyResp(400, reason='An error'), ''))

View File

@@ -36,7 +36,7 @@ class CLITestV20Agent(test_cli20.CLITestV20Base):
self.assertEqual(1, len(returned_agents)) self.assertEqual(1, len(returned_agents))
ag = returned_agents[0] ag = returned_agents[0]
self.assertEqual(3, len(ag)) self.assertEqual(3, len(ag))
self.assertEqual("alive", ag.keys()[2]) self.assertIn("alive", ag.keys())
def test_list_agents_field(self): def test_list_agents_field(self):
contents = {'agents': [{'alive': True}]} contents = {'agents': [{'alive': True}]}

View File

@@ -118,7 +118,9 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
args = ['-c', 'id', '--', '--id', 'myfakeid'] args = ['-c', 'id', '--', '--id', 'myfakeid']
path = getattr(self.client, resources + "_path") path = getattr(self.client, resources + "_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, query), 'GET', test_cli20.MyUrlComparator(test_cli20.end_url(path, query),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
'X-Auth-Token', 'X-Auth-Token',
@@ -202,7 +204,9 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
resp = (test_cli20.MyResp(200), resstr) resp = (test_cli20.MyResp(200), resstr)
path = getattr(self.client, resources + '_path') path = getattr(self.client, resources + '_path')
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, query), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, query), self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
'X-Auth-Token', test_cli20.TOKEN)).AndReturn(resp) 'X-Auth-Token', test_cli20.TOKEN)).AndReturn(resp)
@@ -312,7 +316,9 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
args = ['-c', 'id', '--', '--id', 'myfakeid'] args = ['-c', 'id', '--', '--id', 'myfakeid']
path = getattr(self.client, resources + "_path") path = getattr(self.client, resources + "_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, query), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, query), self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
'X-Auth-Token', 'X-Auth-Token',
@@ -377,7 +383,9 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
path = getattr(self.client, resources + "_path") path = getattr(self.client, resources + "_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, query), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, query), self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))
@@ -496,7 +504,8 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
def mox_calls(path, data): def mox_calls(path, data):
filters, response = self._build_test_data(data) filters, response = self._build_test_data(data)
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, 'fields=id&fields=cidr' + filters), test_cli20.MyUrlComparator(test_cli20.end_url(
path, 'fields=id&fields=cidr' + filters), self.client),
'GET', 'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
@@ -518,8 +527,10 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
filters, response = self._build_test_data(data) filters, response = self._build_test_data(data)
self.client._check_uri_length(mox.IgnoreArg()).AndReturn(None) self.client._check_uri_length(mox.IgnoreArg()).AndReturn(None)
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, test_cli20.MyUrlComparator(
'fields=id&fields=cidr%s' % filters), test_cli20.end_url(
path, 'fields=id&fields=cidr%s' % filters),
self.client),
'GET', 'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(

View File

@@ -274,7 +274,10 @@ class CLITestV20PortJSON(test_cli20.CLITestV20Base):
query = query and query + '&device_id=%s' or 'device_id=%s' query = query and query + '&device_id=%s' or 'device_id=%s'
path = getattr(self.client, resources + "_path") path = getattr(self.client, resources + "_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, query % myid), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, query % myid),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))

View File

@@ -235,7 +235,10 @@ class CLITestV20SecurityGroupsJSON(test_cli20.CLITestV20Base):
resp = (test_cli20.MyResp(200), resstr) resp = (test_cli20.MyResp(200), resstr)
path = getattr(self.client, resources + '_path') path = getattr(self.client, resources + '_path')
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, query), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, query),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue( headers=mox.ContainsKeyValue(
'X-Auth-Token', test_cli20.TOKEN)).AndReturn(resp) 'X-Auth-Token', test_cli20.TOKEN)).AndReturn(resp)

View File

@@ -44,7 +44,10 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "networks_path") path = getattr(self.client, "networks_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&id=" + _id), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, "fields=id&id=" + _id),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))
@@ -61,12 +64,18 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "networks_path") path = getattr(self.client, "networks_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&id=" + _id), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, "fields=id&id=" + _id),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr1)) ).AndReturn((test_cli20.MyResp(200), resstr1))
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&name=" + _id), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, "fields=id&name=" + _id),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))
@@ -83,7 +92,10 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "networks_path") path = getattr(self.client, "networks_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&name=" + name), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, "fields=id&name=" + name),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))
@@ -100,7 +112,10 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "networks_path") path = getattr(self.client, "networks_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&name=" + name), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, "fields=id&name=" + name),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))
@@ -118,7 +133,10 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "networks_path") path = getattr(self.client, "networks_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&name=" + name), 'GET', test_cli20.MyUrlComparator(
test_cli20.end_url(path, "fields=id&name=" + name),
self.client),
'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
).AndReturn((test_cli20.MyResp(200), resstr)) ).AndReturn((test_cli20.MyResp(200), resstr))
@@ -140,8 +158,9 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "security_groups_path") path = getattr(self.client, "security_groups_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&name=%s&tenant_id=%s" % test_cli20.MyUrlComparator(
(name, project)), test_cli20.end_url(path, "fields=id&name=%s&tenant_id=%s" %
(name, project)), self.client),
'GET', 'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)
@@ -162,8 +181,9 @@ class CLITestNameorID(testtools.TestCase):
self.mox.StubOutWithMock(self.client.httpclient, "request") self.mox.StubOutWithMock(self.client.httpclient, "request")
path = getattr(self.client, "security_groups_path") path = getattr(self.client, "security_groups_path")
self.client.httpclient.request( self.client.httpclient.request(
test_cli20.end_url(path, "fields=id&name=%s&tenant_id=%s" % test_cli20.MyUrlComparator(
(name, project)), test_cli20.end_url(path, "fields=id&name=%s&tenant_id=%s" %
(name, project)), self.client),
'GET', 'GET',
body=None, body=None,
headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN) headers=mox.ContainsKeyValue('X-Auth-Token', test_cli20.TOKEN)