xref: /openbmc/slpd-lite/test/slp_parser_test.cpp (revision 20bab74865ba955921eb0e4e427c84e37e1c8916)
10e948dcaSAndrew Geissler #include "slp.hpp"
20e948dcaSAndrew Geissler #include "slp_meta.hpp"
30e948dcaSAndrew Geissler 
40e948dcaSAndrew Geissler #include <gtest/gtest.h>
50e948dcaSAndrew Geissler 
60e948dcaSAndrew Geissler /*  0                   1                   2                   3
70e948dcaSAndrew 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
80e948dcaSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
90e948dcaSAndrew Geissler    |    Version    |  Function-ID  |            Length             |
100e948dcaSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110e948dcaSAndrew Geissler    | Length, contd.|O|F|R|       reserved          |Next Ext Offset|
120e948dcaSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
130e948dcaSAndrew Geissler    |  Next Extension Offset, contd.|              XID              |
140e948dcaSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
150e948dcaSAndrew Geissler    |      Language Tag Length      |         Language Tag          \
160e948dcaSAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
170e948dcaSAndrew Geissler 
TEST(parseHeaderTest,BasicGoodPath)180e948dcaSAndrew Geissler TEST(parseHeaderTest, BasicGoodPath)
190e948dcaSAndrew Geissler {
200e948dcaSAndrew Geissler     // Basic buffer with valid Function-ID
210e948dcaSAndrew Geissler     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
220e948dcaSAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
230e948dcaSAndrew Geissler 
240e948dcaSAndrew Geissler     slp::Message req;
250e948dcaSAndrew Geissler     int rc = slp::SUCCESS;
260e948dcaSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
270e948dcaSAndrew Geissler 
280e948dcaSAndrew Geissler     EXPECT_EQ(rc, 0);
290e948dcaSAndrew Geissler }
300e948dcaSAndrew Geissler 
TEST(parseHeaderTest,InvalidBufferSize)310e948dcaSAndrew Geissler TEST(parseHeaderTest, InvalidBufferSize)
320e948dcaSAndrew Geissler {
330e948dcaSAndrew Geissler     // 1 byte too small
340e948dcaSAndrew Geissler     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
350e948dcaSAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
360e948dcaSAndrew Geissler 
370e948dcaSAndrew Geissler     slp::Message req;
380e948dcaSAndrew Geissler     int rc = slp::SUCCESS;
390e948dcaSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
400e948dcaSAndrew Geissler 
410e948dcaSAndrew Geissler     EXPECT_NE(rc, 0);
420e948dcaSAndrew Geissler }
43c668313eSAndrew Geissler 
TEST(parseHeaderTest,ValidLangTagLength)44c668313eSAndrew Geissler TEST(parseHeaderTest, ValidLangTagLength)
45c668313eSAndrew Geissler {
46c668313eSAndrew Geissler     // Language Tag Length that is valid
47c668313eSAndrew Geissler     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48c668313eSAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00};
49c668313eSAndrew Geissler 
50c668313eSAndrew Geissler     slp::Message req;
51c668313eSAndrew Geissler     int rc = slp::SUCCESS;
52c668313eSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
53c668313eSAndrew Geissler 
54c668313eSAndrew Geissler     EXPECT_EQ(rc, 0);
55c668313eSAndrew Geissler }
56c668313eSAndrew Geissler 
TEST(parseHeaderTest,InvalidLangTagLength)57c668313eSAndrew Geissler TEST(parseHeaderTest, InvalidLangTagLength)
58c668313eSAndrew Geissler {
59c668313eSAndrew Geissler     // Language Tag Length that is too big
60c668313eSAndrew Geissler     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61c668313eSAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00};
62c668313eSAndrew Geissler 
63c668313eSAndrew Geissler     slp::Message req;
64c668313eSAndrew Geissler     int rc = slp::SUCCESS;
65c668313eSAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
66c668313eSAndrew Geissler 
67c668313eSAndrew Geissler     EXPECT_NE(rc, 0);
68c668313eSAndrew Geissler }
69f60e7108SAndrew Geissler 
70f60e7108SAndrew Geissler /*  0                   1                   2                   3
71f60e7108SAndrew 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
72f60e7108SAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73f60e7108SAndrew Geissler    |      Service Location header (function = SrvTypeRqst = 9)     |
74f60e7108SAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75f60e7108SAndrew Geissler    |        length of PRList       |        <PRList> String        \
76f60e7108SAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77f60e7108SAndrew Geissler    |   length of Naming Authority  |   <Naming Authority String>   \
78f60e7108SAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79f60e7108SAndrew Geissler    |     length of <scope-list>    |      <scope-list> String      \
80f60e7108SAndrew Geissler    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
TEST(parseSrvTypeRqst,BasicGoodPath)81f60e7108SAndrew Geissler TEST(parseSrvTypeRqst, BasicGoodPath)
82f60e7108SAndrew Geissler {
83f60e7108SAndrew Geissler     // Basic buffer with 0 for all lengths
84f60e7108SAndrew Geissler     slp::buffer testData{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85f60e7108SAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86f60e7108SAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
87f60e7108SAndrew Geissler     slp::Message req;
88f60e7108SAndrew Geissler     int rc = slp::SUCCESS;
89f60e7108SAndrew Geissler     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
90f60e7108SAndrew Geissler 
91f60e7108SAndrew Geissler     EXPECT_EQ(rc, 0);
92f60e7108SAndrew Geissler }
93f60e7108SAndrew Geissler 
TEST(parseSrvTypeRqst,GoodPathWithData)94f60e7108SAndrew Geissler TEST(parseSrvTypeRqst, GoodPathWithData)
95f60e7108SAndrew Geissler {
96f60e7108SAndrew Geissler     // Basic buffer with some valid lengths and data
97f60e7108SAndrew Geissler     slp::buffer
98f60e7108SAndrew Geissler         testData{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
99f60e7108SAndrew Geissler                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, /* Lang Length */
100f60e7108SAndrew Geissler                  'L',  'A',  'N',  'G',  0x00, 0x04,       /* PRlist length*/
101f60e7108SAndrew Geissler                  'P',  'R',  'L',  'T',  0x00, 0x08, /* Naming auth length */
102f60e7108SAndrew Geissler                  'N',  'A',  'M',  'E',  'A',  'U',  'T',
103f60e7108SAndrew Geissler                  'H',  0x00, 0x05,                   /* Scope length*/
104f60e7108SAndrew Geissler                  'S',  'C',  'O',  'P',  'E'};
105f60e7108SAndrew Geissler     slp::Message req;
106f60e7108SAndrew Geissler     int rc = slp::SUCCESS;
107f60e7108SAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
108f60e7108SAndrew Geissler     EXPECT_EQ(rc, 0);
109f60e7108SAndrew Geissler     EXPECT_EQ(req.header.langtag, "LANG");
110f60e7108SAndrew Geissler     EXPECT_EQ(req.header.langtagLen, 4);
111f60e7108SAndrew Geissler 
112f60e7108SAndrew Geissler     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
113f60e7108SAndrew Geissler     EXPECT_EQ(rc, 0);
114f60e7108SAndrew Geissler     EXPECT_EQ(req.body.srvtyperqst.prList, "PRLT");
115f60e7108SAndrew Geissler     EXPECT_EQ(req.body.srvtyperqst.namingAuth, "NAMEAUTH");
116f60e7108SAndrew Geissler     EXPECT_EQ(req.body.srvtyperqst.scopeList, "SCOPE");
117f60e7108SAndrew Geissler }
118f60e7108SAndrew Geissler 
TEST(parseSrvTypeRqst,GoodPathMatchSlptoolFindSrvTypes)119f60e7108SAndrew Geissler TEST(parseSrvTypeRqst, GoodPathMatchSlptoolFindSrvTypes)
120f60e7108SAndrew Geissler {
121f60e7108SAndrew Geissler     // This matches what "slptool -u <server> findsrvtypes" sends
122f60e7108SAndrew Geissler     slp::buffer testData{0x02, 0x09, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
123f60e7108SAndrew Geissler                          0x00, 0x00, 0x74, 0xe2, 0x00, 0x02, /* Lang Length */
124f60e7108SAndrew Geissler                          'e',  'n',  0x00, 0x00,             /* PRlist length*/
125f60e7108SAndrew Geissler                          0xff, 0xff, /* Naming auth length */
126f60e7108SAndrew Geissler                          0x00, 0x07, /* Scope length*/
127f60e7108SAndrew Geissler                          'D',  'E',  'F',  'A',  'U',  'L',  'T'};
128f60e7108SAndrew Geissler     slp::Message req;
129f60e7108SAndrew Geissler     int rc = slp::SUCCESS;
130f60e7108SAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
131f60e7108SAndrew Geissler     EXPECT_EQ(rc, 0);
132f60e7108SAndrew Geissler     EXPECT_EQ(req.header.langtag, "en");
133f60e7108SAndrew Geissler     EXPECT_EQ(req.header.langtagLen, 2);
134f60e7108SAndrew Geissler 
135f60e7108SAndrew Geissler     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
136f60e7108SAndrew Geissler     EXPECT_EQ(rc, 0);
137f60e7108SAndrew Geissler     EXPECT_EQ(req.body.srvtyperqst.namingAuth, "");
138f60e7108SAndrew Geissler     EXPECT_EQ(req.body.srvtyperqst.scopeList, "DEFAULT");
139f60e7108SAndrew Geissler }
140f60e7108SAndrew Geissler 
TEST(parseSrvTypeRqst,BadPathSizes)141f60e7108SAndrew Geissler TEST(parseSrvTypeRqst, BadPathSizes)
142f60e7108SAndrew Geissler {
143f60e7108SAndrew Geissler     // Basic buffer with some valid lengths and data
144f60e7108SAndrew Geissler     slp::buffer
145f60e7108SAndrew Geissler         testData{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
146f60e7108SAndrew Geissler                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, /* Lang Length */
147f60e7108SAndrew Geissler                  'L',  'A',  'N',  'G',  0x00, 0x05,       /* PRlist length*/
148f60e7108SAndrew Geissler                  'P',  'R',  'L',  'T',  0x00, 0x08, /* Naming auth length */
149f60e7108SAndrew Geissler                  'N',  'A',  'M',  'E',  'A',  'U',  'T',
150f60e7108SAndrew Geissler                  'H',  0x00, 0x05,                   /* Scope length*/
151f60e7108SAndrew Geissler                  'S',  'C',  'O',  'P',  'E'};
152f60e7108SAndrew Geissler     slp::Message req;
153f60e7108SAndrew Geissler     int rc = slp::SUCCESS;
154f60e7108SAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
155f60e7108SAndrew Geissler     EXPECT_EQ(rc, 0);
156f60e7108SAndrew Geissler     EXPECT_EQ(req.header.langtag, "LANG");
157f60e7108SAndrew Geissler     EXPECT_EQ(req.header.langtagLen, 4);
158f60e7108SAndrew Geissler 
159f60e7108SAndrew Geissler     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
160f60e7108SAndrew Geissler     EXPECT_NE(rc, 0);
161f60e7108SAndrew Geissler 
162f60e7108SAndrew Geissler     // Fix PR, make Name invalid
163f60e7108SAndrew Geissler     testData[19] = 4;
164f60e7108SAndrew Geissler     testData[25] = 5;
165f60e7108SAndrew Geissler     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
166f60e7108SAndrew Geissler     EXPECT_NE(rc, 0);
167f60e7108SAndrew Geissler 
168f60e7108SAndrew Geissler     // Fix Name, make Scope invalid
169f60e7108SAndrew Geissler     testData[25] = 8;
170f60e7108SAndrew Geissler     testData[35] = 10;
171f60e7108SAndrew Geissler     rc = slp::parser::internal::parseSrvTypeRqst(testData, req);
172f60e7108SAndrew Geissler     EXPECT_NE(rc, 0);
173f60e7108SAndrew Geissler }
174*20bab748SAndrew Geissler 
175*20bab748SAndrew Geissler /*  0                   1                   2                   3
176*20bab748SAndrew 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
177*20bab748SAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
178*20bab748SAndrew Geissler     |      length of <PRList>       |        <PRList> String        \
179*20bab748SAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
180*20bab748SAndrew Geissler     |   length of <service-type>    |    <service-type> String      \
181*20bab748SAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
182*20bab748SAndrew Geissler     |    length of <scope-list>     |     <scope-list> String       \
183*20bab748SAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
184*20bab748SAndrew Geissler     |  length of predicate string   |  Service Request <predicate>  \
185*20bab748SAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
186*20bab748SAndrew Geissler     |  length of <SLP SPI> string   |       <SLP SPI> String        \
187*20bab748SAndrew Geissler     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
188*20bab748SAndrew Geissler 
TEST(parseSrvRqst,BasicGoodPath)189*20bab748SAndrew Geissler TEST(parseSrvRqst, BasicGoodPath)
190*20bab748SAndrew Geissler {
191*20bab748SAndrew Geissler     // Basic buffer with 0 for all lengths
192*20bab748SAndrew Geissler     slp::buffer testData{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
193*20bab748SAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194*20bab748SAndrew Geissler                          0x00, 0x00, 0x00, 0x00, /* start of SrvRqst*/
195*20bab748SAndrew Geissler                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
196*20bab748SAndrew Geissler     slp::Message req;
197*20bab748SAndrew Geissler     int rc = slp::SUCCESS;
198*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
199*20bab748SAndrew Geissler 
200*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
201*20bab748SAndrew Geissler }
202*20bab748SAndrew Geissler 
TEST(parseSrvRqst,GoodPathWithData)203*20bab748SAndrew Geissler TEST(parseSrvRqst, GoodPathWithData)
204*20bab748SAndrew Geissler {
205*20bab748SAndrew Geissler     // Basic buffer with some valid lengths and data
206*20bab748SAndrew Geissler     slp::buffer testData{
207*20bab748SAndrew Geissler         0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
208*20bab748SAndrew Geissler         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, /* Lang Length */
209*20bab748SAndrew Geissler         'L',  'A',  'N',  'G',  0x00, 0x04,       /* PRlist length*/
210*20bab748SAndrew Geissler         'P',  'R',  'L',  'T',  0x00, 0xB,        /* Service type length */
211*20bab748SAndrew Geissler         'S',  'E',  'R',  'V',  'I',  'C',  'E',
212*20bab748SAndrew Geissler         'T',  'Y',  'P',  'E',  0x00, 0x05,       /* Scope length*/
213*20bab748SAndrew Geissler         'S',  'C',  'O',  'P',  'E',  0x00, 0x02, /* predicate length */
214*20bab748SAndrew Geissler         'P',  'D',  0x00, 0x01,                   /* SLP SPI length */
215*20bab748SAndrew Geissler         'S'};
216*20bab748SAndrew Geissler     slp::Message req;
217*20bab748SAndrew Geissler     int rc = slp::SUCCESS;
218*20bab748SAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
219*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
220*20bab748SAndrew Geissler     EXPECT_EQ(req.header.langtag, "LANG");
221*20bab748SAndrew Geissler     EXPECT_EQ(req.header.langtagLen, 4);
222*20bab748SAndrew Geissler 
223*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
224*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
225*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.prList, "PRLT");
226*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.srvType, "SERVICETYPE");
227*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.scopeList, "SCOPE");
228*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.predicate, "PD");
229*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.spistr, "S");
230*20bab748SAndrew Geissler }
231*20bab748SAndrew Geissler 
TEST(parseSrvRqst,GoodPathMatchSlptoolFindSrvs)232*20bab748SAndrew Geissler TEST(parseSrvRqst, GoodPathMatchSlptoolFindSrvs)
233*20bab748SAndrew Geissler {
234*20bab748SAndrew Geissler     // This matches what "slptool -u <server> findsrvs service:obmc_console"
235*20bab748SAndrew Geissler     // sends
236*20bab748SAndrew Geissler     slp::buffer testData{0x02, 0x01, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
237*20bab748SAndrew Geissler                          0x00, 0x00, 0xe5, 0xc2, 0x00, 0x02, /* Lang Length */
238*20bab748SAndrew Geissler                          'e',  'n',  0x00, 0x00,             /* PR list length*/
239*20bab748SAndrew Geissler                          0x00, 0x14, /* Service length */
240*20bab748SAndrew Geissler                          's',  'e',  'r',  'v',  'i',  'c',  'e',  ':',
241*20bab748SAndrew Geissler                          'o',  'b',  'm',  'c',  '_',  'c',  'o',  'n',
242*20bab748SAndrew Geissler                          's',  'o',  'l',  'e',  0x00, 0x07, /* Scope length*/
243*20bab748SAndrew Geissler                          'D',  'E',  'F',  'A',  'U',  'L',  'T',  0x00,
244*20bab748SAndrew Geissler                          0x00,        /* Predicate length */
245*20bab748SAndrew Geissler                          0x00, 0x00}; /* SLP SPI length*/
246*20bab748SAndrew Geissler     slp::Message req;
247*20bab748SAndrew Geissler     int rc = slp::SUCCESS;
248*20bab748SAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
249*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
250*20bab748SAndrew Geissler     EXPECT_EQ(req.header.langtag, "en");
251*20bab748SAndrew Geissler     EXPECT_EQ(req.header.langtagLen, 2);
252*20bab748SAndrew Geissler 
253*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
254*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
255*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.srvType, "service:obmc_console");
256*20bab748SAndrew Geissler     EXPECT_EQ(req.body.srvrqst.scopeList, "DEFAULT");
257*20bab748SAndrew Geissler }
258*20bab748SAndrew Geissler 
TEST(parseSrvRqst,BadPathSizes)259*20bab748SAndrew Geissler TEST(parseSrvRqst, BadPathSizes)
260*20bab748SAndrew Geissler {
261*20bab748SAndrew Geissler     // Basic buffer with invalid PRlist size
262*20bab748SAndrew Geissler     slp::buffer testData{
263*20bab748SAndrew Geissler         0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
264*20bab748SAndrew Geissler         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, /* Lang Length */
265*20bab748SAndrew Geissler         'L',  'A',  'N',  'G',  0x00, 0x05,       /* PRlist length*/
266*20bab748SAndrew Geissler         'P',  'R',  'L',  'T',  0x00, 0xB,        /* Service type length */
267*20bab748SAndrew Geissler         'S',  'E',  'R',  'V',  'I',  'C',  'E',
268*20bab748SAndrew Geissler         'T',  'Y',  'P',  'E',  0x00, 0x05,       /* Scope length*/
269*20bab748SAndrew Geissler         'S',  'C',  'O',  'P',  'E',  0x00, 0x02, /* predicate length */
270*20bab748SAndrew Geissler         'P',  'D',  0x00, 0x01,                   /* SLP SPI length */
271*20bab748SAndrew Geissler         'S'};
272*20bab748SAndrew Geissler     slp::Message req;
273*20bab748SAndrew Geissler     int rc = slp::SUCCESS;
274*20bab748SAndrew Geissler     std::tie(rc, req) = slp::parser::internal::parseHeader(testData);
275*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
276*20bab748SAndrew Geissler     EXPECT_EQ(req.header.langtag, "LANG");
277*20bab748SAndrew Geissler     EXPECT_EQ(req.header.langtagLen, 4);
278*20bab748SAndrew Geissler 
279*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
280*20bab748SAndrew Geissler     EXPECT_NE(rc, 0);
281*20bab748SAndrew Geissler 
282*20bab748SAndrew Geissler     // Fix PR, make Service type invalid
283*20bab748SAndrew Geissler     testData[19] = 4;
284*20bab748SAndrew Geissler     testData[25] = 5;
285*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
286*20bab748SAndrew Geissler     EXPECT_NE(rc, 0);
287*20bab748SAndrew Geissler 
288*20bab748SAndrew Geissler     // Fix Service type, make Scope invalid
289*20bab748SAndrew Geissler     testData[25] = 0xB;
290*20bab748SAndrew Geissler     testData[38] = 10;
291*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
292*20bab748SAndrew Geissler     EXPECT_NE(rc, 0);
293*20bab748SAndrew Geissler 
294*20bab748SAndrew Geissler     // Fix Scope, make Predicate invalid
295*20bab748SAndrew Geissler     testData[38] = 5;
296*20bab748SAndrew Geissler     testData[45] = 100;
297*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
298*20bab748SAndrew Geissler     EXPECT_NE(rc, 0);
299*20bab748SAndrew Geissler 
300*20bab748SAndrew Geissler     // Fix Predicate, make SLP SPI invalid
301*20bab748SAndrew Geissler     testData[45] = 2;
302*20bab748SAndrew Geissler     testData[49] = 5;
303*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
304*20bab748SAndrew Geissler     EXPECT_NE(rc, 0);
305*20bab748SAndrew Geissler 
306*20bab748SAndrew Geissler     // Now fix SLP SPI and make sure we pass
307*20bab748SAndrew Geissler     testData[49] = 1;
308*20bab748SAndrew Geissler     rc = slp::parser::internal::parseSrvRqst(testData, req);
309*20bab748SAndrew Geissler     EXPECT_EQ(rc, 0);
310*20bab748SAndrew Geissler }
311