@@ -78,8 +78,7 @@ TEST_F(PlayerTestFixture, playing_respects_relative_timing_of_stored_messages)
7878 // messages
7979 auto start = std::chrono::steady_clock::now ();
8080 auto player = std::make_shared<rosbag2_transport::Player>(
81- std::move (
82- reader), storage_options_, play_options_);
81+ std::move (reader), storage_options_, play_options_);
8382 player->play ();
8483 auto replay_time = std::chrono::steady_clock::now () - start;
8584
@@ -113,8 +112,7 @@ TEST_F(PlayerTestFixture, playing_respects_rate)
113112 prepared_mock_reader->prepare (messages, topics_and_types);
114113 auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
115114 auto player = std::make_shared<rosbag2_transport::Player>(
116- std::move (
117- reader), storage_options_, play_options_);
115+ std::move (reader), storage_options_, play_options_);
118116 auto start = std::chrono::steady_clock::now ();
119117 player->play ();
120118 auto replay_time = std::chrono::steady_clock::now () - start;
@@ -131,8 +129,7 @@ TEST_F(PlayerTestFixture, playing_respects_rate)
131129 prepared_mock_reader->prepare (messages, topics_and_types);
132130 auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
133131 auto player = std::make_shared<rosbag2_transport::Player>(
134- std::move (
135- reader), storage_options_, play_options_);
132+ std::move (reader), storage_options_, play_options_);
136133 auto start = std::chrono::steady_clock::now ();
137134 player->play ();
138135 auto replay_time = std::chrono::steady_clock::now () - start;
@@ -148,8 +145,7 @@ TEST_F(PlayerTestFixture, playing_respects_rate)
148145 prepared_mock_reader->prepare (messages, topics_and_types);
149146 auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
150147 auto player = std::make_shared<rosbag2_transport::Player>(
151- std::move (
152- reader), storage_options_, play_options_);
148+ std::move (reader), storage_options_, play_options_);
153149 auto start = std::chrono::steady_clock::now ();
154150 player->play ();
155151 auto replay_time = std::chrono::steady_clock::now () - start;
@@ -165,8 +161,7 @@ TEST_F(PlayerTestFixture, playing_respects_rate)
165161 prepared_mock_reader->prepare (messages, topics_and_types);
166162 auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
167163 auto player = std::make_shared<rosbag2_transport::Player>(
168- std::move (
169- reader), storage_options_, play_options_);
164+ std::move (reader), storage_options_, play_options_);
170165 auto start = std::chrono::steady_clock::now ();
171166 player->play ();
172167 auto replay_time = std::chrono::steady_clock::now () - start;
@@ -182,12 +177,70 @@ TEST_F(PlayerTestFixture, playing_respects_rate)
182177 prepared_mock_reader->prepare (messages, topics_and_types);
183178 auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
184179 auto player = std::make_shared<rosbag2_transport::Player>(
185- std::move (
186- reader), storage_options_, play_options_);
180+ std::move (reader), storage_options_, play_options_);
187181 auto start = std::chrono::steady_clock::now ();
188182 player->play ();
189183 auto replay_time = std::chrono::steady_clock::now () - start;
190184
191185 ASSERT_THAT (replay_time, Gt (message_time_difference));
192186 }
193187}
188+
189+ TEST_F (PlayerTestFixture, playing_respects_delay)
190+ {
191+ auto primitive_message1 = get_messages_strings ()[0 ];
192+ primitive_message1->string_value = " Hello World 1" ;
193+
194+ auto primitive_message2 = get_messages_strings ()[0 ];
195+ primitive_message2->string_value = " Hello World 2" ;
196+
197+ auto message_time_difference = std::chrono::seconds (1 );
198+ auto topics_and_types =
199+ std::vector<rosbag2_storage::TopicMetadata>{{" topic1" , " test_msgs/Strings" , " " , " " }};
200+ std::vector<std::shared_ptr<rosbag2_storage::SerializedBagMessage>> messages =
201+ {serialize_test_message (" topic1" , 0 , primitive_message1),
202+ serialize_test_message (" topic1" , 0 , primitive_message2)};
203+
204+ messages[0 ]->time_stamp = 100 ;
205+ messages[1 ]->time_stamp =
206+ messages[0 ]->time_stamp + std::chrono::nanoseconds (message_time_difference).count ();
207+
208+ float delay_margin = 1.0 ;
209+
210+ // Sleep 5.0 seconds before play
211+ {
212+ play_options_.delay = 5.0 ;
213+ std::chrono::duration<float > delay (play_options_.delay );
214+ std::chrono::duration<float > delay_uppper (play_options_.delay + delay_margin);
215+
216+ auto prepared_mock_reader = std::make_unique<MockSequentialReader>();
217+ prepared_mock_reader->prepare (messages, topics_and_types);
218+ auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
219+ auto player = std::make_shared<rosbag2_transport::Player>(
220+ std::move (reader), storage_options_, play_options_);
221+ auto start = std::chrono::steady_clock::now ();
222+ player->play ();
223+ auto replay_time = std::chrono::steady_clock::now () - start;
224+
225+ ASSERT_THAT (replay_time, Gt (message_time_difference + delay));
226+ ASSERT_THAT (replay_time, Lt (message_time_difference + delay_uppper));
227+ }
228+
229+ // Invalid value should result in playing at default delay 0.0
230+ {
231+ play_options_.delay = -5.0 ;
232+ std::chrono::duration<float > delay_uppper (delay_margin);
233+
234+ auto prepared_mock_reader = std::make_unique<MockSequentialReader>();
235+ prepared_mock_reader->prepare (messages, topics_and_types);
236+ auto reader = std::make_unique<rosbag2_cpp::Reader>(std::move (prepared_mock_reader));
237+ auto player = std::make_shared<rosbag2_transport::Player>(
238+ std::move (reader), storage_options_, play_options_);
239+ auto start = std::chrono::steady_clock::now ();
240+ player->play ();
241+ auto replay_time = std::chrono::steady_clock::now () - start;
242+
243+ ASSERT_THAT (replay_time, Gt (message_time_difference));
244+ ASSERT_THAT (replay_time, Lt (message_time_difference + delay_uppper));
245+ }
246+ }
0 commit comments