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