Sync functional tests with Swift v1.9.1

Change-Id: Id478f651fe937883837291059da9da853fcd2de2
Signed-off-by: Peter Portante <peter.portante@redhat.com>
Reviewed-on: http://review.gluster.org/6141
Reviewed-by: Luis Pabon <lpabon@redhat.com>
Tested-by: Luis Pabon <lpabon@redhat.com>
This commit is contained in:
Peter Portante 2013-10-24 22:04:40 -04:00 committed by Luis Pabon
parent b48149a4af
commit 04e402599b
9 changed files with 191 additions and 100 deletions

@ -1 +1 @@
Subproject commit 95bcd7180c546f91414c2493d343fe1a4ae3ce44 Subproject commit 4bd9e4584d31eb37c7e30e555daeb6b90703ee3a

View File

@ -4,8 +4,6 @@
import __builtin__ import __builtin__
import sys import sys
import os import os
from ConfigParser import MissingSectionHeaderError
from StringIO import StringIO
from swift.common.utils import readconf from swift.common.utils import readconf

View File

@ -15,12 +15,56 @@
""" OpenStack Swift based functional tests for Gluster for Swift""" """ OpenStack Swift based functional tests for Gluster for Swift"""
from test.functional.tests import config, locale, Base, Utils import random
from nose import SkipTest
from test.functional.tests import config, locale, Base, Base2, Utils, \
TestFileEnv
from test.functional.swift_test_client import Account, Connection, File, \ from test.functional.swift_test_client import Account, Connection, File, \
ResponseError ResponseError
web_front_end = config.get('web_front_end', 'integral')
class TestGlusterContainerPathsEnv:
class TestFile(Base):
env = TestFileEnv
set_up = False
def testObjectManifest(self):
if (web_front_end == 'apache2'):
raise SkipTest()
data = File.random_data(10000)
parts = random.randrange(2,10)
charsEachPart = len(data)/parts
for i in range(parts+1):
if i==0 :
file = self.env.container.file('objectmanifest')
hdrs={}
hdrs['Content-Length']='0'
hdrs['X-Object-Manifest']=str(self.env.container.name)+'/objectmanifest'
self.assert_(file.write('',hdrs=hdrs))
self.assert_(file.name in self.env.container.files())
self.assert_(file.read() == '')
elif i==parts :
file = self.env.container.file('objectmanifest'+'-'+str(i))
segment=data[ (i-1)*charsEachPart :]
self.assertTrue(file.write(segment))
else :
file = self.env.container.file('objectmanifest'+'-'+str(i))
segment=data[ (i-1)*charsEachPart : i*charsEachPart]
self.assertTrue(file.write(segment))
#matching the manifest file content with orignal data, as etag won't match
file = self.env.container.file('objectmanifest')
data_read = file.read()
self.assertEquals(data,data_read)
class TestFileUTF8(Base2, TestFile):
set_up = False
class TestContainerPathsEnv:
@classmethod @classmethod
def setUp(cls): def setUp(cls):
cls.conn = Connection(config) cls.conn = Connection(config)
@ -76,8 +120,8 @@ class TestGlusterContainerPathsEnv:
cls.sorted_objects = sorted(set(cls.dirs + cls.files)) cls.sorted_objects = sorted(set(cls.dirs + cls.files))
class TestGlusterContainerPaths(Base): class TestContainerPaths(Base):
env = TestGlusterContainerPathsEnv env = TestContainerPathsEnv
set_up = False set_up = False
def testTraverseContainer(self): def testTraverseContainer(self):
@ -149,3 +193,49 @@ class TestGlusterContainerPaths(Base):
assert_listing('dir1/subdir with spaces', assert_listing('dir1/subdir with spaces',
['dir1/subdir with spaces/file B']) ['dir1/subdir with spaces/file B'])
class TestObjectVersioningEnv:
@classmethod
def setUp(cls):
cls.conn = Connection(config)
cls.conn.authenticate()
cls.account = Account(cls.conn, config.get('account',
config['username']))
cls.account.delete_containers()
cls.containers = {}
#create two containers one for object other for versions of objects
for i in range(2):
hdrs={}
if i==0:
hdrs={'X-Versions-Location':'versions'}
cont = cls.containers['object'] = cls.account.container('object')
else:
cont = cls.containers['versions'] = cls.account.container('versions')
if not cont.create(hdrs=hdrs):
raise ResponseError(cls.conn.response)
cls.containers.append(cont)
class TestObjectVersioning(Base):
env = TestObjectVersioningEnv
set_up = False
def testObjectVersioning(self):
versions = random.randrange(2,10)
dataArr=[]
#create versions
for i in range(versions):
data = File.random_data(10000*(i+1))
file = self.env.containers['object'].file('object')
self.assertTrue(file.write(data))
dataArr.append(data)
cont = self.env.containers['versions']
info = cont.info()
self.assertEquals(info['object_count'], versions-1)
#match the current version of object with data in arr and delete it
for i in range(versions):
data = dataArr[-(i+1)]
file = self.env.containers['object'].file('object')
self.assertEquals(data,file.read())
self.assert_(file.delete())
self.assert_status(204)

