Skip to content

Commit 160643e

Browse files
committed
best plans etc. forgot to include test folder.
1 parent 6b560d3 commit 160643e

File tree

2 files changed

+188
-0
lines changed

2 files changed

+188
-0
lines changed

test/test_comms.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#include "um7/comms.h"
2+
#include "um7/registers.h"
3+
#include "serial/serial.h"
4+
#include <gtest/gtest.h>
5+
#include <fcntl.h>
6+
7+
class FakeSerial : public ::testing::Test {
8+
protected:
9+
/**
10+
* What's going on here? The posix_openpt() call establishes a pseudo terminal
11+
* and gives us a fd for the other end of it. So we can connect up a Serial
12+
* instance to the pty, and have full control over reading-from and writing-to
13+
* the driver.
14+
*/
15+
virtual void SetUp() {
16+
ASSERT_NE(-1, master_fd = posix_openpt( O_RDWR | O_NOCTTY | O_NDELAY ));
17+
ASSERT_NE(-1, grantpt(master_fd));
18+
ASSERT_NE(-1, unlockpt(master_fd));
19+
ASSERT_TRUE((ser_name = ptsname(master_fd)) != NULL);
20+
ser.setPort(ser_name);
21+
ser.open();
22+
ASSERT_TRUE(ser.isOpen()) << "Couldn't open Serial connection to pseudoterminal.";
23+
}
24+
25+
void write_serial(const std::string& msg) {
26+
write(master_fd, msg.c_str(), msg.length());
27+
}
28+
29+
virtual void TearDown() {
30+
ser.close();
31+
close(master_fd);
32+
}
33+
34+
serial::Serial ser;
35+
36+
private:
37+
int master_fd;
38+
char* ser_name;
39+
};
40+
41+
TEST_F(FakeSerial, basic_message_rx) {
42+
// Send message from device which should write four bytes to the raw magnetometer's first register.
43+
std::string msg(um7::Comms::message(DREG_MAG_RAW_XY, std::string("\x1\x2\x3\x4")));
44+
write_serial(msg);
45+
46+
um7::Comms sensor(&ser);
47+
um7::Registers registers;
48+
ASSERT_EQ(DREG_MAG_RAW_XY, sensor.receive(&registers)) << "Didn't return ID of arriving message.";
49+
EXPECT_EQ(0x0102, registers.mag_raw.get(0));
50+
}
51+
52+
TEST_F(FakeSerial, batch_message_rx) {
53+
// Send message from device which should write four bytes to the raw accelerometer's registers.
54+
std::string msg(um7::Comms::message(DREG_ACCEL_RAW_XY, std::string("\x5\x6\x7\x8\x9\xa\0\0", 8)));
55+
write_serial(msg);
56+
57+
um7::Comms sensor(&ser);
58+
um7::Registers registers;
59+
ASSERT_EQ(DREG_ACCEL_RAW_XY, sensor.receive(&registers)) << "Didn't return ID of arriving message.";
60+
EXPECT_EQ(0x0506, registers.accel_raw.get(0));
61+
EXPECT_EQ(0x0708, registers.accel_raw.get(1));
62+
EXPECT_EQ(0x090a, registers.accel_raw.get(2));
63+
}
64+
65+
TEST_F(FakeSerial, bad_checksum_message_rx) {
66+
// Generate message, then twiddle final byte.
67+
std::string msg(um7::Comms::message(DREG_MAG_RAW_XY, std::string("\x1\x2\x3\x4")));
68+
msg[msg.length() - 1]++;
69+
write_serial(msg);
70+
71+
um7::Comms sensor(&ser);
72+
um7::Registers registers;
73+
EXPECT_EQ(-1, sensor.receive(&registers)) << "Didn't properly ignore bad checksum message.";
74+
}
75+
76+
TEST_F(FakeSerial, garbage_bytes_preceeding_message_rx) {
77+
// Generate message, then prepend junk.
78+
std::string msg(um7::Comms::message(CONFIG_REG_START_ADDRESS, std::string()));
79+
msg = "ssssssnsnsns" + msg;
80+
write_serial(msg);
81+
82+
um7::Comms sensor(&ser);
83+
EXPECT_EQ(CONFIG_REG_START_ADDRESS, sensor.receive(NULL)) << "Didn't handle garbage prepended to message.";
84+
}
85+
86+
TEST_F(FakeSerial, timeout_message_rx) {
87+
std::string msg("snp\x12\x45");
88+
write_serial(msg);
89+
um7::Comms sensor(&ser);
90+
EXPECT_EQ(-1, sensor.receive(NULL)) << "Didn't properly time out in the face of a partial message.";
91+
}
92+
93+
int main(int argc, char **argv){
94+
testing::InitGoogleTest(&argc, argv);
95+
return RUN_ALL_TESTS();
96+
}

