@@ -140,6 +140,20 @@ TEST(TestSerializedMessage, release) {
140140 EXPECT_EQ (RCL_RET_OK, rmw_serialized_message_fini (&released_handle));
141141}
142142
143+ TEST (TestSerializedMessage, reserve) {
144+ rclcpp::SerializedMessage serialized_msg (13 );
145+ EXPECT_EQ (13u , serialized_msg.capacity ());
146+
147+ // Resize using reserve method
148+ serialized_msg.reserve (15 );
149+ EXPECT_EQ (15u , serialized_msg.capacity ());
150+
151+ // Use invalid value throws exception
152+ EXPECT_THROW (
153+ {serialized_msg.reserve (-1 );},
154+ rclcpp::exceptions::RCLBadAlloc);
155+ }
156+
143157TEST (TestSerializedMessage, serialization) {
144158 using MessageT = test_msgs::msg::BasicTypes;
145159
@@ -159,6 +173,85 @@ TEST(TestSerializedMessage, serialization) {
159173 }
160174}
161175
176+ TEST (TestSerializedMessage, assignment_operators) {
177+ const std::string content = " Hello World" ;
178+ const auto content_size = content.size () + 1 ; // accounting for null terminator
179+ auto default_allocator = rcl_get_default_allocator ();
180+ auto rcl_serialized_msg = rmw_get_zero_initialized_serialized_message ();
181+ auto ret = rmw_serialized_message_init (&rcl_serialized_msg, 13 , &default_allocator);
182+ ASSERT_EQ (RCL_RET_OK, ret);
183+
184+ // manually copy some content
185+ std::memcpy (rcl_serialized_msg.buffer , content.c_str (), content_size);
186+ rcl_serialized_msg.buffer_length = content_size;
187+ EXPECT_EQ (13u , rcl_serialized_msg.buffer_capacity );
188+ rclcpp::SerializedMessage serialized_message_to_assign (rcl_serialized_msg);
189+ EXPECT_EQ (13u , serialized_message_to_assign.capacity ());
190+ EXPECT_EQ (content_size, serialized_message_to_assign.size ());
191+
192+ // Test copy assignment with = operator, on another rclcpp::SerializedMessage
193+ rclcpp::SerializedMessage serialized_msg_copy (2 );
194+ EXPECT_EQ (2u , serialized_msg_copy.capacity ());
195+ EXPECT_EQ (0u , serialized_msg_copy.size ());
196+ serialized_msg_copy = serialized_message_to_assign;
197+ EXPECT_EQ (13u , serialized_msg_copy.capacity ());
198+ EXPECT_EQ (content_size, serialized_msg_copy.size ());
199+
200+ // Test copy assignment with = operator, with a rcl_serialized_message_t
201+ rclcpp::SerializedMessage serialized_msg_copy_rcl (2 );
202+ EXPECT_EQ (2u , serialized_msg_copy_rcl.capacity ());
203+ EXPECT_EQ (0u , serialized_msg_copy_rcl.size ());
204+ serialized_msg_copy_rcl = rcl_serialized_msg;
205+ EXPECT_EQ (13u , serialized_msg_copy_rcl.capacity ());
206+ EXPECT_EQ (content_size, serialized_msg_copy_rcl.size ());
207+
208+ // Test move assignment with = operator
209+ rclcpp::SerializedMessage serialized_msg_move (2 );
210+ EXPECT_EQ (2u , serialized_msg_move.capacity ());
211+ EXPECT_EQ (0u , serialized_msg_move.size ());
212+ serialized_msg_move = std::move (serialized_message_to_assign);
213+ EXPECT_EQ (13u , serialized_msg_move.capacity ());
214+ EXPECT_EQ (content_size, serialized_msg_move.size ());
215+ EXPECT_EQ (0u , serialized_message_to_assign.capacity ());
216+ EXPECT_EQ (0u , serialized_message_to_assign.size ());
217+
218+ // Test move assignment with = operator, with a rcl_serialized_message_t
219+ rclcpp::SerializedMessage serialized_msg_move_rcl (2 );
220+ EXPECT_EQ (2u , serialized_msg_move_rcl.capacity ());
221+ EXPECT_EQ (0u , serialized_msg_move_rcl.size ());
222+ serialized_msg_move_rcl = std::move (rcl_serialized_msg);
223+ EXPECT_EQ (13u , serialized_msg_move_rcl.capacity ());
224+ EXPECT_EQ (content_size, serialized_msg_move_rcl.size ());
225+ EXPECT_EQ (0u , rcl_serialized_msg.buffer_capacity );
226+
227+ // Error because it was moved
228+ EXPECT_EQ (RCUTILS_RET_INVALID_ARGUMENT, rmw_serialized_message_fini (&rcl_serialized_msg));
229+ }
230+
231+ TEST (TestSerializedMessage, failed_init_throws) {
232+ rclcpp::SerializedMessage serialized_msg (13 );
233+ EXPECT_EQ (13u , serialized_msg.capacity ());
234+
235+ // Constructor with invalid size throws exception
236+ EXPECT_THROW (
237+ {rclcpp::SerializedMessage serialized_msg_fail (-1 );},
238+ rclcpp::exceptions::RCLBadAlloc);
239+
240+ // Constructor copy with rmw_serialized bad msg throws
241+ auto default_allocator = rcl_get_default_allocator ();
242+ auto rcl_serialized_msg = rmw_get_zero_initialized_serialized_message ();
243+ auto ret = rmw_serialized_message_init (&rcl_serialized_msg, 13 , &default_allocator);
244+ ASSERT_EQ (RCL_RET_OK, ret);
245+ EXPECT_EQ (13u , rcl_serialized_msg.buffer_capacity );
246+ rcl_serialized_msg.buffer_capacity = -1 ;
247+ EXPECT_THROW (
248+ {rclcpp::SerializedMessage serialized_msg_fail_2 (rcl_serialized_msg);},
249+ rclcpp::exceptions::RCLBadAlloc);
250+
251+ rcl_serialized_msg.buffer_capacity = 13 ;
252+ EXPECT_EQ (RCL_RET_OK, rmw_serialized_message_fini (&rcl_serialized_msg));
253+ }
254+
162255void serialize_default_ros_msg ()
163256{
164257 using MessageT = test_msgs::msg::BasicTypes;
0 commit comments