View File

@ -170,7 +170,11 @@ class Connection(object):
self.storage_host = x[2].split(':')[0] self.storage_host = x[2].split(':')[0]
if ':' in x[2]: if ':' in x[2]:
self.storage_port = int(x[2].split(':')[1]) self.storage_port = int(x[2].split(':')[1])
self.storage_url = '/%s/%s' % (x[3], x[4]) # Make sure storage_url is a string and not unicode, since
# keystoneclient (called by swiftclient) returns them in
# unicode and this would cause troubles when doing
# no_safe_quote query.
self.storage_url = str('/%s/%s' % (x[3], x[4]))
self.storage_token = storage_token self.storage_token = storage_token
@ -462,8 +466,8 @@ class Container(Base):
raise ResponseError(self.conn.response) raise ResponseError(self.conn.response)
def info(self, hdrs={}, parms={}, cfg={}): def info(self, hdrs={}, parms={}, cfg={}):
status = self.conn.make_request('HEAD', self.path, hdrs=hdrs, self.conn.make_request('HEAD', self.path, hdrs=hdrs,
parms=parms, cfg=cfg) parms=parms, cfg=cfg)
if self.conn.response.status == 204: if self.conn.response.status == 204:
fields = [['bytes_used', 'x-container-bytes-used'], fields = [['bytes_used', 'x-container-bytes-used'],

View File

@ -67,7 +67,7 @@ conf_exists = constraints_conf.read('/etc/swift/swift.conf')
# Constraints are set first from the test config, then from # Constraints are set first from the test config, then from
# /etc/swift/swift.conf if it exists. If swift.conf doesn't exist, # /etc/swift/swift.conf if it exists. If swift.conf doesn't exist,
# then limit test coverage. This allows SAIO tests to work fine but # then limit test coverage. This allows SAIO tests to work fine but
# requires remote funtional testing to know something about the cluster # requires remote functional testing to know something about the cluster
# that is being tested. # that is being tested.
config = get_config('func_test') config = get_config('func_test')
for k in default_constraints: for k in default_constraints:
@ -514,7 +514,6 @@ class TestContainer(Base):
prefixs = ['alpha/', 'beta/', 'kappa/'] prefixs = ['alpha/', 'beta/', 'kappa/']
prefix_files = {} prefix_files = {}
all_files = []
for prefix in prefixs: for prefix in prefixs:
prefix_files[prefix] = [] prefix_files[prefix] = []
@ -791,7 +790,7 @@ class TestContainerPathsEnv:
stored_files.add(f) stored_files.add(f)
cls.stored_files = sorted(stored_files) cls.stored_files = sorted(stored_files)
class TestContainerPaths(Base): class TestContainerPaths(Base):
@ -1231,7 +1230,6 @@ class TestFile(Base):
def testRangedGetsWithLWSinHeader(self): def testRangedGetsWithLWSinHeader(self):
#Skip this test until webob 1.2 can tolerate LWS in Range header. #Skip this test until webob 1.2 can tolerate LWS in Range header.
file_length = 10000 file_length = 10000
range_size = file_length / 10
file = self.env.container.file(Utils.create_name()) file = self.env.container.file(Utils.create_name())
data = file.write_random(file_length) data = file.write_random(file_length)
@ -1567,33 +1565,6 @@ class TestFile(Base):
info = file.info() info = file.info()
self.assertEquals(etag, info['etag']) self.assertEquals(etag, info['etag'])
def testObjectManifest(self):
if (web_front_end == 'apache2'):
raise SkipTest()
data = File.random_data(10000)
parts = random.randrange(2,10)
charsEachPart = len(data)/parts
for i in range(parts+1):
if i==0 :
file = self.env.container.file('objectmanifest')
hdrs={}
hdrs['Content-Length']='0'
hdrs['X-Object-Manifest']=str(self.env.container.name)+'/objectmanifest'
self.assert_(file.write('',hdrs=hdrs))
self.assert_(file.name in self.env.container.files())
self.assert_(file.read() == '')
elif i==parts :
file = self.env.container.file('objectmanifest'+'-'+str(i))
segment=data[ (i-1)*charsEachPart :]
self.assertTrue(file.write(segment))
else :
file = self.env.container.file('objectmanifest'+'-'+str(i))
segment=data[ (i-1)*charsEachPart : i*charsEachPart]
self.assertTrue(file.write(segment))
#matching the manifest file content with orignal data, as etag won't match
file = self.env.container.file('objectmanifest')
data_read = file.read()
self.assertEquals(data,data_read)
class TestFileUTF8(Base2, TestFile): class TestFileUTF8(Base2, TestFile):
set_up = False set_up = False
@ -1682,53 +1653,6 @@ class TestFileComparison(Base):
self.assert_status(412) self.assert_status(412)
class TestObjectVersioningEnv:
@classmethod
def setUp(cls):
cls.conn = Connection(config)
cls.conn.authenticate()
cls.account = Account(cls.conn, config.get('account',
config['username']))
cls.account.delete_containers()
cls.containers = {}
#create two containers one for object other for versions of objects
for i in range(2):
hdrs={}
if i==0:
hdrs={'X-Versions-Location':'versions'}
cont = cls.containers['object'] = cls.account.container('object')
else:
cont = cls.containers['versions'] = cls.account.container('versions')
if not cont.create(hdrs=hdrs):
raise ResponseError(cls.conn.response)
cls.containers.append(cont)
class TestObjectVersioning(Base):
env = TestObjectVersioningEnv
set_up = False
def testObjectVersioning(self):
versions = random.randrange(2,10)
dataArr=[]
#create versions
for i in range(versions):
data = File.random_data(10000*(i+1))
file = self.env.containers['object'].file('object')
self.assertTrue(file.write(data))
dataArr.append(data)
cont = self.env.containers['versions']
info = cont.info()
self.assertEquals(info['object_count'], versions-1)
#match the current version of object with data in arr and delete it
for i in range(versions):
data = dataArr[-(i+1)]
file = self.env.containers['object'].file('object')
self.assertEquals(data,file.read())
self.assert_(file.delete())
self.assert_status(204)
class TestFileComparisonUTF8(Base2, TestFileComparison): class TestFileComparisonUTF8(Base2, TestFileComparison):
set_up = False set_up = False

View File

@ -28,13 +28,10 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import errno
import os import os
import socket import socket
import sys import sys
from time import sleep from time import sleep
from nose import SkipTest
from ConfigParser import MissingSectionHeaderError
from test import get_config from test import get_config
@ -168,10 +165,10 @@ def retry(func, *args, **kwargs):
if attempts > retries: if attempts > retries:
raise raise
parsed[use_account] = conn[use_account] = None parsed[use_account] = conn[use_account] = None
except AuthError, err: except AuthError:
url[use_account] = token[use_account] = None url[use_account] = token[use_account] = None
continue continue
except InternalServerError, err: except InternalServerError:
pass pass
if attempts <= retries: if attempts <= retries:
sleep(backoff) sleep(backoff)

View File

@ -37,7 +37,7 @@ from nose import SkipTest
from swift.common.constraints import MAX_META_COUNT, MAX_META_NAME_LENGTH, \ from swift.common.constraints import MAX_META_COUNT, MAX_META_NAME_LENGTH, \
MAX_META_OVERALL_SIZE, MAX_META_VALUE_LENGTH MAX_META_OVERALL_SIZE, MAX_META_VALUE_LENGTH
from swift_testing import check_response, retry, skip from swift_testing import check_response, retry, skip, web_front_end
class TestAccount(unittest.TestCase): class TestAccount(unittest.TestCase):
@ -78,6 +78,46 @@ class TestAccount(unittest.TestCase):
self.assert_(resp.status in (200, 204), resp.status) self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader('x-account-meta-test'), 'Value') self.assertEquals(resp.getheader('x-account-meta-test'), 'Value')
def test_unicode_metadata(self):
if skip:
raise SkipTest
def post(url, token, parsed, conn, name, value):
conn.request('POST', parsed.path, '',
{'X-Auth-Token': token, name: value})
return check_response(conn)
def head(url, token, parsed, conn):
conn.request('HEAD', parsed.path, '', {'X-Auth-Token': token})
return check_response(conn)
uni_key = u'X-Account-Meta-uni\u0E12'
uni_value = u'uni\u0E12'
if (web_front_end == 'integral'):
resp = retry(post, uni_key, '1')
resp.read()
self.assertTrue(resp.status in (201, 204))
resp = retry(head)
resp.read()
self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader(uni_key.encode('utf-8')), '1')
resp = retry(post, 'X-Account-Meta-uni', uni_value)
resp.read()
self.assertEquals(resp.status, 204)
resp = retry(head)
resp.read()
self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader('X-Account-Meta-uni'),
uni_value.encode('utf-8'))
if (web_front_end == 'integral'):
resp = retry(post, uni_key, uni_value)
resp.read()
self.assertEquals(resp.status, 204)
resp = retry(head)
resp.read()
self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader(uni_key.encode('utf-8')),
uni_value.encode('utf-8'))
def test_multi_metadata(self): def test_multi_metadata(self):
if skip: if skip:
raise SkipTest raise SkipTest

