def test_upload_blocks(self): cname = self.create_container()[0] url = join_urls(self.pithos_path, self.user, cname) r = self.post(url, data=get_random_data()) self.assertEqual(r.status_code, 202) url = join_urls(self.pithos_path, 'chuck', cname) r = self.post(url, data=get_random_data()) self.assertEqual(r.status_code, 403) # share object for read only oname = self.upload_object(cname)[0] url = join_urls(self.pithos_path, self.user, cname, oname) self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*', HTTP_X_OBJECT_SHARING='read=*') url = join_urls(self.pithos_path, 'chuck', cname) r = self.post(url, data=get_random_data()) self.assertEqual(r.status_code, 403) # share object for write only oname = self.upload_object(cname)[0] url = join_urls(self.pithos_path, self.user, cname, oname) self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*', HTTP_X_OBJECT_SHARING='write=*') url = join_urls(self.pithos_path, 'chuck', cname) r = self.post(url, data=get_random_data()) self.assertEqual(r.status_code, 403)
def test_not_allowed(self): cname = self.create_container()[0] oname, odata = self.upload_object(cname)[:-1] url = join_urls(self.pithos_path, self.user) r = self.head(url, user='******') self.assertEqual(r.status_code, 403) r = self.get(url, user='******') self.assertEqual(r.status_code, 403) r = self.post(url, user='******', data=get_random_data()) self.assertEqual(r.status_code, 403) url = join_urls(self.pithos_path, self.user, cname) r = self.head(url, user='******') self.assertEqual(r.status_code, 403) r = self.get(url, user='******') self.assertEqual(r.status_code, 403) r = self.put(url, user='******', data=get_random_data()) self.assertEqual(r.status_code, 403) r = self.post(url, user='******', data=get_random_data()) self.assertEqual(r.status_code, 403) r = self.delete(url, user='******') self.assertEqual(r.status_code, 403) url = join_urls(self.pithos_path, self.user, cname, oname) r = self.head(url, user='******') self.assertEqual(r.status_code, 403) r = self.get(url, user='******') self.assertEqual(r.status_code, 403) r = self.put(url, user='******', data=get_random_data()) self.assertEqual(r.status_code, 403) r = self.post(url, user='******', data=get_random_data()) self.assertEqual(r.status_code, 403) r = self.delete(url, user='******') self.assertEqual(r.status_code, 403)
def test_groups(self): # create a group headers = {"HTTP_X_ACCOUNT_GROUP_γκρουπ": "chazapis,διογένης"} url = join_urls(self.pithos_path, self.user) r = self.post(url, **headers) self.assertEqual(r.status_code, 202) groups = self.get_account_groups() self.assertTrue("γκρουπ" in groups) self.assertEqual(groups["γκρουπ"], "chazapis,διογένης") # check read access self.create_container("φάκελος") odata = self.upload_object("φάκελος", "ο1")[1] r = self.head(url, user="******") self.assertEqual(r.status_code, 403) r = self.get(url, user="******") self.assertEqual(r.status_code, 403) # share for read url = join_urls(self.pithos_path, self.user, "φάκελος", "ο1") r = self.post(url, content_type="", HTTP_X_OBJECT_SHARING="read=%s:γκρουπ" % self.user) self.assertEqual(r.status_code, 202) r = self.head(url, user="******") self.assertEqual(r.status_code, 200) r = self.get(url, user="******") self.assertEqual(r.status_code, 200) # check write access appended_data = get_random_data() r = self.post( url, user="******", data=appended_data, content_type="application/octet-stream", HTTP_CONTENT_LENGTH=str(len(appended_data)), HTTP_CONTENT_RANGE="bytes */*", ) self.assertEqual(r.status_code, 403) # share for write url = join_urls(self.pithos_path, self.user, "φάκελος", "ο1") r = self.post(url, content_type="", HTTP_X_OBJECT_SHARING="write=%s:γκρουπ" % self.user) self.assertEqual(r.status_code, 202) r = self.post( url, user="******", data=appended_data, content_type="application/octet-stream", HTTP_CONTENT_LENGTH=str(len(appended_data)), HTTP_CONTENT_RANGE="bytes */*", ) self.assertEqual(r.status_code, 204) r = self.get(url, user="******") self.assertEqual(r.status_code, 200) self.assertEqual(r.content, odata + appended_data)
def update_object_data(self, cname, oname=None, length=None, content_type=None, content_range=None, verify_status=True, user=None, **meta): oname = oname or get_random_name() length = length or random.randint(TEST_BLOCK_SIZE, 2 * TEST_BLOCK_SIZE) content_type = content_type or 'application/octet-stream' user = user or self.user data = get_random_data(length=length) headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v) for k, v in meta.iteritems()) if content_range: headers['HTTP_CONTENT_RANGE'] = content_range url = join_urls(self.pithos_path, user, cname, oname) r = self.post(url, user=user, data=data, content_type=content_type, **headers) if verify_status: self.assertEqual(r.status_code, 204) return oname, data, r
def test_groups(self): # create a group headers = {'HTTP_X_ACCOUNT_GROUP_γκρουπ': 'chazapis,διογένης'} url = join_urls(self.pithos_path, self.user) r = self.post(url, **headers) self.assertEqual(r.status_code, 202) groups = self.get_account_groups() self.assertTrue('γκρουπ' in groups) self.assertEqual(groups['γκρουπ'], 'chazapis,διογένης') # check read access self.create_container('φάκελος') odata = self.upload_object('φάκελος', 'ο1')[1] r = self.head(url, user='******') self.assertEqual(r.status_code, 403) r = self.get(url, user='******') self.assertEqual(r.status_code, 403) # share for read url = join_urls(self.pithos_path, self.user, 'φάκελος', 'ο1') r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=%s:γκρουπ' % self.user) self.assertEqual(r.status_code, 202) r = self.head(url, user='******') self.assertEqual(r.status_code, 200) r = self.get(url, user='******') self.assertEqual(r.status_code, 200) # check write access appended_data = get_random_data() r = self.post(url, user='******', data=appended_data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(appended_data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 403) # share for write url = join_urls(self.pithos_path, self.user, 'φάκελος', 'ο1') r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='write=%s:γκρουπ' % self.user) self.assertEqual(r.status_code, 202) r = self.post(url, user='******', data=appended_data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(appended_data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 204) r = self.get(url, user='******') self.assertEqual(r.status_code, 200) self.assertEqual(r.content, odata + appended_data)
def test_object_meta(self): self.create_container('φάκελος') url = join_urls(self.pithos_path, self.user, 'φάκελος', 'αντικείμενο') headers = {'HTTP_X_OBJECT_META_Ποιότητα': 'Ααα'} r = self.put(url, data=get_random_data(), **headers) self.assertEqual(r.status_code, 201) meta = self.get_object_meta('φάκελος', 'αντικείμενο') self.assertTrue('Ποιότητα' in meta) self.assertEqual(meta['Ποιότητα'], 'Ααα')
def test_object_meta(self): self.create_container("φάκελος") url = join_urls(self.pithos_path, self.user, "φάκελος", "αντικείμενο") headers = {"HTTP_X_OBJECT_META_Ποιότητα": "Ααα"} r = self.put(url, data=get_random_data(), **headers) self.assertEqual(r.status_code, 201) meta = self.get_object_meta("φάκελος", "αντικείμενο") self.assertTrue("Ποιότητα" in meta) self.assertEqual(meta["Ποιότητα"], "Ααα")
def assert_multiple_match(etag): quoted = lambda s: '"%s"' % s r = self.get(public_url, HTTP_IF_MATCH=','.join( [quoted(etag), quoted(get_random_data(64))])) # assert get success self.assertEqual(r.status_code, 200) # assert response content self.assertEqual(r.content, odata)
def test_delete_contents(self): folder = self.create_folder('c1')[0] for i in range(11): descendant = '%s_%d' % (strnextling(folder), i) self.upload_object('c1', descendant) self.create_folder('c1', '%s/%s' % (folder, get_random_data(5)))[0] r = self.delete('%s?delimiter=/' % join_urls( self.pithos_path, self.user, 'c1')) self.assertEqual(r.status_code, 204) self.assertEqual([], self.list_objects('c1')) self.assertTrue('c1' in self.list_containers(format=None))
def assert_multiple_match(etag): quoted = lambda s: '"%s"' % s r = self.get(public_url, HTTP_IF_MATCH=','.join( [quoted(etag), quoted(get_random_data(64))])) # assert get success self.assertEqual(r.status_code, 200) # assert response content self.assertEqual("".join(r.streaming_content), odata)
def upload_object(self, cname, oname=None, length=None, verify_status=True, user=None, **meta): oname = oname or get_random_name() length = length or random.randint(TEST_BLOCK_SIZE, 2 * TEST_BLOCK_SIZE) user = user or self.user data = get_random_data(length=length) headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v) for k, v in meta.iteritems()) url = join_urls(self.pithos_path, user, cname, oname) r = self.put(url, user=user, data=data, **headers) if verify_status: self.assertEqual(r.status_code, 201) return oname, data, r
def test_get_multiple_if_match(self): if pithos_settings.UPDATE_MD5: etag = md5_hash(self.odata) else: etag = merkle(self.odata) quoted = lambda s: '"%s"' % s r = self.view(self.view_url, HTTP_IF_MATCH=','.join( [quoted(etag), quoted(get_random_data(64))])) # assert get success self.assertEqual(r.status_code, 200) # assert response content self.assertEqual(r.content, self.odata)
def test_groups(self): # create a group headers = {'HTTP_X_ACCOUNT_GROUP_γκρουπ': 'chazapis,διογένης'} url = join_urls(self.pithos_path, self.user) r = self.post(url, **headers) self.assertEqual(r.status_code, 202) groups = self.get_account_groups() self.assertTrue('γκρουπ' in groups) self.assertEqual(groups['γκρουπ'], 'chazapis,διογένης') headers = {'HTTP_X_ACCOUNT_GROUP_γκρουπ': 'διογένης'} url = join_urls(self.pithos_path, self.user) r = self.post('%s?update=' % url, **headers) self.assertEqual(r.status_code, 202) groups = self.get_account_groups() self.assertTrue('γκρουπ' in groups) self.assertEqual(groups['γκρουπ'], 'διογένης') # check read access self.create_container('φάκελος') odata = self.upload_object('φάκελος', 'ο1')[1] r = self.head(url, user='******') self.assertEqual(r.status_code, 403) r = self.get(url, user='******') self.assertEqual(r.status_code, 403) # share for read url = join_urls(self.pithos_path, self.user, 'φάκελος', 'ο1') r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=%s:γκρουπ' % self.user) self.assertEqual(r.status_code, 202) r = self.head(url, user='******') self.assertEqual(r.status_code, 200) r = self.get(url, user='******') self.assertEqual(r.status_code, 200) # check write access appended_data = get_random_data() r = self.post(url, user='******', data=appended_data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(appended_data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 403) # share for write url = join_urls(self.pithos_path, self.user, 'φάκελος', 'ο1') r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='write=%s:γκρουπ' % self.user) self.assertEqual(r.status_code, 202) r = self.post(url, user='******', data=appended_data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(appended_data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 204) r = self.get(url, user='******') self.assertEqual(r.status_code, 200) self.assertEqual("".join(r.streaming_content), odata + appended_data) gname = ('a' * 256).capitalize() headers = {'HTTP_X_ACCOUNT_GROUP_%s' % gname: 'β'} url = join_urls(self.pithos_path, self.user) r = self.post(url, **headers) self.assertEqual(r.status_code, 202) groups = self.get_account_groups() self.assertTrue(gname in groups) self.assertEqual(groups[gname], 'β') gname = ('a' * 257).capitalize() headers = {'HTTP_X_ACCOUNT_GROUP_%s' % gname: 'β'} url = join_urls(self.pithos_path, self.user) r = self.post(url, **headers) self.assertEqual(r.status_code, 400)
def _assert_write(self, object, authorized=None): authorized = authorized or [] url = join_urls(self.pithos_path, self.user, self.container, object) for user in self.users: if user in authorized: r = self.get(url) self.assertEqual(r.status_code, 200) initial_data = r.content # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 204) # test read access r = self.get(url, user=user) self.assertEqual(r.status_code, 200) server_data = r.content self.assertEqual(server_data, initial_data + data) else: # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 403) # check inheritance info = self.get_object_info(self.container, object) is_directory = info['Content-Type'] in ('application/directory', 'application/folder') prefix = object + '/' derivatives = [ o['name'] for o in self.list_objects(self.container, prefix=object) if o['name'] != object ] for o in derivatives: url = join_urls(self.pithos_path, self.user, self.container, o) for user in self.users: if (user in authorized and is_directory and o.startswith(prefix)): # get initial data r = self.get(url) self.assertEqual(r.status_code, 200) initial_data = r.content # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 204) # test read access r = self.get(url, user=user) self.assertEqual(r.status_code, 200) server_data = r.content self.assertEqual(server_data, initial_data + data) initial_data = server_data else: # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 403)
def _assert_write(self, object, authorized=None): authorized = authorized or [] url = join_urls(self.pithos_path, self.user, self.container, object) for user in self.users: if user in authorized: r = self.get(url) self.assertEqual(r.status_code, 200) initial_data = r.content # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 204) # test read access r = self.get(url, user=user) self.assertEqual(r.status_code, 200) server_data = r.content self.assertEqual(server_data, initial_data + data) else: # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 403) # check inheritance info = self.get_object_info(self.container, object) is_directory = info['Content-Type'] in ('application/directory', 'application/folder') prefix = object + '/' derivatives = [o['name'] for o in self.list_objects( self.container, prefix=object) if o['name'] != object] for o in derivatives: url = join_urls(self.pithos_path, self.user, self.container, o) for user in self.users: if (user in authorized and is_directory and o.startswith(prefix)): # get initial data r = self.get(url) self.assertEqual(r.status_code, 200) initial_data = r.content # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 204) # test read access r = self.get(url, user=user) self.assertEqual(r.status_code, 200) server_data = r.content self.assertEqual(server_data, initial_data + data) initial_data = server_data else: # test write access data = get_random_data() r = self.post(url, user=user, data=data, content_type='application/octet-stream', HTTP_CONTENT_LENGTH=str(len(data)), HTTP_CONTENT_RANGE='bytes */*') self.assertEqual(r.status_code, 403)