|
37 | 37 |
|
38 | 38 | #include "mock_compression_factory.hpp"
|
39 | 39 |
|
| 40 | +#ifdef _WIN32 |
| 41 | +#include <windows.h> |
| 42 | +#else |
| 43 | +#include <unistd.h> |
| 44 | +#include <sys/resource.h> |
| 45 | +#endif |
| 46 | + |
40 | 47 | using namespace testing; // NOLINT
|
41 | 48 |
|
42 | 49 | static constexpr const char * DefaultTestCompressor = "fake_comp";
|
@@ -394,6 +401,100 @@ TEST_P(SequentialCompressionWriterTest, writer_writes_with_compression_queue_siz
|
394 | 401 | EXPECT_EQ(fake_storage_size_, kNumMessagesToWrite);
|
395 | 402 | }
|
396 | 403 |
|
| 404 | + |
| 405 | +TEST_P(SequentialCompressionWriterTest, writer_sets_nice_value) |
| 406 | +{ |
| 407 | + const std::string test_topic_name = "test_topic"; |
| 408 | + const std::string test_topic_type = "test_msgs/BasicTypes"; |
| 409 | + const uint64_t kCompressionQueueSize = GetParam(); |
| 410 | + const int wanted_nice_value = 10; |
| 411 | + |
| 412 | + class TestCompressor : public rosbag2_compression::BaseCompressorInterface |
| 413 | + { |
| 414 | + int & detected_nice_value; |
| 415 | + |
| 416 | +public: |
| 417 | + TestCompressor(int & detected_nice_value) |
| 418 | + : detected_nice_value(detected_nice_value) {} |
| 419 | + virtual std::string compress_uri(const std::string & uri) |
| 420 | + { |
| 421 | + return uri; |
| 422 | + } |
| 423 | + |
| 424 | + virtual void compress_serialized_bag_message( |
| 425 | + const rosbag2_storage::SerializedBagMessage * bag_message, |
| 426 | + rosbag2_storage::SerializedBagMessage * compressed_message) |
| 427 | + { |
| 428 | +#ifdef _WIN32 |
| 429 | + int cur_nice_value = getpriority(PRIO_PROCESS, 0); |
| 430 | + if (cur_nice_value != -1 && errno == 0) { |
| 431 | + |
| 432 | + detected_nice_value = cur_nice_value; |
| 433 | + } |
| 434 | +#else |
| 435 | + //FIXME implement windows version |
| 436 | +#endif |
| 437 | + |
| 438 | + *compressed_message = *bag_message; |
| 439 | + } |
| 440 | + |
| 441 | + /** |
| 442 | + * Get the identifier of the compression algorithm. |
| 443 | + * This is appended to the extension of the compressed file. |
| 444 | + */ |
| 445 | + virtual std::string get_compression_identifier() const |
| 446 | + { |
| 447 | + return "niceTest"; |
| 448 | + } |
| 449 | + }; |
| 450 | + |
| 451 | + class FakeFactory : public rosbag2_compression::CompressionFactory |
| 452 | + { |
| 453 | + int & detected_nice_value; |
| 454 | + |
| 455 | +public: |
| 456 | + FakeFactory(int & detected_nice_value) |
| 457 | + : detected_nice_value(detected_nice_value) {} |
| 458 | + |
| 459 | + virtual std::shared_ptr<rosbag2_compression::BaseCompressorInterface> |
| 460 | + create_compressor(const std::string & /*compression_format*/) |
| 461 | + { |
| 462 | + return std::make_shared<TestCompressor>(detected_nice_value); |
| 463 | + } |
| 464 | + }; |
| 465 | + |
| 466 | + // queue size should be 0 or at least the number of remaining messages to prevent message loss |
| 467 | + rosbag2_compression::CompressionOptions compression_options { |
| 468 | + DefaultTestCompressor, |
| 469 | + rosbag2_compression::CompressionMode::MESSAGE, |
| 470 | + kCompressionQueueSize, |
| 471 | + kDefaultCompressionQueueThreads, |
| 472 | + wanted_nice_value |
| 473 | + }; |
| 474 | + |
| 475 | + // nice values are in the range from -20 to +19, so this value will never be read |
| 476 | + int detected_nice_value = 100; |
| 477 | + |
| 478 | + initializeFakeFileStorage(); |
| 479 | + initializeWriter(compression_options, std::make_unique<FakeFactory>(detected_nice_value)); |
| 480 | + |
| 481 | + writer_->open(tmp_dir_storage_options_); |
| 482 | + writer_->create_topic({test_topic_name, test_topic_type, "", "", ""}); |
| 483 | + |
| 484 | + auto message = std::make_shared<rosbag2_storage::SerializedBagMessage>(); |
| 485 | + message->topic_name = test_topic_name; |
| 486 | + |
| 487 | + const size_t kNumMessagesToWrite = 5; |
| 488 | + for (size_t i = 0; i < kNumMessagesToWrite; i++) { |
| 489 | + writer_->write(message); |
| 490 | + } |
| 491 | + writer_.reset(); // reset will call writer destructor |
| 492 | + |
| 493 | + EXPECT_EQ(detected_nice_value, *compression_options.thread_nice_value); |
| 494 | + |
| 495 | + EXPECT_EQ(fake_storage_size_, kNumMessagesToWrite); |
| 496 | +} |
| 497 | + |
397 | 498 | INSTANTIATE_TEST_SUITE_P(
|
398 | 499 | SequentialCompressionWriterTestQueueSizes,
|
399 | 500 | SequentialCompressionWriterTest,
|
|
0 commit comments