View File

@ -114,6 +114,48 @@ class TestContainer(unittest.TestCase):
self.assertEquals(resp.getheader('x-container-meta-one'), '1') self.assertEquals(resp.getheader('x-container-meta-one'), '1')
self.assertEquals(resp.getheader('x-container-meta-two'), '2') self.assertEquals(resp.getheader('x-container-meta-two'), '2')
def test_unicode_metadata(self):
if skip:
raise SkipTest
def post(url, token, parsed, conn, name, value):
conn.request('POST', parsed.path + '/' + self.name, '',
{'X-Auth-Token': token, name: value})
return check_response(conn)
def head(url, token, parsed, conn):
conn.request('HEAD', parsed.path + '/' + self.name, '',
{'X-Auth-Token': token})
return check_response(conn)
uni_key = u'X-Container-Meta-uni\u0E12'
uni_value = u'uni\u0E12'
if (web_front_end == 'integral'):
resp = retry(post, uni_key, '1')
resp.read()
self.assertEquals(resp.status, 204)
resp = retry(head)
resp.read()
self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader(uni_key.encode('utf-8')), '1')
resp = retry(post, 'X-Container-Meta-uni', uni_value)
resp.read()
self.assertEquals(resp.status, 204)
resp = retry(head)
resp.read()
self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader('X-Container-Meta-uni'),
uni_value.encode('utf-8'))
if (web_front_end == 'integral'):
resp = retry(post, uni_key, uni_value)
resp.read()
self.assertEquals(resp.status, 204)
resp = retry(head)
resp.read()
self.assert_(resp.status in (200, 204), resp.status)
self.assertEquals(resp.getheader(uni_key.encode('utf-8')),
uni_value.encode('utf-8'))
def test_PUT_metadata(self): def test_PUT_metadata(self):
if skip: if skip:
raise SkipTest raise SkipTest

