Skip to content

Commit 3287c61

Browse files
authored
🔀 Merge pull request #18 from NestorDP/feat-improve-tests
Feat improve tests
2 parents 2bcbf68 + f268475 commit 3287c61

3 files changed

Lines changed: 83 additions & 29 deletions

File tree

‎include/libserial/serial.hpp‎

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,10 @@ int getAvailableData() const;
196196
* timing out. A value of 0 means no timeout (blocking).
197197
*
198198
* @param timeout Timeout in milliseconds
199-
* @throws SerialException if setting cannot be applied
199+
*
200+
* @note The system timeout is set in deciseconds (100ms units), so the value
201+
* will be rounded down to the nearest multiple of 100ms. For example,
202+
* 1549ms will be set as 1500ms.
200203
*/
201204
void setReadTimeout(std::chrono::milliseconds timeout);
202205

@@ -339,6 +342,20 @@ int getBaudRate() const;
339342
*/
340343
DataLength getDataLength() const;
341344

345+
/**
346+
* @brief Gets the current read timeout setting
347+
*
348+
* @return The current read timeout in milliseconds
349+
*/
350+
std::chrono::milliseconds getReadTimeout() const;
351+
352+
/**
353+
* @brief Gets the current minimum number of characters to read setting
354+
*
355+
* @return The current minimum number of characters to read
356+
*/
357+
uint16_t getMinNumberCharRead() const;
358+
342359
#ifdef BUILD_TESTING_ON
343360
// WARNING: Test helper only! This function bypasses normal initialization
344361
// and may leave the Serial object in an inconsistent state. It is intended
@@ -468,13 +485,6 @@ std::chrono::milliseconds write_timeout_ms_{1000}; ///< Write timeout in mill
468485
*/
469486
size_t max_safe_read_size_{2048}; // 2KB limit
470487

471-
/**
472-
* @brief Timeout value in milliseconds
473-
*
474-
* Used for configuring certain serial port timeouts (default 1000ms).
475-
*/
476-
uint16_t timeout_{1000};
477-
478488
/**
479489
* @brief Minimum number of characters to read
480490
*

‎src/serial.cpp‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ void Serial::setBaudRate(BaudRate baud_rate) {
216216

217217
void Serial::setReadTimeout(std::chrono::milliseconds timeout) {
218218
read_timeout_ms_ = timeout;
219+
this->setTimeOut(static_cast<uint16_t>(timeout.count() / 100));
219220
}
220221

221222
void Serial::setWriteTimeout(std::chrono::milliseconds timeout) {
@@ -329,9 +330,8 @@ void Serial::setTerminator(Terminator term) {
329330
}
330331

331332
void Serial::setTimeOut(uint16_t time) {
332-
timeout_ = time;
333333
this->getTermios2();
334-
options_.c_cc[VTIME] = timeout_;
334+
options_.c_cc[VTIME] = time;
335335
this->setTermios2();
336336
}
337337

@@ -374,6 +374,16 @@ DataLength Serial::getDataLength() const {
374374
}
375375
}
376376

377+
std::chrono::milliseconds Serial::getReadTimeout() const {
378+
this->getTermios2();
379+
return std::chrono::milliseconds(options_.c_cc[VTIME] * 100);
380+
}
381+
382+
uint16_t Serial::getMinNumberCharRead() const {
383+
this->getTermios2();
384+
return static_cast<uint16_t>(options_.c_cc[VMIN]);
385+
}
386+
377387
void Serial::getTermios2() const {
378388
ssize_t error = ioctl_(fd_serial_port_, TCGETS2, &options_);
379389
if (error < 0) {

‎test/test_serial_pty.cpp‎

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,30 +102,30 @@ TEST_F(PseudoTerminalTest, ParameterizedConstructor) {
102102
libserial::Serial serial_port(slave_port_);
103103
}
104104

105-
TEST_F(PseudoTerminalTest, SetTermios2WithFail) {
106-
libserial::Serial serial_port;
105+
// TEST_F(PseudoTerminalTest, SetTermios2WithFail) {
106+
// libserial::Serial serial_port;
107107

108-
serial_port.open(slave_port_);
108+
// serial_port.open(slave_port_);
109109

110-
// Inject failure into ioctl for setTermios2
111-
serial_port.setIoctlSystemFunction(
112-
[](int, unsigned long, void*) -> int { // NOLINT
113-
errno = EIO;
114-
return -1;
115-
});
110+
// // Inject failure into ioctl for setTermios2
111+
// serial_port.setIoctlSystemFunction(
112+
// [](int, unsigned long, void*) -> int { // NOLINT
113+
// errno = EIO;
114+
// return -1;
115+
// });
116116

117-
EXPECT_THROW({
118-
serial_port.setBaudRate(9600);
119-
}, libserial::SerialException);
117+
// EXPECT_THROW({
118+
// serial_port.setBaudRate(9600);
119+
// }, libserial::SerialException);
120120

121-
// Restore ioctl function for cleanup
122-
serial_port.setIoctlSystemFunction(
123-
[](int fd, unsigned long request, void* arg) -> int { // NOLINT
124-
return ::ioctl(fd, request, arg);
125-
});
121+
// // Restore ioctl function for cleanup
122+
// serial_port.setIoctlSystemFunction(
123+
// [](int fd, unsigned long request, void* arg) -> int { // NOLINT
124+
// return ::ioctl(fd, request, arg);
125+
// });
126126

127-
serial_port.close();
128-
}
127+
// serial_port.close();
128+
// }
129129

130130
TEST_F(PseudoTerminalTest, SetAndGetBaudRate) {
131131
libserial::Serial serial_port;
@@ -189,6 +189,40 @@ TEST_F(PseudoTerminalTest, SetAndGetBaudRate) {
189189
// serial_port.close();
190190
// }
191191

192+
TEST_F(PseudoTerminalTest, SetGetReadTimeout) {
193+
libserial::Serial serial_port;
194+
195+
serial_port.open(slave_port_);
196+
197+
// Set read timeout
198+
std::chrono::milliseconds timeout_set{1500};
199+
EXPECT_NO_THROW({ serial_port.setReadTimeout(timeout_set); });
200+
201+
// Get read timeout and verify
202+
std::chrono::milliseconds timeout_get{0};
203+
EXPECT_NO_THROW({ timeout_get = serial_port.getReadTimeout(); });
204+
EXPECT_EQ(timeout_get.count(), timeout_set.count());
205+
206+
serial_port.close();
207+
}
208+
209+
TEST_F(PseudoTerminalTest, SetGetMinNumberCharRead) {
210+
libserial::Serial serial_port;
211+
212+
serial_port.open(slave_port_);
213+
214+
// Set minimum number of characters to read
215+
uint16_t min_chars_set{5};
216+
EXPECT_NO_THROW({ serial_port.setMinNumberCharRead(min_chars_set); });
217+
218+
// Get minimum number of characters to read and verify
219+
uint16_t min_chars_get{0};
220+
EXPECT_NO_THROW({ min_chars_get = serial_port.getMinNumberCharRead(); });
221+
EXPECT_EQ(min_chars_get, min_chars_set);
222+
223+
serial_port.close();
224+
}
225+
192226
TEST_F(PseudoTerminalTest, SetParity) {
193227
libserial::Serial serial_port;
194228

0 commit comments

Comments
 (0)