1 #include <msp/net/protocol.h>
2 #include <msp/test/test.h>
7 class ProtocolTests: public Test::RegisteredTest<ProtocolTests>
12 static const char *get_name() { return "Protocol"; }
16 void buffer_overflow();
17 void truncated_packet();
21 void transmit(const P &, P &, size_t);
24 void transmit_string();
25 void transmit_array();
26 void transmit_composite();
30 class Protocol: public Msp::Net::Protocol
48 std::vector<uint32_t> values;
54 std::vector<Packet3> sub2;
59 add<Packet1>()(&Packet1::value);
60 add<Packet2>()(&Packet2::value);
61 add<Packet3>()(&Packet3::values);
62 add<Packet4>()(&Packet4::sub1)(&Packet4::sub2);
66 class Receiver: public Net::PacketReceiver<T>
72 Receiver(T &s): storage(s) { }
74 void receive(const T &p) override { storage = p; }
78 ProtocolTests::ProtocolTests()
80 add(&ProtocolTests::hash_match, "Hash match");
81 add(&ProtocolTests::buffer_overflow, "Serialization buffer overflow").expect_throw<Net::buffer_error>();
82 add(&ProtocolTests::truncated_packet, "Truncated packet").expect_throw<Net::bad_packet>();
83 add(&ProtocolTests::stub_header, "Stub header");
84 add(&ProtocolTests::transmit_int, "Integer transmission");
85 add(&ProtocolTests::transmit_string, "String transmission");
86 add(&ProtocolTests::transmit_array, "Array transmission");
87 add(&ProtocolTests::transmit_composite, "Composite transmission");
90 void ProtocolTests::hash_match()
94 EXPECT_EQUAL(proto1.get_hash(), proto2.get_hash());
97 void ProtocolTests::buffer_overflow()
100 Packet1 pkt = { 42 };
102 proto.serialize(pkt, buffer, sizeof(buffer));
105 void ProtocolTests::truncated_packet()
108 Packet1 pkt = { 42 };
110 size_t len = proto.serialize(pkt, buffer, sizeof(buffer));
111 Receiver<Packet1> recv(pkt);
112 proto.dispatch(recv, buffer, len-1);
115 void ProtocolTests::stub_header()
118 char buffer[3] = { 4, 0, 1 };
119 size_t len = proto.get_packet_size(buffer, sizeof(buffer));
120 EXPECT_EQUAL(len, 0);
124 void ProtocolTests::transmit(const P &pkt, P &rpkt, size_t expected_length)
128 size_t len = proto.serialize(pkt, buffer, sizeof(buffer));
129 EXPECT_EQUAL(len, expected_length);
131 size_t rlen = proto.get_packet_size(buffer, sizeof(buffer));
132 EXPECT_EQUAL(rlen, len);
134 Receiver<P> recv(rpkt);
135 size_t dlen = proto.dispatch(recv, buffer, sizeof(buffer));
136 EXPECT_EQUAL(dlen, len);
139 void ProtocolTests::transmit_int()
141 Packet1 pkt = { 42 };
143 transmit(pkt, rpkt, 8);
144 EXPECT_EQUAL(rpkt.value, 42);
147 void ProtocolTests::transmit_string()
149 Packet2 pkt = { "Hello" };
151 transmit(pkt, rpkt, 11);
152 EXPECT_EQUAL(rpkt.value, "Hello");
155 void ProtocolTests::transmit_array()
157 Packet3 pkt = {{ 2, 3, 5, 7, 11 }};
159 transmit(pkt, rpkt, 26);
160 EXPECT_EQUAL(rpkt.values.size(), 5);
161 for(size_t i=0; i<pkt.values.size(); ++i)
162 EXPECT_EQUAL(rpkt.values[i], pkt.values[i]);
165 void ProtocolTests::transmit_composite()
167 Packet4 pkt = { "Don't panic", { }};
168 pkt.sub2.emplace_back(Packet3{{ 2, 3, 5, 7, 11 }});
169 pkt.sub2.emplace_back(Packet3{{ 20, 10, 5, 16, 8, 4, 2, 1 }});
171 transmit(pkt, rpkt, 75);
172 EXPECT_EQUAL(rpkt.sub1.value, "Don't panic");
173 EXPECT_EQUAL(rpkt.sub2.size(), 2);
174 EXPECT_EQUAL(rpkt.sub2[0].values.size(), 5);
175 EXPECT_EQUAL(rpkt.sub2[1].values.size(), 8);
176 for(size_t i=0; i<pkt.sub2.size(); ++i)
177 for(size_t j=0; j<pkt.sub2[i].values.size(); ++j)
178 EXPECT_EQUAL(rpkt.sub2[i].values[j], pkt.sub2[i].values[j]);