View File

@ -34,12 +34,8 @@ import unittest
from nose import SkipTest from nose import SkipTest
from uuid import uuid4 from uuid import uuid4
from swift.common.constraints import MAX_META_COUNT, MAX_META_NAME_LENGTH, \
MAX_META_OVERALL_SIZE, MAX_META_VALUE_LENGTH
from swift_testing import check_response, retry, skip, skip3, \ from swift_testing import check_response, retry, skip, skip3, \
swift_test_perm, web_front_end swift_test_perm, web_front_end
from test import get_config
class TestObject(unittest.TestCase): class TestObject(unittest.TestCase):
@ -127,7 +123,7 @@ class TestObject(unittest.TestCase):
'X-Copy-From': source}) 'X-Copy-From': source})
return check_response(conn) return check_response(conn)
resp = retry(put) resp = retry(put)
contents = resp.read() resp.read()
self.assertEquals(resp.status, 201) self.assertEquals(resp.status, 201)
# contents of dest should be the same as source # contents of dest should be the same as source
@ -161,7 +157,7 @@ class TestObject(unittest.TestCase):
'Destination': dest}) 'Destination': dest})
return check_response(conn) return check_response(conn)
resp = retry(copy) resp = retry(copy)
contents = resp.read() resp.read()
self.assertEquals(resp.status, 201) self.assertEquals(resp.status, 201)
# contents of dest should be the same as source # contents of dest should be the same as source