1*6f01edceSAndrew Geissler #include "slp.hpp"
2*6f01edceSAndrew Geissler #include "slp_meta.hpp"
3*6f01edceSAndrew Geissler 
4*6f01edceSAndrew Geissler #include <gtest/gtest.h>
5*6f01edceSAndrew Geissler 
6*6f01edceSAndrew Geissler // Header
7*6f01edceSAndrew Geissler /*  0                   1                   2                   3
8*6f01edceSAndrew Geissler     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
9*6f01edceSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10*6f01edceSAndrew Geissler    |    Version    |  Function-ID  |            Length             |
11*6f01edceSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12*6f01edceSAndrew Geissler    | Length, contd.|O|F|R|       reserved          |Next Ext Offset|
13*6f01edceSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14*6f01edceSAndrew Geissler    |  Next Extension Offset, contd.|              XID              |
15*6f01edceSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16*6f01edceSAndrew Geissler    |      Language Tag Length      |         Language Tag          \
17*6f01edceSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
18*6f01edceSAndrew Geissler 
19*6f01edceSAndrew Geissler // Error response
20*6f01edceSAndrew Geissler /*  0                   1                   2                   3
21*6f01edceSAndrew Geissler     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
22*6f01edceSAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23*6f01edceSAndrew Geissler     |        Service Location header (function = SrvRply = 2)       |
24*6f01edceSAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
25*6f01edceSAndrew Geissler     |        Error Code             |        URL Entry count        |
26*6f01edceSAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27*6f01edceSAndrew Geissler     |       <URL Entry 1>          ...       <URL Entry N>          \
28*6f01edceSAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
29*6f01edceSAndrew Geissler 
TEST(processError,BasicGoodPath)30*6f01edceSAndrew Geissler TEST(processError, BasicGoodPath)
31*6f01edceSAndrew Geissler {
32*6f01edceSAndrew Geissler     // Basic buffer with valid Function-ID
33*6f01edceSAndrew Geissler     slp::buffer testData{0x02, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00,
34*6f01edceSAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
35*6f01edceSAndrew Geissler 
36*6f01edceSAndrew Geissler     slp::Message req;
37*6f01edceSAndrew Geissler     int rc = slp::SUCCESS;
38*6f01edceSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
39*6f01edceSAndrew Geissler 
40*6f01edceSAndrew Geissler     EXPECT_EQ(rc, 0);
41*6f01edceSAndrew Geissler 
42*6f01edceSAndrew Geissler     // Verify all expected fields show up in response buffer
43*6f01edceSAndrew Geissler     std::vector<uint8_t> resp = slp::handler::processError(
44*6f01edceSAndrew Geissler         req, static_cast<uint8_t>(slp::Error::MSG_NOT_SUPPORTED));
45*6f01edceSAndrew Geissler 
46*6f01edceSAndrew Geissler     EXPECT_EQ(resp.size(), slp::header::MIN_LEN + slp::response::SIZE_ERROR);
47*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::OFFSET_VERSION], 2);
48*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::OFFSET_FUNCTION], 2);
49*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::MIN_LEN + 1],
50*6f01edceSAndrew Geissler               static_cast<uint8_t>(slp::Error::MSG_NOT_SUPPORTED));
51*6f01edceSAndrew Geissler }
52*6f01edceSAndrew Geissler 
TEST(processError,InvalidLangTag)53*6f01edceSAndrew Geissler TEST(processError, InvalidLangTag)
54*6f01edceSAndrew Geissler {
55*6f01edceSAndrew Geissler     // Basic buffer with valid Function-ID
56*6f01edceSAndrew Geissler     slp::buffer testData{0x02, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00,
57*6f01edceSAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,
58*6f01edceSAndrew Geissler                          0x00, 0x01, 0x02, 0x03, 0x04};
59*6f01edceSAndrew Geissler 
60*6f01edceSAndrew Geissler     slp::Message req;
61*6f01edceSAndrew Geissler     int rc = slp::SUCCESS;
62*6f01edceSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
63*6f01edceSAndrew Geissler 
64*6f01edceSAndrew Geissler     EXPECT_NE(rc, 0);
65*6f01edceSAndrew Geissler 
66*6f01edceSAndrew Geissler     // Verify all expected fields show up in response buffer even
67*6f01edceSAndrew Geissler     // with an inavlid langugage tag size in the header
68*6f01edceSAndrew Geissler     std::vector<uint8_t> resp = slp::handler::processError(
69*6f01edceSAndrew Geissler         req, static_cast<uint8_t>(slp::Error::MSG_NOT_SUPPORTED));
70*6f01edceSAndrew Geissler 
71*6f01edceSAndrew Geissler     EXPECT_EQ(resp.size(), slp::header::MIN_LEN + slp::response::SIZE_ERROR);
72*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::OFFSET_VERSION], 2);
73*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::OFFSET_FUNCTION], 2);
74*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::MIN_LEN + 1],
75*6f01edceSAndrew Geissler               static_cast<uint8_t>(slp::Error::MSG_NOT_SUPPORTED));
76*6f01edceSAndrew Geissler }
77*6f01edceSAndrew Geissler 
TEST(processError,InvalidEverything)78*6f01edceSAndrew Geissler TEST(processError, InvalidEverything)
79*6f01edceSAndrew Geissler {
80*6f01edceSAndrew Geissler     // Basic buffer with valid Function-ID
81*6f01edceSAndrew Geissler     slp::buffer testData{0x03, 0x99, 0x99, 0x99, 0xA0, 0xA0, 0xA1,
82*6f01edceSAndrew Geissler                          0xA2, 0xB9, 0x55, 0x44, 0x33, 0x21, 0x90,
83*6f01edceSAndrew Geissler                          0x78, 0x1,  0x02, 0x03, 0x04};
84*6f01edceSAndrew Geissler 
85*6f01edceSAndrew Geissler     slp::Message req;
86*6f01edceSAndrew Geissler     int rc = slp::SUCCESS;
87*6f01edceSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
88*6f01edceSAndrew Geissler 
89*6f01edceSAndrew Geissler     EXPECT_NE(rc, 0);
90*6f01edceSAndrew Geissler 
91*6f01edceSAndrew Geissler     // Verify all expected fields show up in response buffer even
92*6f01edceSAndrew Geissler     // with an inavlid langugage tag size in the header
93*6f01edceSAndrew Geissler     std::vector<uint8_t> resp = slp::handler::processError(
94*6f01edceSAndrew Geissler         req, static_cast<uint8_t>(slp::Error::MSG_NOT_SUPPORTED));
95*6f01edceSAndrew Geissler 
96*6f01edceSAndrew Geissler     EXPECT_EQ(resp.size(), slp::header::MIN_LEN + slp::response::SIZE_ERROR);
97*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::OFFSET_VERSION], 3);
98*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::OFFSET_FUNCTION], 0x9A);
99*6f01edceSAndrew Geissler     EXPECT_EQ(resp[slp::header::MIN_LEN + 1],
100*6f01edceSAndrew Geissler               static_cast<uint8_t>(slp::Error::MSG_NOT_SUPPORTED));
101*6f01edceSAndrew Geissler }
102