1 #include "slp.hpp"
2 #include "slp_meta.hpp"
3 
4 #include <gtest/gtest.h>
5 
6 /*  0                   1                   2                   3
7     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
8    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9    |    Version    |  Function-ID  |            Length             |
10    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
11    | Length, contd.|O|F|R|       reserved          |Next Ext Offset|
12    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
13    |  Next Extension Offset, contd.|              XID              |
14    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
15    |      Language Tag Length      |         Language Tag          \
16    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
17 
18 TEST(parseHeaderTest, BasicGoodPath)
19 {
20     // Basic buffer with valid Function-ID
21     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
22                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
23 
24     slp::Message req;
25     int rc = slp::SUCCESS;
26     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
27 
28     EXPECT_EQ(rc, 0);
29 }
30 
31 TEST(parseHeaderTest, InvalidBufferSize)
32 {
33     // 1 byte too small
34     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
35                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
36 
37     slp::Message req;
38     int rc = slp::SUCCESS;
39     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
40 
41     EXPECT_NE(rc, 0);
42 }
43 
44 TEST(parseHeaderTest, ValidLangTagLength)
45 {
46     // Language Tag Length that is valid
47     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48                          0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00};
49 
50     slp::Message req;
51     int rc = slp::SUCCESS;
52     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
53 
54     EXPECT_EQ(rc, 0);
55 }
56 
57 TEST(parseHeaderTest, InvalidLangTagLength)
58 {
59     // Language Tag Length that is too big
60     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61                          0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00};
62 
63     slp::Message req;
64     int rc = slp::SUCCESS;
65     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
66 
67     EXPECT_NE(rc, 0);
68 }
69 
70 /*  0                   1                   2                   3
71     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
72    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73    |      Service Location header (function = SrvTypeRqst = 9)     |
74    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75    |        length of PRList       |        <PRList> String        \
76    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77    |   length of Naming Authority  |   <Naming Authority String>   \
78    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79    |     length of <scope-list>    |      <scope-list> String      \
80    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
81 TEST(parseSrvTypeRqst, BasicGoodPath)
82 {
83     // Basic buffer with 0 for all lengths
84     slp::buffer testData{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
87     slp::Message req;
88     int rc = slp::SUCCESS;
89     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
90 
91     EXPECT_EQ(rc, 0);
92 }
93 
94 TEST(parseSrvTypeRqst, GoodPathWithData)
95 {
96     // Basic buffer with some valid lengths and data
97     slp::buffer
98         testData{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
99                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, /* Lang Length */
100                  'L',  'A',  'N',  'G',  0x00, 0x04,       /* PRlist length*/
101                  'P',  'R',  'L',  'T',  0x00, 0x08, /* Naming auth length */
102                  'N',  'A',  'M',  'E',  'A',  'U',  'T',
103                  'H',  0x00, 0x05,                   /* Scope length*/
104                  'S',  'C',  'O',  'P',  'E'};
105     slp::Message req;
106     int rc = slp::SUCCESS;
107     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
108     EXPECT_EQ(rc, 0);
109     EXPECT_EQ(req.header.langtag, "LANG");
110     EXPECT_EQ(req.header.langtagLen, 4);
111 
112     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
113     EXPECT_EQ(rc, 0);
114     EXPECT_EQ(req.body.srvtyperqst.prList, "PRLT");
115     EXPECT_EQ(req.body.srvtyperqst.namingAuth, "NAMEAUTH");
116     EXPECT_EQ(req.body.srvtyperqst.scopeList, "SCOPE");
117 }
118 
119 TEST(parseSrvTypeRqst, GoodPathMatchSlptoolFindSrvTypes)
120 {
121     // This matches what "slptool -u <server> findsrvtypes" sends
122     slp::buffer testData{0x02, 0x09, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
123                          0x00, 0x00, 0x74, 0xe2, 0x00, 0x02, /* Lang Length */
124                          'e',  'n',  0x00, 0x00,             /* PRlist length*/
125                          0xff, 0xff, /* Naming auth length */
126                          0x00, 0x07, /* Scope length*/
127                          'D',  'E',  'F',  'A',  'U',  'L',  'T'};
128     slp::Message req;
129     int rc = slp::SUCCESS;
130     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
131     EXPECT_EQ(rc, 0);
132     EXPECT_EQ(req.header.langtag, "en");
133     EXPECT_EQ(req.header.langtagLen, 2);
134 
135     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
136     EXPECT_EQ(rc, 0);
137     EXPECT_EQ(req.body.srvtyperqst.namingAuth, "");
138     EXPECT_EQ(req.body.srvtyperqst.scopeList, "DEFAULT");
139 }
140 
141 TEST(parseSrvTypeRqst, BadPathSizes)
142 {
143     // Basic buffer with some valid lengths and data
144     slp::buffer
145         testData{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
146                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, /* Lang Length */
147                  'L',  'A',  'N',  'G',  0x00, 0x05,       /* PRlist length*/
148                  'P',  'R',  'L',  'T',  0x00, 0x08, /* Naming auth length */
149                  'N',  'A',  'M',  'E',  'A',  'U',  'T',
150                  'H',  0x00, 0x05,                   /* Scope length*/
151                  'S',  'C',  'O',  'P',  'E'};
152     slp::Message req;
153     int rc = slp::SUCCESS;
154     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
155     EXPECT_EQ(rc, 0);
156     EXPECT_EQ(req.header.langtag, "LANG");
157     EXPECT_EQ(req.header.langtagLen, 4);
158 
159     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
160     EXPECT_NE(rc, 0);
161 
162     // Fix PR, make Name invalid
163     testData[19] = 4;
164     testData[25] = 5;
165     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
166     EXPECT_NE(rc, 0);
167 
168     // Fix Name, make Scope invalid
169     testData[25] = 8;
170     testData[35] = 10;
171     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
172     EXPECT_NE(rc, 0);
173 }
174