示例#1
0
    def test_read_manifest(self):
        part1_content = FakeStream(content='A' * 500)
        part2_content = FakeStream(content='B' * 1000)

        def get_object(account, container, key, headers={}):
            if account != 'account':
                raise RuntimeError('unknown account')
            if container != 'foo':
                raise RuntimeError('unknown container')
            if key == 'part1':
                return (200, {'Content-Length': 500}, part1_content)
            if key == 'part2':
                return (200, {'Content-Length': 1000}, part2_content)
            raise RuntimeError('unknown key')

        self.swift.get_object.side_effect = get_object
        slo = utils.SLOFileWrapper(self.swift, 'account', self.manifest,
                                   {'etag': 'deadbeef'})
        content = ''
        while True:
            data = slo.read()
            content += data
            if not data:
                break
        self.assertEqual(1500, len(content))
        self.assertEqual('A' * 500, content[0:500])
        self.assertEqual('B' * 1000, content[500:1500])

        self.swift.get_object.has_calls(
            mock.call('account', 'foo', 'part1', {}),
            mock.call('account', 'foo', 'part2', {}))
        self.assertEqual(True, part1_content.closed)
        self.assertEqual(True, part2_content.closed)
示例#2
0
    def test_no_content_length_then_a_content_length(self):
        self.mock_swift = mock.Mock()
        self.mock_swift.get_object.side_effect = [
            (200, {}, FakeStream()),
            (200, {
                'Content-Length': '1024'
            }, FakeStream()),
        ]
        wrapper = utils.FileWrapper(self.mock_swift,
                                    'account',
                                    'container',
                                    'key',
                                    headers={'a': 'b'})

        with self.assertRaises(TypeError):
            len(wrapper)

        chunk_size = wrapper._swift_stream.chunk_size
        self.assertEqual('A' * (2 * chunk_size),
                         wrapper.read(4000) + next(wrapper))

        wrapper.seek(0, 'ignored')

        self.assertEqual(1024, len(wrapper))
        self.assertEqual('A' * 1024, wrapper.read())
示例#3
0
 def get_object(self, account, container, key, headers=None):
     self.got_headers = headers
     if self.content:
         self.fake_stream = FakeStream(content=self.content)
     else:
         self.fake_stream = FakeStream(self.size)
     headers = {'X-Object-Meta-Foo': 'baR'}
     if self.content_length is not None:
         headers['Content-Length'] = str(self.content_length)
     return (self.status, headers, self.fake_stream)
示例#4
0
 def get_object(account, container, key, headers):
     if key == slo_key:
         return (200, {
             utils.SLO_HEADER: 'True',
             'Content-Type': 'application/slo'
         }, FakeStream(content=json.dumps(manifest)))
     if container == 'segment_container':
         if key == 'slo-object/part1':
             return (200, {'Content-Length': 1024}, FakeStream(1024))
         elif key == 'slo-object/part2':
             return (200, {'Content-Length': 1024}, FakeStream(1024))
     raise RuntimeError('Unknown key!')
示例#5
0
    def test_seek_after_read(self):
        fake_segment = FakeStream(content='A' * 500)
        self.assertEqual(False, fake_segment.closed)

        def get_object(account, container, key, headers={}):
            if account != 'account':
                raise RuntimeError('unknown account')
            if container != 'foo':
                raise RuntimeError('unknown container')
            if key == 'part1':
                return (200, {'Content-Length': 500}, fake_segment)
            raise RuntimeError('unknown key (%r, %r, %r, %r)' %
                               (account, container, key, headers))

        self.swift.get_object.side_effect = get_object
        slo = utils.SLOFileWrapper(self.swift, 'account', self.manifest,
                                   {'etag': 'deadbeef'})
        data = slo.read()
        slo.seek(0)
        self.assertEqual(True, fake_segment.closed)
        self.assertEqual('A' * 500, data)
        self.swift.get_object.assert_called_once_with('account',
                                                      'foo',
                                                      'part1',
                                                      headers={})
示例#6
0
 def get_object(self, account, container, key, headers={}):
     self.fake_stream = FakeStream(self.size)
     return (self.status, {'Content-Length': self.size}, self.fake_stream)