1
# Copyright 2020 The CubeFS Authors.
3
# Licensed under the Apache License, Version 2.0 (the "License");
4
# you may not use this file except in compliance with the License.
5
# You may obtain a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS,
11
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12
# implied. See the License for the specific language governing
13
# permissions and limitations under the License.
15
# -*- coding: utf-8 -*-
17
from base import S3TestCase
18
from base import random_string, random_bytes, compute_md5, get_env_s3_client
21
KEY_PREFIX = 'test-object-get-range/'
24
class ObjectGetRangeTest(S3TestCase):
29
def __init__(self, case):
30
super(ObjectGetRangeTest, self).__init__(case)
31
self.s3 = get_env_s3_client()
32
self.file_size = 10000
33
self.file_key = KEY_PREFIX + random_string(16)
35
{ "range":"bytes=0-499", "status_code": 206, "content-range":"bytes 0-499/10000", "content-length": 500 },
36
{ "range":"bytes=500-999", "status_code": 206, "content-range":"bytes 500-999/10000", "content-length": 500 },
37
{ "range":"bytes=9500-", "status_code": 206, "content-range":"bytes 9500-9999/10000", "content-length": 500 },
38
{ "range":"bytes=0-", "status_code": 206, "content-range":"bytes 0-9999/10000", "content-length": 10000 },
39
{ "range":"bytes=0-0", "status_code": 206, "content-range":"bytes 0-0/10000", "content-length": 1 },
40
{ "range":"bytes=-500", "status_code": 206, "content-range":"bytes 9500-9999/10000", "content-length": 500 },
41
{ "range":"bytes=-1", "status_code": 206, "content-range":"bytes 9999-9999/10000", "content-length": 1 },
42
{ "range":"bytes=-0", "status_code": 206, "content-range":"bytes 0-9999/10000", "content-length": 10000 },
43
{ "range":"bytes=1-0", "status_code": 416 },
44
{ "range":"bytes=10", "status_code": 416 },
45
{ "range":"bytes=", "status_code": 416 },
46
{ "range":"bytes=abc", "status_code": 416 },
47
{ "range":"bytes=abc-123", "status_code": 416 },
48
{ "range":"1-0", "status_code": 416 },
53
def _init_object(self):
55
result = self.s3.list_objects(Bucket=BUCKET, Prefix=KEY_PREFIX)
56
if 'Contents' in result:
57
contents = result['Contents']
58
for content in contents:
59
file_keys.append({'Key': content.get('Key')})
61
if len(file_keys) > 0:
62
self.s3.delete_objects(
64
Delete={'Objects': file_keys}
67
self.s3.put_object(Bucket=BUCKET, Key=self.file_key, Body=random_bytes(self.file_size))
69
def test_get_object_range(self):
73
for test_case in self.test_cases:
75
result=self.s3.get_object(Bucket=BUCKET, Key=self.file_key, Range=test_case.get('range')),
76
except Exception as e:
77
self.assert_client_error(error=e, expect_status_code=test_case.get('status_code'))
79
self.assert_get_object_range_result(
81
status_code=test_case.get('status_code'),
82
content_range=test_case.get('content-range', None),
83
content_length=test_case.get('content-length', None)
86
self.s3.delete_object( Bucket=BUCKET, Key=self.file_key)