diff --git a/tests/serial_tests.cc b/tests/serial_tests.cc index 6a5a0c5..a416f49 100644 --- a/tests/serial_tests.cc +++ b/tests/serial_tests.cc @@ -3,39 +3,57 @@ * * Alternatively you could use an Arduino: - void setup() - { - Serial.begin(115200); - } +void setup() +{ + Serial.begin(115200); +} - void loop() - { - while (Serial.available() > 0) { - Serial.write(Serial.read()); - } +void loop() +{ + while (Serial.available() > 0) { + Serial.write(Serial.read()); } +} - */ - -#define SERIAL_PORT_NAME "/dev/tty.usbserial" +*/ +#include #include "gtest/gtest.h" #include -// OMG this is so nasty... -#define private public -#define protected public +// Use FRIEND_TEST... its not as nasty, thats what friends are for +// // OMG this is so nasty... +// #define private public +// #define protected public #include "serial/serial.h" + +#ifdef __linux__ +#include +#else +#include +#endif + using namespace serial; +using std::string; + namespace { class SerialTests : public ::testing::Test { protected: virtual void SetUp() { - port1 = new Serial(SERIAL_PORT_NAME, 115200, 250); + if (openpty(&master_fd, &slave_fd, name, NULL, NULL) == -1) { + perror("openpty"); + exit(127); + } + + ASSERT_TRUE(master_fd > 0); + ASSERT_TRUE(slave_fd > 0); + ASSERT_TRUE(string(name).length() > 0); + + port1 = new Serial(string(name), 115200, 250); } virtual void TearDown() { @@ -44,12 +62,48 @@ protected: } Serial * port1; - + int master_fd; + int slave_fd; + char name[100]; }; -// TEST_F(SerialTests, throwsOnInvalidPort) { -// -// } +TEST_F(SerialTests, readWorks) { + write(master_fd, "abc\n", 4); + string r = port1->read(4); + EXPECT_EQ(r, string("abc\n")); +} + +TEST_F(SerialTests, writeWorks) { + char buf[5] = ""; + port1->write("abc\n"); + read(master_fd, buf, 4); + EXPECT_EQ(string(buf, 4), string("abc\n")); +} + +TEST_F(SerialTests, timeoutWorks) { + // Timeout a read, returns an empty string + string empty = port1->read(); + EXPECT_EQ(empty, string("")); + + // Ensure that writing/reading still works after a timeout. + write(master_fd, "abc\n", 4); + string r = port1->read(4); + EXPECT_EQ(r, string("abc\n")); +} + +TEST_F(SerialTests, partialRead) { + // Write some data, but request more than was written. + write(master_fd, "abc\n", 4); + + // Should timeout, but return what was in the buffer. + string empty = port1->read(10); + EXPECT_EQ(empty, string("abc\n")); + + // Ensure that writing/reading still works after a timeout. + write(master_fd, "abc\n", 4); + string r = port1->read(4); + EXPECT_EQ(r, string("abc\n")); +} } // namespace