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