public void ToMessage() { var serializers = new Mock <IStoreObjectSerializers>(); { serializers.Setup(s => s.HasSerializerFor(It.IsAny <Type>())) .Callback <Type>(t => Assert.IsTrue(typeof(int).Equals(t))) .Returns(true); serializers.Setup(s => s.SerializerFor(It.IsAny <Type>())) .Returns(new NonTransformingObjectSerializer()); } var translator = new CommandInvocationConverter(serializers.Object); var id = CommandId.Create(typeof(int).GetMethod("CompareTo", new[] { typeof(object) })); var data = new CommandInvocationData { Id = new MessageId(), InResponseTo = new MessageId(), Sender = new EndpointId("a"), CommandId = CommandIdExtensions.Serialize(id), ParameterTypes = new[] { new SerializedType { FullName = typeof(int).FullName, AssemblyName = typeof(int).Assembly.GetName().Name }, }, ParameterNames = new[] { "other", }, ParameterValues = new object[] { 1, } }; var msg = translator.ToMessage(data); Assert.IsInstanceOf(typeof(CommandInvokedMessage), msg); Assert.AreSame(data.Id, msg.Id); Assert.AreSame(data.Sender, msg.Sender); Assert.AreEqual(id, ((CommandInvokedMessage)msg).Invocation.Command); Assert.AreEqual(data.ParameterTypes.Length, ((CommandInvokedMessage)msg).Invocation.Parameters.Length); Assert.AreEqual(typeof(int), ((CommandInvokedMessage)msg).Invocation.Parameters[0].Parameter.Type); Assert.AreEqual("other", ((CommandInvokedMessage)msg).Invocation.Parameters[0].Parameter.Name); Assert.AreEqual(1, ((CommandInvokedMessage)msg).Invocation.Parameters[0].Value); }
public void FromMessage() { var serializers = new Mock <IStoreObjectSerializers>(); { serializers.Setup(s => s.HasSerializerFor(It.IsAny <Type>())) .Returns(true); serializers.Setup(s => s.SerializerFor(It.IsAny <Type>())) .Returns(new NonTransformingObjectSerializer()); } var translator = new CommandInvocationConverter(serializers.Object); var id = CommandId.Create(typeof(int).GetMethod("CompareTo", new[] { typeof(object) })); var msg = new CommandInvokedMessage( new EndpointId("a"), new CommandInvokedData( id, new[] { new CommandParameterValueMap( new CommandParameterDefinition(typeof(object), "other", CommandParameterOrigin.FromCommand), 1), })); var data = translator.FromMessage(msg); Assert.IsInstanceOf(typeof(CommandInvocationData), data); Assert.AreSame(msg.Id, data.Id); Assert.AreSame(msg.Sender, data.Sender); Assert.AreSame(msg.InResponseTo, data.InResponseTo); Assert.AreEqual(CommandIdExtensions.Serialize(id), ((CommandInvocationData)data).CommandId); Assert.AreEqual(msg.Invocation.Parameters.Length, ((CommandInvocationData)data).ParameterTypes.Length); Assert.AreEqual( msg.Invocation.Parameters[0].Parameter.Type.FullName, ((CommandInvocationData)data).ParameterTypes[0].FullName); Assert.AreEqual( msg.Invocation.Parameters[0].Parameter.Type.Assembly.GetName().Name, ((CommandInvocationData)data).ParameterTypes[0].AssemblyName); Assert.AreEqual(msg.Invocation.Parameters.Length, ((CommandInvocationData)data).ParameterNames.Length); Assert.AreEqual( msg.Invocation.Parameters[0].Parameter.Name, ((CommandInvocationData)data).ParameterNames[0]); Assert.AreEqual(msg.Invocation.Parameters.Length, ((CommandInvocationData)data).ParameterValues.Length); Assert.AreEqual( msg.Invocation.Parameters[0].Value, ((CommandInvocationData)data).ParameterValues[0]); }
/// <summary> /// Converts the data structure to a communication message. /// </summary> /// <param name="data">The data structure.</param> /// <returns>The communication message containing all the information that was stored in the data structure.</returns> public ICommunicationMessage ToMessage(IStoreV1CommunicationData data) { var msg = data as CommandInvocationData; if (msg == null) { return(new UnknownMessageTypeMessage(data.Sender, data.Id, data.InResponseTo)); } try { var id = CommandIdExtensions.Deserialize(msg.CommandId); var parameterValues = new CommandParameterValueMap[msg.ParameterTypes.Length]; for (int i = 0; i < msg.ParameterTypes.Length; i++) { var typeInfo = msg.ParameterTypes[i]; var type = TypeLoader.FromPartialInformation(typeInfo.FullName, typeInfo.AssemblyName); var name = msg.ParameterNames[i]; var serializedObjectData = msg.ParameterValues[i]; if (!m_TypeSerializers.HasSerializerFor(type)) { throw new MissingObjectDataSerializerException(); } var serializer = m_TypeSerializers.SerializerFor(type); var value = serializer.Deserialize(serializedObjectData); parameterValues[i] = new CommandParameterValueMap( new CommandParameterDefinition(type, name, CommandParameterOrigin.FromCommand), value); } return(new CommandInvokedMessage( data.Sender, data.Id, new CommandInvokedData( id, parameterValues))); } catch (Exception) { return(new UnknownMessageTypeMessage(data.Sender, data.Id, data.InResponseTo)); } }
/// <summary> /// Converts the communication message to a data structure. /// </summary> /// <param name="message">The communication message.</param> /// <returns>The data structure that contains all the information that was stored in the message.</returns> public IStoreV1CommunicationData FromMessage(ICommunicationMessage message) { var msg = message as CommandInvokedMessage; if (msg == null) { return(new UnknownMessageTypeData { Id = message.Id, InResponseTo = message.InResponseTo, Sender = message.Sender, }); } try { var parameters = msg.Invocation.Parameters; var parameterTypes = new SerializedType[parameters.Length]; var parameterNames = new string[parameters.Length]; var parameterValues = new object[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; parameterTypes[i] = new SerializedType { FullName = parameter.Parameter.Type.FullName, AssemblyName = parameter.Parameter.Type.Assembly.GetName().Name }; parameterNames[i] = parameter.Parameter.Name; if (!m_TypeSerializers.HasSerializerFor(parameter.Parameter.Type)) { throw new MissingObjectDataSerializerException(); } var serializer = m_TypeSerializers.SerializerFor(parameter.Parameter.Type); var value = serializer.Serialize(parameter.Value); parameterValues[i] = value; } return(new CommandInvocationData { Id = message.Id, InResponseTo = message.InResponseTo, Sender = message.Sender, CommandId = CommandIdExtensions.Serialize(msg.Invocation.Command), ParameterTypes = parameterTypes, ParameterNames = parameterNames, ParameterValues = parameterValues, }); } catch (Exception) { return(new UnknownMessageTypeData { Id = message.Id, InResponseTo = message.InResponseTo, Sender = message.Sender, }); } }