python3: align the order of parameters for urlencode()

In Python 3.3, hash randomization is enabled by default. It causes the
iteration order of dicts and sets to be unpredictable and differ across
Python runs.

In the test case, the fixed expecting string will not match the test
result, it is relying on the dict order.

This change transforms the input dict to a sequence of two-element list,
with fixed order, and update the related expecitng string in test case.

Change-Id: I60d7bb3c4f940b76460ad5c417a1807915e0418e
Signed-off-by: Chuck Short <chuck.short@canonical.com>
This commit is contained in:
Chuck Short
2013-10-13 09:47:08 -04:00
parent 0c2839414f
commit fcf8e1d0b9
2 changed files with 14 additions and 2 deletions

View File

@@ -108,7 +108,13 @@ class SnapshotManager(base.ManagerWithFind):
if val:
qparams[opt] = val
query_string = "?%s" % urlencode(qparams) if qparams else ""
# Transform the dict to a sequence of two-element tuples in fixed
# order, then the encoded string will be consistent in Python 2&3.
if qparams:
new_qparams = sorted(qparams.items(), key=lambda x: x[0])
query_string = "?%s" % urlencode(new_qparams)
else:
query_string = ""
detail = ""
if detailed:

View File

@@ -95,7 +95,13 @@ class SnapshotManager(base.ManagerWithFind):
if val:
qparams[opt] = val
query_string = "?%s" % urlencode(qparams) if qparams else ""
# Transform the dict to a sequence of two-element tuples in fixed
# order, then the encoded string will be consistent in Python 2&3.
if qparams:
new_qparams = sorted(qparams.items(), key=lambda x: x[0])
query_string = "?%s" % urlencode(new_qparams)
else:
query_string = ""
detail = ""
if detailed: