def test_upload_segment_job(self): with tempfile.NamedTemporaryFile() as f: f.write(b'a' * 10) f.write(b'b' * 10) f.write(b'c' * 10) f.flush() # Mock the connection to return an empty etag. This # skips etag validation which would fail as the LengthWrapper # isnt read from. mock_conn = mock.Mock() mock_conn.put_object.return_value = '' type(mock_conn).attempts = mock.PropertyMock(return_value=2) expected_r = { 'action': 'upload_segment', 'for_object': 'test_o', 'segment_index': 2, 'segment_size': 10, 'segment_location': '/test_c_segments/test_s_1', 'log_line': 'test_o segment 2', 'success': True, 'response_dict': {}, 'segment_etag': '', 'attempts': 2, } s = SwiftService() r = s._upload_segment_job(conn=mock_conn, path=f.name, container='test_c', segment_name='test_s_1', segment_start=10, segment_size=10, segment_index=2, obj_name='test_o', options={ 'segment_container': None, 'checksum': True }) self._assertDictEqual(r, expected_r) self.assertEqual(mock_conn.put_object.call_count, 1) mock_conn.put_object.assert_called_with('test_c_segments', 'test_s_1', mock.ANY, content_length=10, response_dict={}) contents = mock_conn.put_object.call_args[0][2] self.assertIsInstance(contents, utils.LengthWrapper) self.assertEqual(len(contents), 10) # This read forces the LengthWrapper to calculate the md5 # for the read content. self.assertEqual(contents.read(), b'b' * 10) self.assertEqual(contents.get_md5sum(), md5(b'b' * 10).hexdigest())
def test_upload_segment_job(self): with tempfile.NamedTemporaryFile() as f: f.write(b'a' * 10) f.write(b'b' * 10) f.write(b'c' * 10) f.flush() # Mock the connection to return an empty etag. This # skips etag validation which would fail as the LengthWrapper # isnt read from. mock_conn = mock.Mock() mock_conn.put_object.return_value = '' type(mock_conn).attempts = mock.PropertyMock(return_value=2) expected_r = { 'action': 'upload_segment', 'for_object': 'test_o', 'segment_index': 2, 'segment_size': 10, 'segment_location': '/test_c_segments/test_s_1', 'log_line': 'test_o segment 2', 'success': True, 'response_dict': {}, 'segment_etag': '', 'attempts': 2, } s = SwiftService() r = s._upload_segment_job(conn=mock_conn, path=f.name, container='test_c', segment_name='test_s_1', segment_start=10, segment_size=10, segment_index=2, obj_name='test_o', options={'segment_container': None, 'checksum': True}) self._assertDictEqual(r, expected_r) self.assertEqual(mock_conn.put_object.call_count, 1) mock_conn.put_object.assert_called_with('test_c_segments', 'test_s_1', mock.ANY, content_length=10, response_dict={}) contents = mock_conn.put_object.call_args[0][2] self.assertIsInstance(contents, utils.LengthWrapper) self.assertEqual(len(contents), 10) # This read forces the LengthWrapper to calculate the md5 # for the read content. self.assertEqual(contents.read(), b'b' * 10) self.assertEqual(contents.get_md5sum(), md5(b'b' * 10).hexdigest())
def test_upload_segment_job_etag_mismatch(self): def _consuming_conn(*a, **kw): contents = a[2] contents.read() # Force md5 calculation return 'badresponseetag' with tempfile.NamedTemporaryFile() as f: f.write(b'a' * 10) f.write(b'b' * 10) f.write(b'c' * 10) f.flush() mock_conn = mock.Mock() mock_conn.put_object.side_effect = _consuming_conn type(mock_conn).attempts = mock.PropertyMock(return_value=2) s = SwiftService() r = s._upload_segment_job(conn=mock_conn, path=f.name, container='test_c', segment_name='test_s_1', segment_start=10, segment_size=10, segment_index=2, obj_name='test_o', options={ 'segment_container': None, 'checksum': True }) self.assertIn('error', r) self.assertIn('md5 mismatch', str(r['error'])) self.assertEqual(mock_conn.put_object.call_count, 1) mock_conn.put_object.assert_called_with('test_c_segments', 'test_s_1', mock.ANY, content_length=10, response_dict={}) contents = mock_conn.put_object.call_args[0][2] self.assertEqual(contents.get_md5sum(), md5(b'b' * 10).hexdigest())
def test_upload_segment_job_etag_mismatch(self): def _consuming_conn(*a, **kw): contents = a[2] contents.read() # Force md5 calculation return 'badresponseetag' with tempfile.NamedTemporaryFile() as f: f.write(b'a' * 10) f.write(b'b' * 10) f.write(b'c' * 10) f.flush() mock_conn = mock.Mock() mock_conn.put_object.side_effect = _consuming_conn type(mock_conn).attempts = mock.PropertyMock(return_value=2) s = SwiftService() r = s._upload_segment_job(conn=mock_conn, path=f.name, container='test_c', segment_name='test_s_1', segment_start=10, segment_size=10, segment_index=2, obj_name='test_o', options={'segment_container': None, 'checksum': True}) self.assertIn('error', r) self.assertIn('md5 mismatch', str(r['error'])) self.assertEqual(mock_conn.put_object.call_count, 1) mock_conn.put_object.assert_called_with('test_c_segments', 'test_s_1', mock.ANY, content_length=10, response_dict={}) contents = mock_conn.put_object.call_args[0][2] self.assertEqual(contents.get_md5sum(), md5(b'b' * 10).hexdigest())