diff --git a/oslo_messaging/serializer.py b/oslo_messaging/serializer.py index 78bf983b6..b1761fd83 100644 --- a/oslo_messaging/serializer.py +++ b/oslo_messaging/serializer.py @@ -12,12 +12,14 @@ # License for the specific language governing permissions and limitations # under the License. -__all__ = ['Serializer', 'NoOpSerializer', 'JsonPayloadSerializer'] +__all__ = ['Serializer', 'NoOpSerializer', 'JsonPayloadSerializer', + 'RequestContextSerializer'] """Provides the definition of a message serialization handler""" import abc +from oslo_context import context as common_context from oslo_serialization import jsonutils import six @@ -61,6 +63,28 @@ class Serializer(object): """ +class RequestContextSerializer(Serializer): + + def __init__(self, base): + self._base = base + + def serialize_entity(self, context, entity): + if not self._base: + return entity + return self._base.serialize_entity(context, entity) + + def deserialize_entity(self, context, entity): + if not self._base: + return entity + return self._base.deserialize_entity(context, entity) + + def serialize_context(self, context): + return context.to_dict() + + def deserialize_context(self, context): + return common_context.RequestContext.from_dict(context) + + class NoOpSerializer(Serializer): """A serializer that does nothing.""" diff --git a/oslo_messaging/tests/test_serializer.py b/oslo_messaging/tests/test_serializer.py new file mode 100644 index 000000000..329d9de71 --- /dev/null +++ b/oslo_messaging/tests/test_serializer.py @@ -0,0 +1,75 @@ +# Copyright 2015 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_context import context as common_context +from six.moves import mock + +from oslo_messaging import serializer +from oslo_messaging.tests import utils as test_utils + + +class TestRequestContextSerializer(test_utils.BaseTestCase): + + def setUp(self): + super(TestRequestContextSerializer, self).setUp() + + self.serializer = serializer.RequestContextSerializer(mock.MagicMock()) + self.context = common_context.RequestContext() + self.entity = {'foo': 'bar'} + + def test_serialize_entity(self): + self.serializer.serialize_entity(self.context, self.entity) + self.serializer._base.serialize_entity.assert_called_with( + self.context, self.entity) + + def test_serialize_entity_empty_base(self): + # NOTE(viktors): Return False for check `if self.serializer._base:` + bool_args = {'__bool__': lambda *args: False, + '__nonzero__': lambda *args: False} + self.serializer._base.configure_mock(**bool_args) + + entity = self.serializer.serialize_entity(self.context, self.entity) + self.assertFalse(self.serializer._base.serialize_entity.called) + self.assertEqual(entity, self.entity) + + def test_deserialize_entity(self): + self.serializer.deserialize_entity(self.context, self.entity) + self.serializer._base.deserialize_entity.assert_called_with( + self.context, self.entity) + + def test_deserialize_entity_empty_base(self): + # NOTE(viktors): Return False for check `if self.serializer._base:` + bool_args = {'__bool__': lambda *args: False, + '__nonzero__': lambda *args: False} + self.serializer._base.configure_mock(**bool_args) + + entity = self.serializer.deserialize_entity(self.context, self.entity) + self.assertFalse(self.serializer._base.serialize_entity.called) + self.assertEqual(entity, self.entity) + + def test_serialize_context(self): + new_context = self.serializer.serialize_context(self.context) + + self.assertEqual(new_context, self.context.to_dict()) + + @mock.patch.object(common_context.RequestContext, 'from_dict', + return_value='foobar') + def test_deserialize_context(self, mock_to_dict): + new_context = self.serializer.deserialize_context(self.context) + + mock_to_dict.assert_called_with(self.context) + self.assertEqual( + new_context, + common_context.RequestContext.from_dict(self.context) + )