Skip to content

Commit 9d0bd2f

Browse files
MichaelOrlovmergify[bot]
authored andcommitted
Upstream quality changes from Apex.AI part-2 (#1924)
* Fix for incorrectly handling exit code in wait_until_completion(..) Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Address flakiness in test_play_services - Increase timeout for `expect_messages(..)` - Also add `player_->wait_for_playback_to_start();` in `setup_player()` Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Fix CPP_LINT warnings about missing include headers Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Address CPPLint warnings in the rosbag2_storage_sqlite3 Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Adjust test_rosbag2_storage_api.cpp for bounded strings - Reduce size of each std_string_msg to fit in 256 byte boundary Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Print warnings instead of errors for not found type definitions Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Add debug info to flaky `test_play_cancel` in rosbag2_py Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Fix for flaky play_respect_messages_timing_after_play_next Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Reduce runtime for the `PlayerTestFixture.playing_respects_delay` test Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Address review comment by using `delay_margin(0.5s)` Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Address linter warnings in the test_transport.py Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Use RESOURCES_PATH from envar in test_transport.py - Fix to avoid failure with remote test execution and to be consistent with oter similar tests. Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Mitigate flakiness in record_all_include_unpublished_false Increase timeout when waiting to stop discovery at least to the 0.5 sec. The record_all_include_unpublished_false_includes_later_published is tend to be flaky due to the insufficient timeout for waiting to stop discovery thread in the recorder. Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Fix linter errors in the `message_definition_encoding.md` Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Minor changes in rosbag2_examples_py Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Mark MessageProducer<T> as final to address clang16 warnings - Address clang16 warning: "destructor called on non-final 'msg_utils::MessageProducer<T>' that has virtual functions but non-virtual destructor". Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Address unused variable warning on the clang16 build Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Fix for flaky `test_play_services` Increase timeouts for service calls in rosbag2_transport `test_play_services` tests Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Fix for record_if_topic_list_service_list_and_all_are_specified - Flush output from Python print when printing warnings. Some tests rely on the warning output to be in the std::cout. Without flushing the warnings may not be captured by tests. Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Sort includes alphabetically in the `info.cpp` file Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Update rosbag2_cpp/test/rosbag2_cpp/test_service_utils.cpp Sort includes alphabetically in test_service_utils.cpp Co-authored-by: Christophe Bedard <bedard.christophe@gmail.com> Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Sort includes in test_rosbag2_cpp_get_service_info.cpp Co-authored-by: Christophe Bedard <bedard.christophe@gmail.com> Signed-off-by: Michael Orlov <morlovmr@gmail.com> * Sort includes in rosbag2_py/_info.cpp Co-authored-by: Christophe Bedard <bedard.christophe@gmail.com> Signed-off-by: Michael Orlov <morlovmr@gmail.com> --------- Signed-off-by: Michael Orlov <morlovmr@gmail.com> Co-authored-by: Christophe Bedard <bedard.christophe@gmail.com> (cherry picked from commit 6f44ee0) # Conflicts: # ros2bag/ros2bag/verb/record.py # rosbag2_cpp/src/rosbag2_cpp/info.cpp
1 parent 8a01659 commit 9d0bd2f

File tree

24 files changed

+103
-47
lines changed

24 files changed

+103
-47
lines changed

docs/message_definition_encoding.md

+15-7
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@ This set of definitions with all field types recursively included can be called
1616

1717
## `ros2msg` encoding
1818

19-
This encoding consists of definitions in [.msg](https://docs.ros.org/en/rolling/Concepts/Basic/About-Interfaces.html#messages) and [.srv](https://docs.ros.org/en/rolling/Concepts/Basic/About-Interfaces.html#services) format, concatenated together in human-readable form with
19+
This encoding consists of definitions in
20+
[.msg](https://docs.ros.org/en/rolling/Concepts/Basic/About-Interfaces.html#messages) and
21+
[.srv](https://docs.ros.org/en/rolling/Concepts/Basic/About-Interfaces.html#services) format,
22+
concatenated together in human-readable form with
2023
a delimiter.
2124

22-
The top-level message definition is present first, with no delimiter. All dependent .msg definitions are preceded by a two-line delimiter:
25+
The top-level message definition is present first, with no delimiter. All dependent .msg definitions
26+
are preceded by a two-line delimiter:
2327

2428
* One line containing exactly 80 `=` characters
2529
* One line containing `MSG: <package resource name>` for that type. The space between MSG: and the
@@ -29,7 +33,7 @@ The top-level message definition is present first, with no delimiter. All depend
2933

3034
For example, the complete message definition for `my_msgs/msg/ExampleMsg` in `ros2msg` form is:
3135

32-
```
36+
```ini
3337
# defines a message that includes a field of a custom message type
3438
my_msgs/BasicMsg my_basic_field
3539
================================================================================
@@ -40,7 +44,7 @@ float32 my_float
4044

4145
Another example is a service message definition for `my_msgs/srv/ExampleSrv` in `ros2msg` form
4246

43-
```
47+
```ini
4448
# defines a service message that includes a field of a custom message type
4549
my_msgs/BasicMsg request
4650
---
@@ -53,16 +57,20 @@ float32 my_float
5357

5458
## `ros2idl` encoding
5559

56-
The IDL definition of the type specified by name along with all dependent types are stored together. The IDL definitions can be stored in any order. Every definition is preceded by a two-line delimiter:
60+
The IDL definition of the type specified by name along with all dependent types are stored together.
61+
The IDL definitions can be stored in any order. Every definition is preceded by a two-line
62+
delimiter:
5763

5864
* a line containing exactly 80 `=` characters, then
59-
* A line containing only `IDL: <package resource name>` for that definition. The space between IDL: and the package resource name is mandatory. The package resource name does not include a file extension.
65+
* A line containing only `IDL: <package resource name>` for that definition. The space between IDL:
66+
and the package resource name is mandatory. The package resource name does not include a file
67+
extension.
6068

6169
### `ros2idl` example
6270

6371
For example, the complete message definition for `my_msgs/msg/ComplexMsg` in `ros2idl` form is:
6472

65-
```
73+
```idl
6674
================================================================================
6775
IDL: my_msgs/msg/ComplexMsg
6876
// generated from rosidl_adapter/resource/msg.idl.em

ros2bag/ros2bag/verb/record.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,11 @@ def check_necessary_argument(args):
229229

230230
def validate_parsed_arguments(args, uri) -> str:
231231
if args.topics_positional:
232+
<<<<<<< HEAD
233+
=======
234+
print(print_warn('Positional "topics" argument deprecated. '
235+
'Please use optional "--topics" argument instead.'), flush=True)
236+
>>>>>>> 6f44ee0 (Upstream quality changes from Apex.AI part-2 (#1924))
232237
args.topics = args.topics_positional
233238

234239
if not check_necessary_argument(args):
@@ -256,13 +261,22 @@ def validate_parsed_arguments(args, uri) -> str:
256261
'or --regex')
257262

258263
if (args.all or args.all_services) and args.services:
259-
print(print_warn('--all or --all-services will override --services'))
264+
print(print_warn('--all or --all-services will override --services'), flush=True)
260265

261266
if (args.all or args.all_topics) and args.topics:
262-
print(print_warn('--all or --all-topics will override --topics'))
267+
print(print_warn('--all or --all-topics will override --topics'), flush=True)
263268

269+
<<<<<<< HEAD
264270
if (args.all or args.all_topics or args.all_services) and args.regex:
265271
print(print_warn('--all, --all-topics or --all-services will override --regex'))
272+
=======
273+
if (args.all or args.all_actions) and args.actions:
274+
print(print_warn('--all or --all-actions will override --actions'))
275+
276+
if (args.all or args.all_topics or args.all_services or args.all_actions) and args.regex:
277+
print(print_warn('--all, --all-topics --all-services or --all-actions will override '
278+
'--regex'), flush=True)
279+
>>>>>>> 6f44ee0 (Upstream quality changes from Apex.AI part-2 (#1924))
266280

267281
if os.path.isdir(uri):
268282
return print_error("Output folder '{}' already exists.".format(uri))

rosbag2_cpp/src/rosbag2_cpp/info.cpp

+12-4
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,29 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include "rosbag2_cpp/info.hpp"
16-
1715
#include <filesystem>
18-
#include <unordered_map>
19-
#include <unordered_set>
16+
#include <memory>
2017
#include <stdexcept>
2118
#include <string>
19+
#include <unordered_map>
20+
#include <unordered_set>
21+
#include <utility>
22+
#include <vector>
2223

2324
#include "rmw/rmw.h"
25+
<<<<<<< HEAD
2426
#include "rosidl_typesupport_cpp/message_type_support.hpp"
2527
#include "service_msgs/msg/service_event_info.hpp"
2628

29+
=======
30+
#include "rosbag2_cpp/action_utils.hpp"
31+
#include "rosbag2_cpp/info.hpp"
32+
>>>>>>> 6f44ee0 (Upstream quality changes from Apex.AI part-2 (#1924))
2733
#include "rosbag2_cpp/service_utils.hpp"
2834
#include "rosbag2_storage/metadata_io.hpp"
2935
#include "rosbag2_storage/storage_factory.hpp"
36+
#include "rosidl_typesupport_cpp/message_type_support.hpp"
37+
#include "service_msgs/msg/service_event_info.hpp"
3038

3139
namespace fs = std::filesystem;
3240

rosbag2_cpp/src/rosbag2_cpp/message_definitions/local_message_definition_source.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ const LocalMessageDefinitionSource::MessageSpec & LocalMessageDefinitionSource::
184184
try {
185185
share_dir = ament_index_cpp::get_package_share_directory(package);
186186
} catch (const ament_index_cpp::PackageNotFoundError & e) {
187-
ROSBAG2_CPP_LOG_WARN("'%s'", e.what());
187+
ROSBAG2_CPP_LOG_WARN(
188+
"get_package_share_directory(%s) failed with error: '%s'", package.c_str(), e.what());
188189
throw DefinitionNotFoundError(definition_identifier.topic_type());
189190
}
190191
std::string dir = definition_identifier.format() == Format::MSG ||
@@ -245,7 +246,7 @@ rosbag2_storage::MessageDefinition LocalMessageDefinitionSource::get_full_text(
245246
result = (delimiter(root_definition_identifier) +
246247
append_recursive(root_definition_identifier, max_recursion_depth));
247248
} catch (const TypenameNotUnderstoodError & err) {
248-
ROSBAG2_CPP_LOG_ERROR(
249+
ROSBAG2_CPP_LOG_WARN(
249250
"Message type name '%s' not understood by type definition search, "
250251
"definition will be left empty in bag.", err.what());
251252
format = Format::UNKNOWN;
@@ -280,7 +281,7 @@ rosbag2_storage::MessageDefinition LocalMessageDefinitionSource::get_full_text(
280281
format = Format::IDL;
281282
}
282283
} catch (const TypenameNotUnderstoodError & err) {
283-
ROSBAG2_CPP_LOG_ERROR(
284+
ROSBAG2_CPP_LOG_WARN(
284285
"Message type name '%s' not understood by type definition search, "
285286
"definition will be left empty in bag.", err.what());
286287
format = Format::UNKNOWN;

rosbag2_cpp/src/rosbag2_cpp/service_utils.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
#include <cstring>
16+
#include <string>
1617

1718
#include "rcl/service_introspection.h"
1819

rosbag2_cpp/test/rosbag2_cpp/test_service_utils.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <string>
1717
#include <tuple>
18+
#include <utility>
1819
#include <vector>
1920

2021
#include "rosbag2_cpp/service_utils.hpp"

rosbag2_examples/rosbag2_examples_py/rosbag2_examples_py/data_generator_executable.py

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ def main(args=None):
4343
serialize_message(data),
4444
time_stamp.nanoseconds)
4545
time_stamp += Duration(seconds=1)
46+
writer.close()
47+
print("Generated data saved into the '%s'" % storage_options.uri)
4648

4749

4850
if __name__ == '__main__':

rosbag2_examples/rosbag2_examples_py/rosbag2_examples_py/data_generator_node.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def __init__(self):
2828

2929
storage_options = rosbag2_py.StorageOptions(
3030
uri='timed_synthetic_bag',
31-
storage_id='sqlite3')
31+
storage_id='mcap')
3232
converter_options = rosbag2_py.ConverterOptions('', '')
3333
self.writer.open(storage_options, converter_options)
3434

rosbag2_performance/rosbag2_performance_benchmarking/include/msg_utils/message_producer.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class ProducerBase
3333
};
3434

3535
template<typename T>
36-
class MessageProducer : public ProducerBase
36+
class MessageProducer final : public ProducerBase
3737
{
3838
public:
3939
MessageProducer(rclcpp::Node & node, std::string topic, const PublisherGroupConfig & config);

rosbag2_performance/rosbag2_performance_benchmarking/src/writer_benchmark.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ void WriterBenchmark::start_benchmark()
5858
RCLCPP_INFO(get_logger(), "Starting the WriterBenchmark");
5959
start_producers();
6060
while (rclcpp::ok()) {
61-
int count = 0;
6261
unsigned int complete_count = 0;
6362

6463
// TODO(adamdbrw) Performance can be improved. Use conditional variables
@@ -121,7 +120,6 @@ void WriterBenchmark::start_benchmark()
121120
} catch (const std::runtime_error & e) {
122121
RCLCPP_ERROR_STREAM(get_logger(), "Failed to record: " << e.what());
123122
}
124-
++count;
125123
}
126124
}
127125
if (complete_count == queues_.size()) {

rosbag2_py/src/rosbag2_py/_info.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include <algorithm>
1516
#include <iostream>
1617
#include <memory>
1718
#include <string>
18-
#include <algorithm>
19+
#include <vector>
1920

2021
#include "info_sorting_method.hpp"
2122
#include "format_bag_metadata.hpp"

rosbag2_py/src/rosbag2_py/format_service_info.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include <vector>
16+
#include <memory>
1517
#include <sstream>
18+
#include <string>
1619

1720
#include "format_service_info.hpp"
1821
#include "rosbag2_cpp/service_utils.hpp"

rosbag2_py/test/test_transport.py

+18-9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
import datetime
16+
import os
1617
from pathlib import Path
1718
import re
1819
import threading
@@ -28,7 +29,7 @@
2829
from std_msgs.msg import String
2930

3031

31-
RESOURCES_PATH = Path(__file__).parent / 'resources'
32+
RESOURCES_PATH = Path(os.environ['ROSBAG2_PY_TEST_RESOURCES_DIR'])
3233
PLAYBACK_UNTIL_TIMESTAMP_REGEX_STRING = r'\[rosbag2_player]: Playback until timestamp: -1'
3334

3435

@@ -117,6 +118,8 @@ def test_record_cancel(tmp_path, storage_id):
117118
@pytest.mark.parametrize('storage_id', TESTED_STORAGE_IDS)
118119
def test_play_cancel(storage_id, capfd):
119120
bag_path = str(RESOURCES_PATH / storage_id / 'talker')
121+
assert os.path.exists(bag_path), 'Could not find test bag file: ' + bag_path
122+
120123
storage_options, converter_options = get_rosbag_options(bag_path, storage_id)
121124

122125
player = rosbag2_py.Player()
@@ -131,18 +134,24 @@ def test_play_cancel(storage_id, capfd):
131134
daemon=True)
132135
player_thread.start()
133136

134-
def check_playback_start_output(cumulative_out, cumulative_err):
137+
def check_playback_start_output(cap_streams):
135138
out, err = capfd.readouterr()
136-
cumulative_err += err
137-
cumulative_out += out
139+
cap_streams['err'] += err
140+
cap_streams['out'] += out
138141
expected_string_regex = re.compile(PLAYBACK_UNTIL_TIMESTAMP_REGEX_STRING)
139-
matches = expected_string_regex.search(cumulative_err)
142+
matches = expected_string_regex.search(cap_streams['err'])
140143
return matches is not None
141144

142-
captured_out = ''
143-
captured_err = ''
144-
assert wait_for(lambda: check_playback_start_output(captured_out, captured_err),
145-
timeout=rclpy.duration.Duration(seconds=3))
145+
captured_streams = {'out': '', 'err': ''}
146+
147+
if not wait_for(lambda: check_playback_start_output(captured_streams),
148+
timeout=rclpy.duration.Duration(seconds=5)):
149+
with capfd.disabled():
150+
print('\nCaptured stdout:', captured_streams['out'])
151+
print('\nCaptured stderr:', captured_streams['err'])
152+
player.cancel()
153+
player_thread.join()
154+
assert False
146155

147156
player.cancel()
148157
player_thread.join(3)

rosbag2_storage_sqlite3/src/rosbag2_storage_sqlite3/sqlite_storage.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
#include <atomic>
2020
#include <chrono>
2121
#include <cstring>
22-
#include <filesystem>
23-
#include <fstream>
22+
#include <filesystem> // NOLINT cpplint: FP, filesystem is a C++17 system header
2423
#include <iostream>
24+
#include <limits>
2525
#include <memory>
2626
#include <string>
2727
#include <unordered_map>

rosbag2_storage_sqlite3/test/rosbag2_storage_sqlite3/storage_test_fixture.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include <cstdio>
2121
#include <cstring>
2222
#include <iostream>
23-
#include <filesystem>
23+
#include <filesystem> // NOLINT cpplint: FP, filesystem is a C++17 system header
2424
#include <fstream>
2525
#include <memory>
2626
#include <string>

rosbag2_storage_sqlite3/test/rosbag2_storage_sqlite3/test_sqlite_storage.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include <gmock/gmock.h>
1616

1717
#include <algorithm>
18-
#include <filesystem>
18+
#include <filesystem> // NOLINT cpplint: FP, filesystem is a C++17 system header
1919
#include <limits>
2020
#include <memory>
2121
#include <string>

rosbag2_test_common/include/rosbag2_test_common/process_execution_helpers_unix.hpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,13 @@ bool wait_until_completion(
116116
// WNOHANG - wait for processes without causing the caller to be blocked
117117
wait_ret_code = waitpid(process_id, &status, WNOHANG);
118118
}
119+
EXPECT_NE(wait_ret_code, 0) << "Testing process " << process_id << " hangout.\n";
119120
EXPECT_NE(wait_ret_code, -1);
120121
EXPECT_EQ(wait_ret_code, process_id) << "status = " << status;
121-
return wait_ret_code != 0;
122+
EXPECT_EQ(WIFEXITED(status), true) << "status = " << status;
123+
EXPECT_EQ(WIFSIGNALED(status), false) << "Process terminated by signal: " << WTERMSIG(status);
124+
EXPECT_EQ(WEXITSTATUS(status), EXIT_SUCCESS) << "status = " << status;
125+
return WIFSIGNALED(status) != true && WEXITSTATUS(status) == EXIT_SUCCESS;
122126
}
123127

124128
/// @brief Force to stop process with signal if it's currently running

rosbag2_tests/test/rosbag2_tests/test_rosbag2_cpp_get_service_info.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
#include <gmock/gmock.h>
1616

17-
#include <atomic>
1817
#include <chrono>
1918
#include <filesystem>
19+
#include <memory>
2020
#include <stdexcept>
2121
#include <string>
22+
#include <utility>
23+
#include <vector>
2224

2325
#include "rosbag2_cpp/info.hpp"
2426
#include "rosbag2_cpp/writer.hpp"

rosbag2_tests/test/rosbag2_tests/test_rosbag2_storage_api.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ class Rosbag2StorageAPITests : public rosbag2_test_common::ParametrizedTemporary
7575
for (size_t msg_idx = 0; msg_idx < num_msgs_per_topic; msg_idx++) {
7676
auto std_string_msg = std::make_shared<std_msgs::msg::String>();
7777
std::stringstream ss;
78-
for (int i = 0; i < 100; i++) {
79-
ss << topic << "_long_long_string_message_" << msg_idx + 1 << "_repeat_";
78+
for (int i = 0; i < 5; i++) {
79+
ss << topic << "_long_string_message_" << msg_idx + 1 << "_repeat_";
8080
}
8181
std_string_msg->data = ss.str();
8282

@@ -133,7 +133,7 @@ TEST_P(Rosbag2StorageAPITests, get_bagfile_size_read_write_interface)
133133
factory.open_read_write(options);
134134

135135
std::vector<std::string> topics = {"topic1_topic1", "topic2_topic2"};
136-
auto serialized_messages = prepare_serialized_messages(topics, 500);
136+
auto serialized_messages = prepare_serialized_messages(topics, 500 * 20);
137137
create_topics(rw_storage, topics);
138138

139139
rw_storage->write(serialized_messages);

rosbag2_transport/src/rosbag2_transport/recorder.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,8 @@ void RecorderImpl::stop_discovery()
456456
std::lock_guard<std::mutex> state_lock(discovery_mutex_);
457457
if (discovery_running_.exchange(false)) {
458458
if (discovery_future_.valid()) {
459-
auto status = discovery_future_.wait_for(2 * record_options_.topic_polling_interval);
459+
auto status = discovery_future_.wait_for(
460+
std::chrono::milliseconds(500) + record_options_.topic_polling_interval);
460461
if (status != std::future_status::ready) {
461462
RCLCPP_ERROR_STREAM(
462463
node->get_logger(),

rosbag2_transport/test/rosbag2_transport/test_play_next.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@ TEST_F(RosBag2PlayTestFixture, play_respect_messages_timing_after_play_next) {
200200
ASSERT_TRUE(player->play_next());
201201
ASSERT_TRUE(player->play_next());
202202
ASSERT_TRUE(player->is_paused());
203-
player->resume();
204203
auto start = std::chrono::steady_clock::now();
204+
player->resume();
205205
player->wait_for_playback_to_finish();
206206
auto replay_time = std::chrono::steady_clock::now() - start;
207207

0 commit comments

Comments
 (0)