From bbfb8fbed8deb60a4fb6b56a61886fb8c0e80a3c Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki <spapagian@grnet.gr> Date: Fri, 26 Jul 2013 01:01:15 +0300 Subject: [PATCH] pithos: Add test for updating an object from version --- snf-pithos-app/pithos/api/test/objects.py | 89 +++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/snf-pithos-app/pithos/api/test/objects.py b/snf-pithos-app/pithos/api/test/objects.py index 75d93d494..43efdd171 100644 --- a/snf-pithos-app/pithos/api/test/objects.py +++ b/snf-pithos-app/pithos/api/test/objects.py @@ -1160,6 +1160,95 @@ class ObjectPost(PithosAPITest): source_data[:upto - offset + 1] + initial_data[upto + 1:])) + def test_update_range_from_invalid_other_object(self): + src = self.object + dest = get_random_name() + + url = join_urls(self.pithos_path, self.user, self.container, src) + r = self.get(url) + + # update zero length object + url = join_urls(self.pithos_path, self.user, self.container, dest) + initial_data = get_random_data() + length = len(initial_data) + r = self.put(url, data=initial_data) + self.assertEqual(r.status_code, 201) + + offset = random.randint(1, length - 2) + upto = random.randint(offset, length - 1) + + # source object does not start with / + r = self.post(url, + HTTP_CONTENT_RANGE='bytes %s-%s/*' % (offset, upto), + HTTP_X_SOURCE_OBJECT='%s/%s' % (self.container, src)) + self.assertEqual(r.status_code, 400) + + # source object does not exist + r = self.post(url, + HTTP_CONTENT_RANGE='bytes %s-%s/*' % (offset, upto), + HTTP_X_SOURCE_OBJECT='/%s/%s1' % (self.container, src)) + self.assertEqual(r.status_code, 404) + + def test_update_from_other_version(self): + versions = [] + info = self.get_object_info(self.container, self.object) + versions.append(info['X-Object-Version']) + pre_length = int(info['Content-Length']) + + # update object + d1, r = self.upload_object(self.container, self.object, + length=pre_length - 1)[1:] + self.assertTrue('X-Object-Version' in r) + versions.append(r['X-Object-Version']) + + # update object + d2, r = self.upload_object(self.container, self.object, + length=pre_length - 2)[1:] + self.assertTrue('X-Object-Version' in r) + versions.append(r['X-Object-Version']) + + # get previous version + url = join_urls(self.pithos_path, self.user, self.container, + self.object) + r = self.get('%s?version=list&format=json' % url) + self.assertEqual(r.status_code, 200) + l = json.loads(r.content)['versions'] + self.assertEqual(len(l), 3) + self.assertEqual([str(v[0]) for v in l], versions) + + # update with the previous version + r = self.post(url, + HTTP_CONTENT_RANGE='bytes 0-/*', + HTTP_X_SOURCE_OBJECT='/%s/%s' % (self.container, + self.object), + HTTP_X_SOURCE_VERSION=versions[0]) + self.assertEqual(r.status_code, 204) + + # check content + r = self.get(url) + content = r.content + self.assertEqual(len(content), pre_length) + self.assertEqual(content, self.object_data) + + # update object + d3, r = self.upload_object(self.container, self.object, + length=len(d2) + 1)[1:] + self.assertTrue('X-Object-Version' in r) + versions.append(r['X-Object-Version']) + + # update with the previous version + r = self.post(url, + HTTP_CONTENT_RANGE='bytes 0-/*', + HTTP_X_SOURCE_OBJECT='/%s/%s' % (self.container, + self.object), + HTTP_X_SOURCE_VERSION=versions[-2]) + self.assertEqual(r.status_code, 204) + + # check content + r = self.get(url) + content = r.content + self.assertEqual(content, d2 + d3[-1]) + class ObjectDelete(PithosAPITest): def setUp(self): -- GitLab