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
import requests
import six
import six.moves.urllib.parse as urlparse
from neutronclient.common import constants
from neutronclient.common import exceptions
@@ -85,7 +86,13 @@ class MyUrlComparator(mox.Comparator):
self.client = client
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):
if self.client and self.client.format != FORMAT:
@@ -408,7 +415,8 @@ class CLITestV20Base(base.BaseTestCase):
headers=mox.ContainsKeyValue(
'X-Auth-Token', TOKEN)).AndReturn((MyResp(200), resstr1))
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,
headers=mox.ContainsKeyValue(
'X-Auth-Token', TOKEN)).AndReturn((MyResp(200), resstr2))
@@ -571,7 +579,8 @@ class ClientV2TestJson(CLITestV20Base):
self.client.httpclient.auth_token = 'token'
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='',
headers=mox.ContainsKeyValue('X-Auth-Token', 'token')
).AndReturn((MyResp(400, reason='An error'), ''))

View File

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

View File

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

View File

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