test/test_registers.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#include "um7/registers.h"
2+
#include <gtest/gtest.h>
3+
4+
#include <arpa/inet.h>
5+
6+
7+
TEST(ByteOrder, compare_with_htons)
8+
{
9+
// Arbitrary, just try a selection of values.
10+
for(uint16_t host_num = 0; host_num < 50000; host_num += 71) {
11+
uint16_t net_num = htons(host_num);
12+
uint16_t memcpy_num = 0;
13+
um7::memcpy_network(&memcpy_num, &host_num, sizeof(host_num));
14+
EXPECT_EQ(memcpy_num, net_num);
15+
}
16+
}
17+
18+
TEST(ByteOrder, compare_with_htonl)
19+
{
20+
for(uint32_t host_num = 0; host_num < 4000000000; host_num += 1299827) {
21+
uint32_t net_num = htonl(host_num);
22+
uint32_t memcpy_num = 0;
23+
um7::memcpy_network(&memcpy_num, &host_num, sizeof(host_num));
24+
EXPECT_EQ(memcpy_num, net_num);
25+
}
26+
}
27+
28+
TEST(Accessor, basic_int)
29+
{
30+
um7::Registers r;
31+
r.write_raw(5, "\x01\x02\x03\x04\x05\x06");
32+
33+
um7::Accessor<uint16_t> u16(&r, 5, 3);
34+
EXPECT_EQ(0x0102, u16.get(0));
35+
EXPECT_EQ(0x0304, u16.get(1));
36+
EXPECT_EQ(0x0506, u16.get(2));
37+
38+
um7::Accessor<uint16_t> u16n(&r, 6, 1);
39+
EXPECT_EQ(0x0506, u16n.get(0));
40+
41+
um7::Accessor<uint32_t> u32(&r, 5, 3);
42+
EXPECT_EQ(0x01020304, u32.get(0));
43+
}
44+
45+
TEST(Accessor, basic_float)
46+
{
47+
um7::Registers r;
48+
r.write_raw(10, "\x01\x02\x03\x04\x05\x06\x07\x08");
49+
50+
um7::Accessor<float> f(&r, 10, 2);
51+
union {
52+
float val;
53+
uint32_t bytes;
54+
};
55+
bytes = 0x01020304;
56+
EXPECT_FLOAT_EQ(val, f.get(0));
57+
bytes = 0x05060708;
58+
EXPECT_FLOAT_EQ(val, f.get(1));
59+
}
60+
61+
TEST(Accessor, scaled_int)
62+
{
63+
um7::Registers r;
64+
r.write_raw(11, "\x01\x02\x03\x04");
65+
66+
const float scale(0.001);
67+
um7::Accessor<int16_t> i16(&r, 11, 2, scale);
68+
EXPECT_FLOAT_EQ(scale * 0x0102, i16.get_scaled(0));
69+
EXPECT_FLOAT_EQ(scale * 0x0304, i16.get_scaled(1));
70+
}
71+
72+
TEST(Accessor, set_float)
73+
{
74+
um7::Registers r;
75+
r.mag_bias.set(0, 0.123);
76+
r.mag_bias.set_scaled(1, 0.987);
77+
r.mag_bias.set_scaled(2, 0.555);
78+
79+
float check;
80+
um7::memcpy_network(&check, (float*)r.mag_bias.raw(), 4);
81+
EXPECT_FLOAT_EQ(0.123, check);
82+
um7::memcpy_network(&check, (float*)r.mag_bias.raw() + 1, 4);
83+
EXPECT_FLOAT_EQ(0.987, check);
84+
um7::memcpy_network(&check, (float*)r.mag_bias.raw() + 2, 4);
85+
EXPECT_FLOAT_EQ(0.555, check);
86+
}
87+
88+
int main(int argc, char **argv){
89+
testing::InitGoogleTest(&argc, argv);
90+
return RUN_ALL_TESTS();
91+
}
92+

0 commit comments

Comments
 (0)