Skip to content

Commit 93881c8

Browse files
committed
Merge pull request #17 from frznlogic/master
Adding several serial functions and unit tests for all print and println functions Conflicts: test/Makefile
2 parents 58970e2 + 774d303 commit 93881c8

File tree

7 files changed

+399
-10
lines changed

7 files changed

+399
-10
lines changed

include/arduino-mock/serial.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ class SerialMock {
3636

3737
MOCK_METHOD1(begin, uint8_t(uint16_t));
3838

39+
MOCK_METHOD0(available, uint8_t());
40+
MOCK_METHOD0(read, uint8_t());
41+
3942
MOCK_METHOD0(flush, void());
4043

4144
/* Not implemented yet
@@ -68,17 +71,21 @@ class Serial_ {
6871
static size_t println(double, int = 2);
6972
static size_t println(void);
7073

71-
uint8_t begin(uint16_t);
74+
size_t write(uint8_t);
75+
size_t write(const char *str);
76+
size_t write(const uint8_t *buffer, size_t size);
77+
78+
uint8_t begin(uint32_t);
79+
80+
uint8_t available();
81+
uint8_t read();
7282

7383
static void flush();
7484

7585
/*
7686
TODO: Not implemented yet.
7787
int getWriteError();
7888
void clearWriteError();
79-
size_t write(uint8_t);
80-
size_t write(const char *str);
81-
size_t write(const uint8_t *buffer, size_t size);
8289
static size_t print(const __FlashStringHelper *);
8390
static size_t print(const String &);
8491
static size_t print(const Printable&);
@@ -91,4 +98,5 @@ class Serial_ {
9198
SerialMock* serialMockInstance();
9299
void releaseSerialMock();
93100

101+
94102
#endif // SERIAL_H

include/arduino-mock/serialHelper.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* serialHelper - helper functions for unittesting serial functions.
3+
*
4+
*/
5+
#ifndef SERIALHELPER_H
6+
#define SERIALHELPER_H
7+
8+
#include <stdint.h>
9+
#include <string>
10+
#include <sstream>
11+
12+
/*
13+
* stringCapture
14+
* This is a helper class which can be Invoked on EXPECT_CALL to gather data
15+
* from repeated calls to Serial functions. For example usage, see the unit
16+
* tests in test/serial_unittest.cc
17+
*
18+
* Example usage:
19+
*
20+
* EXPECT_CALL(*sm, write(Matcher<const uint8_t*>(_), (_)))
21+
* .Times(AtLeast(1))
22+
* .WillRepeatedly(Invoke(&c, &stringCapture::captureCStr));
23+
*
24+
*/
25+
class stringCapture {
26+
public:
27+
stringCapture();
28+
bool captureUInt8(uint8_t c);
29+
bool captureUInt16(uint16_t c);
30+
bool captureCStr(const uint8_t *buffer, size_t size);
31+
void clear();
32+
std::string get();
33+
34+
private:
35+
std::stringstream d;
36+
};
37+
38+
39+
#endif // SERIALHELPER_H

src/serial.cc

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,30 @@ size_t Serial_::println(void) {
8585
return gSerialMock->println();
8686
}
8787

88-
uint8_t Serial_::begin(uint16_t port) {
88+
size_t Serial_::write(uint8_t val) {
89+
return gSerialMock->write(val);
90+
}
91+
92+
size_t Serial_::write(const char *str) {
93+
return gSerialMock->write(str);
94+
}
95+
96+
size_t Serial_::write(const uint8_t *buffer, size_t size) {
97+
return gSerialMock->write(buffer, size);
98+
}
99+
100+
uint8_t Serial_::begin(uint32_t port) {
89101
return gSerialMock->begin(port);
90102
}
91103

92104
void Serial_::flush() {
93105
return gSerialMock->flush();
94106
}
107+
108+
uint8_t Serial_::available() {
109+
return gSerialMock->available();
110+
}
111+
112+
uint8_t Serial_::read() {
113+
return gSerialMock->read();
114+
}

src/serialHelper.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "arduino-mock/serialHelper.h"
2+
3+
stringCapture::stringCapture()
4+
: d() {
5+
}
6+
7+
bool stringCapture::captureUInt16(uint16_t c) {
8+
d << c;
9+
return true;
10+
}
11+
12+
bool stringCapture::captureUInt8(uint8_t c) {
13+
d << c;
14+
return true;
15+
}
16+
17+
bool stringCapture::captureCStr(const uint8_t *buffer, size_t size) {
18+
d << std::string((const char*)buffer, size);
19+
return true;
20+
}
21+
22+
void stringCapture::clear() {
23+
return d.str("");
24+
}
25+
26+
std::string stringCapture::get() {
27+
return d.str();
28+
}
29+

test/Makefile

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ CXXFLAGS += -g -Wall -Wextra -pthread \
4545

4646
# All tests produced by this Makefile. Remember to add new tests you
4747
# created to the list.
48-
TESTS = arduino_unittest wire_unittest serial_unittest spark_unittest eeprom_unittest wifi_unittest
48+
TESTS = arduino_unittest wire_unittest serial_unittest spark_unittest eeprom_unittest wifi_unittest serialHelper_unittest
4949

5050
# All Google Test headers. Usually you shouldn't change this
5151
# definition.
@@ -103,7 +103,7 @@ gmock_main.a : gmock-all.o gtest-all.o gmock_main.o
103103
$(AR) $(ARFLAGS) $@ $^
104104

105105
# Builds Arduino mocks.
106-
arduino_mock_all.a : arduino.o serial.o spark.o eeprom.o wire.o wifi.o
106+
arduino_mock_all.a : arduino.o serial.o serialHelper.o spark.o eeprom.o wire.o wifi.o
107107
$(AR) $(ARFLAGS) $@ $^
108108

109109
arduino.o : $(ARDUINO_MOCK_DIR)/include/arduino-mock/arduino.h \
@@ -116,6 +116,11 @@ serial.o : $(ARDUINO_MOCK_DIR)/include/arduino-mock/serial.h \
116116
$(CXX) $(CPPFLAGS) -I$(ARDUINO_MOCK_DIR) $(CXXFLAGS) -c \
117117
$(ARDUINO_MOCK_DIR)/src/serial.cc
118118

119+
serialHelper.o : $(ARDUINO_MOCK_DIR)/include/arduino-mock/serialHelper.h \
120+
$(ARDUINO_MOCK_DIR)/src/serialHelper.cc
121+
$(CXX) $(CPPFLAGS) -I$(ARDUINO_MOCK_DIR) $(CXXFLAGS) -c \
122+
$(ARDUINO_MOCK_DIR)/src/serialHelper.cc
123+
119124
spark.o : $(ARDUINO_MOCK_DIR)/include/arduino-mock/spark.h \
120125
$(ARDUINO_MOCK_DIR)/src/spark.cc
121126
$(CXX) $(CPPFLAGS) -I$(ARDUINO_MOCK_DIR) $(CXXFLAGS) -c \
@@ -148,6 +153,15 @@ serial_unittest : serial_unittest.o \
148153
arduino_mock_all.a
149154
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
150155

156+
serialHelper_unittest.o : $(TEST_DIR)/serialHelper_unittest.cc \
157+
$(GTEST_HEADERS)
158+
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(TEST_DIR)/serialHelper_unittest.cc
159+
160+
serialHelper_unittest : serialHelper_unittest.o \
161+
gmock_main.a \
162+
arduino_mock_all.a
163+
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
164+
151165
spark_unittest.o : $(TEST_DIR)/spark_unittest.cc \
152166
$(GTEST_HEADERS)
153167
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(TEST_DIR)/spark_unittest.cc

test/serialHelper_unittest.cc

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include "gtest/gtest.h"
2+
#include "arduino-mock/arduino.h"
3+
#include "arduino-mock/serial.h"
4+
5+
#include "arduino-mock/serialHelper.h"
6+
7+
Serial_ Serial;
8+
9+
using ::testing::_;
10+
using ::testing::Return;
11+
using ::testing::Matcher;
12+
using ::testing::AtLeast;
13+
using ::testing::Invoke;
14+
15+
16+
TEST(serial, stringCapture1) {
17+
// Insert char first time
18+
SerialMock* serialMock = serialMockInstance();
19+
stringCapture c;
20+
21+
testing::DefaultValue<uint8_t>::Set(1);
22+
EXPECT_CALL(*serialMock, write(Matcher<uint8_t>(_)))
23+
.WillRepeatedly(Invoke(&c, &stringCapture::captureUInt8));
24+
EXPECT_EQ(1, Serial.write('a'));
25+
26+
EXPECT_EQ(c.get(), std::string("a"));
27+
28+
// Clear data
29+
c.clear();
30+
31+
EXPECT_EQ(c.get(), std::string(""));
32+
33+
// Insert new char
34+
EXPECT_CALL(*serialMock, write(Matcher<uint8_t>(_)))
35+
.WillRepeatedly(Invoke(&c, &stringCapture::captureUInt8));
36+
EXPECT_EQ(1, Serial.write('b'));
37+
38+
EXPECT_EQ(c.get(), std::string("b"));
39+
40+
releaseSerialMock();
41+
}
42+
43+
44+
TEST(serial, stringCapture2) {
45+
// Insert char first time
46+
SerialMock* serialMock = serialMockInstance();
47+
stringCapture c;
48+
49+
testing::DefaultValue<uint8_t>::Set(5);
50+
EXPECT_CALL(*serialMock, write(Matcher<const uint8_t *>(_), Matcher<size_t>(_)))
51+
.WillRepeatedly(Invoke(&c, &stringCapture::captureCStr));
52+
EXPECT_EQ(1, Serial.write((const uint8_t*)"abcde", 5));
53+
54+
EXPECT_EQ(c.get(), std::string("abcde"));
55+
56+
}
57+
58+
59+
TEST(serial, stringCapture3) {
60+
// Insert char first time
61+
SerialMock* serialMock = serialMockInstance();
62+
stringCapture c;
63+
64+
testing::DefaultValue<uint8_t>::Set(1);
65+
EXPECT_CALL(*serialMock, write(Matcher<uint8_t>(_)))
66+
.WillRepeatedly(Invoke(&c, &stringCapture::captureUInt8));
67+
EXPECT_EQ(1, Serial.write('a'));
68+
69+
EXPECT_EQ(c.get(), std::string("a"));
70+
71+
// Insert new char
72+
EXPECT_CALL(*serialMock, write(Matcher<uint8_t>(_)))
73+
.WillRepeatedly(Invoke(&c, &stringCapture::captureUInt8));
74+
EXPECT_EQ(1, Serial.write('b'));
75+
76+
EXPECT_EQ(c.get(), std::string("ab"));
77+
78+
releaseSerialMock();
79+
}

0 commit comments

Comments
 (0)