@@ -426,6 +426,39 @@ TEST_F(PseudoTerminalTest, ReadBytesWithInvalidNumBytes) {
426426 }, libserial::IOException);
427427}
428428
429+ TEST_F (PseudoTerminalTest, ReadBytesWithReadFail) {
430+ libserial::Serial serial_port;
431+
432+ serial_port.open (slave_port_);
433+ serial_port.setBaudRate (9600 );
434+ serial_port.setCanonicalMode (libserial::CanonicalMode::DISABLE);
435+
436+ auto read_buffer = std::make_shared<std::string>();
437+
438+ for (const auto & [error_num, error_msg] : errors_read_) {
439+ serial_port.setSystemCallFunctions (
440+ [](struct pollfd *, nfds_t , int ) -> int {
441+ return 1 ;
442+ },
443+ [error_num](int , void *, size_t ) -> ssize_t {
444+ errno = error_num;
445+ return -1 ;
446+ });
447+
448+ auto expected_what = " Error reading from serial port: " + error_msg;
449+
450+ EXPECT_THROW ({
451+ try {
452+ serial_port.readBytes (read_buffer, 10 );
453+ }
454+ catch (const libserial::IOException& e) {
455+ EXPECT_STREQ (expected_what.c_str (), e.what ());
456+ throw ;
457+ }
458+ }, libserial::IOException);
459+ }
460+ }
461+
429462TEST_F (PseudoTerminalTest, ReadBytesCanonicalMode) {
430463 libserial::Serial serial_port;
431464
@@ -472,6 +505,25 @@ TEST_F(PseudoTerminalTest, ReadUntil) {
472505 EXPECT_EQ (*read_buffer, " Read Until!" );
473506}
474507
508+ TEST_F (PseudoTerminalTest, ReadUntilWithNullBuffer) {
509+ libserial::Serial serial_port;
510+
511+ serial_port.open (slave_port_);
512+ serial_port.setBaudRate (9600 );
513+
514+ std::shared_ptr<std::string> null_buffer;
515+
516+ EXPECT_THROW ({
517+ try {
518+ serial_port.readUntil (null_buffer, ' !' );
519+ }
520+ catch (const libserial::IOException& e) {
521+ EXPECT_STREQ (" Null pointer passed to readUntil function" , e.what ());
522+ throw ;
523+ }
524+ }, libserial::IOException);
525+ }
526+
475527TEST_F (PseudoTerminalTest, ReadUntilTimeout) {
476528 libserial::Serial serial_port;
477529
@@ -552,3 +604,38 @@ TEST_F(PseudoTerminalTest, ReadUntilWithPollFail) {
552604 }, libserial::IOException);
553605 }
554606}
607+
608+ TEST_F (PseudoTerminalTest, ReadUntilWithOverflowBuffer) {
609+ libserial::Serial serial_port;
610+
611+ serial_port.open (slave_port_);
612+ serial_port.setBaudRate (9600 );
613+ EXPECT_NO_THROW (serial_port.setMaxSafeReadSize (10 )); // Set max safe read size to 10 bytes
614+
615+ std::string test_message (15 , ' a' );
616+ test_message.push_back (' \n ' );
617+
618+ ssize_t bytes_written = write (master_fd_, test_message.c_str (), test_message.length ());
619+ ASSERT_GT (bytes_written, 0 ) << " Failed to write to master end" ;
620+
621+ // Give time for data to propagate
622+ fsync (master_fd_);
623+ std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
624+
625+ // Test reading with shared pointer - only read what's available
626+ auto read_buffer = std::make_shared<std::string>();
627+
628+ auto expected_what = " Read buffer exceeded maximum size limit of " +
629+ std::to_string (serial_port.getMaxSafeReadSize ()) +
630+ " bytes without finding terminator" ;
631+
632+ EXPECT_THROW ({
633+ try {
634+ serial_port.readUntil (read_buffer, ' !' );
635+ }
636+ catch (const libserial::IOException& e) {
637+ EXPECT_STREQ (expected_what.c_str (), e.what ());
638+ throw ;
639+ }
640+ }, libserial::IOException);
641+ }
0 commit comments