Add tests for swift container listing filters

Add limit, marker and end_marker listing tests
when listing account containers.

Change-Id: I44ee474d699b83f7b1a643a91a2534839ebddbaa
diff --git a/tempest/api/object_storage/test_account_services.py b/tempest/api/object_storage/test_account_services.py
index 52b37c1..b443933 100644
--- a/tempest/api/object_storage/test_account_services.py
+++ b/tempest/api/object_storage/test_account_services.py
@@ -15,6 +15,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import random
+
 from tempest.api.object_storage import base
 from tempest.common.utils.data_utils import rand_name
 from tempest import exceptions
@@ -26,12 +28,17 @@
     @classmethod
     def setUpClass(cls):
         super(AccountTest, cls).setUpClass()
-        cls.container_name = rand_name(name='TestContainer')
-        cls.container_client.create_container(cls.container_name)
+        cls.containers = []
+        for i in xrange(ord('a'), ord('f') + 1):
+            name = rand_name(name='%s-' % chr(i))
+            cls.container_client.create_container(name)
+            cls.containers.append(name)
+        cls.containers_count = len(cls.containers)
 
     @classmethod
     def tearDownClass(cls):
-        cls.container_client.delete_container(cls.container_name)
+        cls.delete_containers(cls.containers)
+        super(AccountTest, cls).tearDownClass()
 
     @attr(type='smoke')
     def test_list_containers(self):
@@ -42,7 +49,59 @@
 
         self.assertIsNotNone(container_list)
         container_names = [c['name'] for c in container_list]
-        self.assertIn(self.container_name, container_names)
+        for container_name in self.containers:
+            self.assertIn(container_name, container_names)
+
+    @attr(type='smoke')
+    def test_list_containers_with_limit(self):
+        # list containers one of them, half of them then all of them
+        for limit in (1, self.containers_count / 2, self.containers_count):
+            params = {'limit': limit}
+            resp, container_list = \
+                self.account_client.list_account_containers(params=params)
+            self.assertEquals(len(container_list), limit)
+
+    @attr(type='smoke')
+    def test_list_containers_with_marker(self):
+        # list containers using marker param
+        # first expect to get 0 container as we specified last
+        # the container as marker
+        # second expect to get the bottom half of the containers
+        params = {'marker': self.containers[-1]}
+        resp, container_list = \
+            self.account_client.list_account_containers(params=params)
+        self.assertEquals(len(container_list), 0)
+        params = {'marker': self.containers[self.containers_count / 2]}
+        resp, container_list = \
+            self.account_client.list_account_containers(params=params)
+        self.assertEquals(len(container_list), self.containers_count / 2 - 1)
+
+    @attr(type='smoke')
+    def test_list_containers_with_end_marker(self):
+        # list containers using end_marker param
+        # first expect to get 0 container as we specified first container as
+        # end_marker
+        # second expect to get the top half of the containers
+        params = {'end_marker': self.containers[0]}
+        resp, container_list = \
+            self.account_client.list_account_containers(params=params)
+        self.assertEquals(len(container_list), 0)
+        params = {'end_marker': self.containers[self.containers_count / 2]}
+        resp, container_list = \
+            self.account_client.list_account_containers(params=params)
+        self.assertEquals(len(container_list), self.containers_count / 2)
+
+    @attr(type='smoke')
+    def test_list_containers_with_limit_and_marker(self):
+        # list containers combining marker and limit param
+        # result are always limitated by the limit whatever the marker
+        for marker in random.choice(self.containers):
+            limit = random.randint(0, self.containers_count - 1)
+            params = {'marker': marker,
+                      'limit': limit}
+            resp, container_list = \
+                self.account_client.list_account_containers(params=params)
+            self.assertLessEqual(len(container_list), limit)
 
     @attr(type='smoke')
     def test_list_account_metadata(self):
diff --git a/tempest/services/object_storage/account_client.py b/tempest/services/object_storage/account_client.py
index a71a287..ce4b127 100644
--- a/tempest/services/object_storage/account_client.py
+++ b/tempest/services/object_storage/account_client.py
@@ -84,10 +84,13 @@
             DEFAULT:  Python-List returned in response body
         """
 
-        url = '?format=%s' % self.format
         if params:
-            url += '&%s' + urllib.urlencode(params)
+            if 'format' not in params:
+                params['format'] = self.format
+        else:
+            params = {'format': self.format}
 
+        url = '?' + urllib.urlencode(params)
         resp, body = self.get(url)
         body = json.loads(body)
         return resp, body