From fa9251a1ee9bfc27664d88c5fe6bbb23e8fa1e51 Mon Sep 17 00:00:00 2001
From: Alistair Coles <alistair.coles@hpe.com>
Date: Mon, 1 Feb 2016 10:07:55 +0000
Subject: [PATCH] Fix intermittent fail of test_delete_bulk_account

The test asserts calls made in specific order,
but they are made from threads so may be in
different order.

Change-Id: I857ad3b909c3b635927fb1a39682d66d20c6fd59
---
 tests/unit/test_shell.py | 41 ++++++++++++++++++++++++----------------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/tests/unit/test_shell.py b/tests/unit/test_shell.py
index 01288c1f..5313d41d 100644
--- a/tests/unit/test_shell.py
+++ b/tests/unit/test_shell.py
@@ -772,22 +772,31 @@ class TestShell(testtools.TestCase):
             b'"Errors": [], "Number Deleted": 1, "Response Body": ""}')
         swiftclient.shell.main(argv)
         self.assertEqual(
-            connection.return_value.post_account.mock_calls, [
-                mock.call(query_string='bulk-delete',
-                          data=b'/container/object\n/container/obj%C3%A9ct2\n',
-                          headers={'Content-Type': 'text/plain',
-                                   'Accept': 'application/json'},
-                          response_dict={}),
-                mock.call(query_string='bulk-delete',
-                          data=b'/container/object3\n',
-                          headers={'Content-Type': 'text/plain',
-                                   'Accept': 'application/json'},
-                          response_dict={}),
-                mock.call(query_string='bulk-delete',
-                          data=b'/container2/object\n',
-                          headers={'Content-Type': 'text/plain',
-                                   'Accept': 'application/json'},
-                          response_dict={})])
+            3, len(connection.return_value.post_account.mock_calls),
+            'Expected 3 calls but found\n%r'
+            % connection.return_value.post_account.mock_calls)
+        # POSTs for same container are made in parallel so expect any order
+        for expected in [
+            mock.call(query_string='bulk-delete',
+                      data=b'/container/object\n/container/obj%C3%A9ct2\n',
+                      headers={'Content-Type': 'text/plain',
+                               'Accept': 'application/json'},
+                      response_dict={}),
+            mock.call(query_string='bulk-delete',
+                      data=b'/container/object3\n',
+                      headers={'Content-Type': 'text/plain',
+                               'Accept': 'application/json'},
+                      response_dict={})]:
+            self.assertIn(expected,
+                          connection.return_value.post_account.mock_calls[:2])
+        # POSTs for different containers are made sequentially so expect order
+        self.assertEqual(
+            mock.call(query_string='bulk-delete',
+                      data=b'/container2/object\n',
+                      headers={'Content-Type': 'text/plain',
+                               'Accept': 'application/json'},
+                      response_dict={}),
+            connection.return_value.post_account.mock_calls[2])
         self.assertEqual(
             connection.return_value.delete_container.mock_calls, [
                 mock.call('container', response_dict={}),