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)
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())
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)
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!')
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={})
def get_object(self, account, container, key, headers={}): self.fake_stream = FakeStream(self.size) return (self.status, {'Content-Length': self.size}, self.fake_stream)