/* * Copyright (C) 2011 Google 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. */ package org.ros.internal.message; import static org.junit.Assert.assertTrue; import com.google.common.collect.Lists; import org.jboss.netty.buffer.ChannelBuffer; import org.junit.Before; import org.junit.Test; import org.ros.internal.message.topic.TopicDefinitionResourceProvider; import org.ros.message.Duration; import org.ros.message.MessageFactory; import org.ros.message.Time; /** * @author damonkohler@google.com (Damon Kohler) */ public class RawMessageSerializationTest { private TopicDefinitionResourceProvider topicDefinitionResourceProvider; private MessageFactory messageFactory; @Before public void before() { topicDefinitionResourceProvider = new TopicDefinitionResourceProvider(); messageFactory = new DefaultMessageFactory(topicDefinitionResourceProvider); } private void checkSerializeAndDeserialize(Message message) { ChannelBuffer buffer = MessageBuffers.dynamicBuffer(); DefaultMessageSerializer serializer = new DefaultMessageSerializer(); serializer.serialize(message, buffer); DefaultMessageDeserializer<RawMessage> deserializer = new DefaultMessageDeserializer<RawMessage>(message.toRawMessage().getIdentifier(), messageFactory); RawMessage deserializedMessage = deserializer.deserialize(buffer); assertTrue(message.equals(deserializedMessage)); } @Test public void testBool() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Bool"); rawMessage.setBool("data", true); checkSerializeAndDeserialize(rawMessage); rawMessage.setBool("data", false); checkSerializeAndDeserialize(rawMessage); } @Test public void testInt8() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int8"); rawMessage.setInt8("data", (byte) 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testUint8() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt8"); rawMessage.setUInt8("data", (byte) 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testInt16() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int16"); rawMessage.setInt16("data", (short) 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testUInt16() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt16"); rawMessage.setUInt16("data", (short) 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testInt32() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int32"); rawMessage.setInt32("data", 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testUInt32() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt32"); rawMessage.setUInt32("data", 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testInt64() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Int64"); rawMessage.setInt64("data", 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testUInt64() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/UInt64"); rawMessage.setUInt64("data", 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testFloat32() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Float32"); rawMessage.setFloat32("data", 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testFloat64() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Float64"); rawMessage.setFloat64("data", 42); checkSerializeAndDeserialize(rawMessage); } @Test public void testString() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/String"); rawMessage.setString("data", "Hello, ROS!"); checkSerializeAndDeserialize(rawMessage); } @Test public void testTime() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Time"); rawMessage.setTime("data", new Time()); checkSerializeAndDeserialize(rawMessage); } @Test public void testDuration() { RawMessage rawMessage = messageFactory.newFromType("std_msgs/Duration"); rawMessage.setDuration("data", new Duration()); checkSerializeAndDeserialize(rawMessage); } @Test public void testNestedMessage() { topicDefinitionResourceProvider.add("foo/foo", "std_msgs/String data"); RawMessage fooMessage = messageFactory.newFromType("foo/foo"); RawMessage stringMessage = messageFactory.newFromType("std_msgs/String"); stringMessage.setString("data", "Hello, ROS!"); fooMessage.setMessage("data", stringMessage); checkSerializeAndDeserialize(fooMessage); } @Test public void testNestedMessageArray() { topicDefinitionResourceProvider.add("foo/foo", "std_msgs/String[] data"); RawMessage fooMessage = messageFactory.newFromType("foo/foo"); RawMessage stringMessageA = messageFactory.newFromType("std_msgs/String"); stringMessageA.setString("data", "Hello, ROS!"); RawMessage stringMessageB = messageFactory.newFromType("std_msgs/String"); stringMessageB.setString("data", "Goodbye, ROS!"); fooMessage.setMessageList("data", Lists.<Message>newArrayList(stringMessageA, stringMessageB)); checkSerializeAndDeserialize(fooMessage); } @Test public void testChannelBuffer() { topicDefinitionResourceProvider.add("foo/foo", "uint8[] data"); ChannelBuffer buffer = MessageBuffers.dynamicBuffer(); buffer.writeBytes(new byte[] { 1, 2, 3, 4, 5 }); RawMessage rawMessage = messageFactory.newFromType("foo/foo"); rawMessage.setChannelBuffer("data", buffer); checkSerializeAndDeserialize(rawMessage); } @Test public void testInt32Array() { topicDefinitionResourceProvider.add("foo/foo", "int32[] data"); RawMessage rawMessage = messageFactory.newFromType("foo/foo"); rawMessage.setInt32Array("data", new int[] { 1, 2, 3, 4, 5 }); checkSerializeAndDeserialize(rawMessage); } @Test public void testFloat64Array() { topicDefinitionResourceProvider.add("foo/foo", "float64[] data"); RawMessage rawMessage = messageFactory.newFromType("foo/foo"); rawMessage.setFloat64Array("data", new double[] { 1, 2, 3, 4, 5 }); checkSerializeAndDeserialize(rawMessage); } }