1*bac958d4Skasunath #include "nlohmann/json.hpp"
2*bac958d4Skasunath #include "rde/external_storer_interface.hpp"
3*bac958d4Skasunath #include "rde/rde_handler.hpp"
4*bac958d4Skasunath 
5*bac958d4Skasunath #include <memory>
6*bac958d4Skasunath #include <span>
7*bac958d4Skasunath 
8*bac958d4Skasunath #include <gmock/gmock-matchers.h>
9*bac958d4Skasunath #include <gmock/gmock.h>
10*bac958d4Skasunath #include <gtest/gtest.h>
11*bac958d4Skasunath 
12*bac958d4Skasunath namespace bios_bmc_smm_error_logger
13*bac958d4Skasunath {
14*bac958d4Skasunath namespace rde
15*bac958d4Skasunath {
16*bac958d4Skasunath 
17*bac958d4Skasunath using ::testing::Return;
18*bac958d4Skasunath 
19*bac958d4Skasunath /**
20*bac958d4Skasunath  * @brief Dummy values for annotation dictionary. We do not need the annotation
21*bac958d4Skasunath  * dictionary. So this contains a dictionary with some dummy values. But the RDE
22*bac958d4Skasunath  * header is correct.
23*bac958d4Skasunath  */
24*bac958d4Skasunath constexpr std::array<uint8_t, 38> mRcvDummyAnnotation{
25*bac958d4Skasunath     {0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
26*bac958d4Skasunath      0x0,  0x0,  0xc,  0x0,  0x0,  0xf0, 0xf0, 0xf1, 0x17, 0x1,
27*bac958d4Skasunath      0x0,  0x0,  0x0,  0x0,  0x0,  0x16, 0x0,  0x5,  0x0,  0xc,
28*bac958d4Skasunath      0x84, 0x0,  0x14, 0x0,  0x30, 0xa8, 0xc3, 0x3c}};
29*bac958d4Skasunath 
30*bac958d4Skasunath constexpr std::array<uint8_t, 38> mRcvDummyInvalidChecksum{
31*bac958d4Skasunath     {0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
32*bac958d4Skasunath      0x0,  0x0,  0xc,  0x0,  0x0,  0xf0, 0xf0, 0xf1, 0x17, 0x1,
33*bac958d4Skasunath      0x0,  0x0,  0x0,  0x0,  0x0,  0x16, 0x0,  0x5,  0x0,  0xc,
34*bac958d4Skasunath      0x84, 0x0,  0x14, 0x0,  0x17, 0x86, 0x00, 0x00}};
35*bac958d4Skasunath 
36*bac958d4Skasunath /**
37*bac958d4Skasunath  * @brief MultipartReceive command with START_AND_END flag set.
38*bac958d4Skasunath  */
39*bac958d4Skasunath constexpr std::array<uint8_t, 293> mRcvInput0StartAndEnd{
40*bac958d4Skasunath     {0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x0,  0x0,
41*bac958d4Skasunath      0xc,  0x0,  0x0,  0xf0, 0xf0, 0xf1, 0x17, 0x1,  0x0,  0x0,  0x0,  0x0,
42*bac958d4Skasunath      0x0,  0x16, 0x0,  0x5,  0x0,  0xc,  0x84, 0x0,  0x14, 0x0,  0x0,  0x48,
43*bac958d4Skasunath      0x0,  0x1,  0x0,  0x13, 0x90, 0x0,  0x56, 0x1,  0x0,  0x0,  0x0,  0x0,
44*bac958d4Skasunath      0x0,  0x3,  0xa3, 0x0,  0x74, 0x2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16,
45*bac958d4Skasunath      0xa6, 0x0,  0x34, 0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16, 0xbc, 0x0,
46*bac958d4Skasunath      0x64, 0x4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13, 0xd2, 0x0,  0x0,  0x0,
47*bac958d4Skasunath      0x0,  0x52, 0x0,  0x2,  0x0,  0x0,  0x0,  0x0,  0x74, 0x0,  0x0,  0x0,
48*bac958d4Skasunath      0x0,  0x0,  0x0,  0xf,  0xe5, 0x0,  0x46, 0x1,  0x0,  0x66, 0x0,  0x3,
49*bac958d4Skasunath      0x0,  0xb,  0xf4, 0x0,  0x50, 0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,
50*bac958d4Skasunath      0xff, 0x0,  0x50, 0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0x8,  0x1,
51*bac958d4Skasunath      0x50, 0x2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0xf,  0x1,  0x44, 0x75,
52*bac958d4Skasunath      0x6d, 0x6d, 0x79, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x0,  0x43, 0x68,
53*bac958d4Skasunath      0x69, 0x6c, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x70,
54*bac958d4Skasunath      0x65, 0x72, 0x74, 0x79, 0x0,  0x49, 0x64, 0x0,  0x53, 0x61, 0x6d, 0x70,
55*bac958d4Skasunath      0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x50, 0x72, 0x6f,
56*bac958d4Skasunath      0x70, 0x65, 0x72, 0x74, 0x79, 0x0,  0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65,
57*bac958d4Skasunath      0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x65,
58*bac958d4Skasunath      0x72, 0x74, 0x79, 0x0,  0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65,
59*bac958d4Skasunath      0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x0,  0x41,
60*bac958d4Skasunath      0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
61*bac958d4Skasunath      0x6e, 0x0,  0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
62*bac958d4Skasunath      0x0,  0x4c, 0x69, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x0,  0x4c, 0x69,
63*bac958d4Skasunath      0x6e, 0x6b, 0x55, 0x70, 0x0,  0x4e, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x0,
64*bac958d4Skasunath      0x0,  0x8c, 0x87, 0xed, 0x74}};
65*bac958d4Skasunath 
66*bac958d4Skasunath /**
67*bac958d4Skasunath  * @brief MultipartReceive command with START flag set.
68*bac958d4Skasunath  */
69*bac958d4Skasunath constexpr std::array<uint8_t, 166> mRcvInput1Start{
70*bac958d4Skasunath     {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x0,  0x0,
71*bac958d4Skasunath      0xc,  0x0,  0x0,  0xf0, 0xf0, 0xf1, 0x17, 0x1,  0x0,  0x0,  0x0,  0x0,
72*bac958d4Skasunath      0x0,  0x16, 0x0,  0x5,  0x0,  0xc,  0x84, 0x0,  0x14, 0x0,  0x0,  0x48,
73*bac958d4Skasunath      0x0,  0x1,  0x0,  0x13, 0x90, 0x0,  0x56, 0x1,  0x0,  0x0,  0x0,  0x0,
74*bac958d4Skasunath      0x0,  0x3,  0xa3, 0x0,  0x74, 0x2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16,
75*bac958d4Skasunath      0xa6, 0x0,  0x34, 0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16, 0xbc, 0x0,
76*bac958d4Skasunath      0x64, 0x4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13, 0xd2, 0x0,  0x0,  0x0,
77*bac958d4Skasunath      0x0,  0x52, 0x0,  0x2,  0x0,  0x0,  0x0,  0x0,  0x74, 0x0,  0x0,  0x0,
78*bac958d4Skasunath      0x0,  0x0,  0x0,  0xf,  0xe5, 0x0,  0x46, 0x1,  0x0,  0x66, 0x0,  0x3,
79*bac958d4Skasunath      0x0,  0xb,  0xf4, 0x0,  0x50, 0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,
80*bac958d4Skasunath      0xff, 0x0,  0x50, 0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0x8,  0x1,
81*bac958d4Skasunath      0x50, 0x2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0xf,  0x1,  0x44, 0x75,
82*bac958d4Skasunath      0x6d, 0x6d, 0x79, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x0,  0x43, 0x68,
83*bac958d4Skasunath      0x69, 0x6c, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x50, 0x72}};
84*bac958d4Skasunath 
85*bac958d4Skasunath /**
86*bac958d4Skasunath  * @brief MultipartReceive command with END flag set.
87*bac958d4Skasunath  */
88*bac958d4Skasunath constexpr std::array<uint8_t, 137> mRcvInput1End{
89*bac958d4Skasunath     {0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x6f, 0x70,
90*bac958d4Skasunath      0x65, 0x72, 0x74, 0x79, 0x0,  0x49, 0x64, 0x0,  0x53, 0x61, 0x6d, 0x70,
91*bac958d4Skasunath      0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x50, 0x72, 0x6f,
92*bac958d4Skasunath      0x70, 0x65, 0x72, 0x74, 0x79, 0x0,  0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65,
93*bac958d4Skasunath      0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x65,
94*bac958d4Skasunath      0x72, 0x74, 0x79, 0x0,  0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65,
95*bac958d4Skasunath      0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x0,  0x41,
96*bac958d4Skasunath      0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
97*bac958d4Skasunath      0x6e, 0x0,  0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
98*bac958d4Skasunath      0x0,  0x4c, 0x69, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x0,  0x4c, 0x69,
99*bac958d4Skasunath      0x6e, 0x6b, 0x55, 0x70, 0x0,  0x4e, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x0,
100*bac958d4Skasunath      0x0,  0x8c, 0x87, 0xed, 0x74}};
101*bac958d4Skasunath 
102*bac958d4Skasunath /**
103*bac958d4Skasunath  * @brief MultipartReceive command with START flag set.
104*bac958d4Skasunath  */
105*bac958d4Skasunath constexpr std::array<uint8_t, 106> mRcvInput2Start{
106*bac958d4Skasunath     {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x60, 0x0,  0x00, 0x00, 0x0,  0x0,
107*bac958d4Skasunath      0xc,  0x0,  0x0,  0xf0, 0xf0, 0xf1, 0x17, 0x1,  0x0,  0x0,  0x0,  0x0,
108*bac958d4Skasunath      0x0,  0x16, 0x0,  0x5,  0x0,  0xc,  0x84, 0x0,  0x14, 0x0,  0x0,  0x48,
109*bac958d4Skasunath      0x0,  0x1,  0x0,  0x13, 0x90, 0x0,  0x56, 0x1,  0x0,  0x0,  0x0,  0x0,
110*bac958d4Skasunath      0x0,  0x3,  0xa3, 0x0,  0x74, 0x2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16,
111*bac958d4Skasunath      0xa6, 0x0,  0x34, 0x3,  0x0,  0x0,  0x0,  0x0,  0x0,  0x16, 0xbc, 0x0,
112*bac958d4Skasunath      0x64, 0x4,  0x0,  0x0,  0x0,  0x0,  0x0,  0x13, 0xd2, 0x0,  0x0,  0x0,
113*bac958d4Skasunath      0x0,  0x52, 0x0,  0x2,  0x0,  0x0,  0x0,  0x0,  0x74, 0x0,  0x0,  0x0,
114*bac958d4Skasunath      0x0,  0x0,  0x0,  0xf,  0xe5, 0x0,  0x46, 0x1,  0x0,  0x66}};
115*bac958d4Skasunath 
116*bac958d4Skasunath /**
117*bac958d4Skasunath  * @brief MultipartReceive command with MIDDLE flag set.
118*bac958d4Skasunath  */
119*bac958d4Skasunath constexpr std::array<uint8_t, 106> mRcvInput2Mid{
120*bac958d4Skasunath     {0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x60, 0x0,  0x00, 0x00, 0x0,  0x3,
121*bac958d4Skasunath      0x0,  0xb,  0xf4, 0x0,  0x50, 0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x9,
122*bac958d4Skasunath      0xff, 0x0,  0x50, 0x1,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0x8,  0x1,
123*bac958d4Skasunath      0x50, 0x2,  0x0,  0x0,  0x0,  0x0,  0x0,  0x7,  0xf,  0x1,  0x44, 0x75,
124*bac958d4Skasunath      0x6d, 0x6d, 0x79, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x0,  0x43, 0x68,
125*bac958d4Skasunath      0x69, 0x6c, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x70,
126*bac958d4Skasunath      0x65, 0x72, 0x74, 0x79, 0x0,  0x49, 0x64, 0x0,  0x53, 0x61, 0x6d, 0x70,
127*bac958d4Skasunath      0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x50, 0x72, 0x6f,
128*bac958d4Skasunath      0x70, 0x65, 0x72, 0x74, 0x79, 0x0,  0x53, 0x61, 0x6d, 0x70}};
129*bac958d4Skasunath 
130*bac958d4Skasunath /**
131*bac958d4Skasunath  * @brief MultipartReceive command with END flag set.
132*bac958d4Skasunath  */
133*bac958d4Skasunath constexpr std::array<uint8_t, 101> mRcvInput2End{
134*bac958d4Skasunath     {0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x57, 0x0,  0x00, 0x00, 0x6c, 0x65,
135*bac958d4Skasunath      0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x65,
136*bac958d4Skasunath      0x72, 0x74, 0x79, 0x0,  0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65,
137*bac958d4Skasunath      0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x0,  0x41,
138*bac958d4Skasunath      0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
139*bac958d4Skasunath      0x6e, 0x0,  0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
140*bac958d4Skasunath      0x0,  0x4c, 0x69, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x0,  0x4c, 0x69,
141*bac958d4Skasunath      0x6e, 0x6b, 0x55, 0x70, 0x0,  0x4e, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x0,
142*bac958d4Skasunath      0x0,  0x8c, 0x87, 0xed, 0x74}};
143*bac958d4Skasunath 
144*bac958d4Skasunath /**
145*bac958d4Skasunath  * @brief RDEOperationInit command with encoded json/dummysimple.json as the
146*bac958d4Skasunath  * payload.
147*bac958d4Skasunath  */
148*bac958d4Skasunath constexpr std::array<uint8_t, 113> mInitOp{
149*bac958d4Skasunath     {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00,
150*bac958d4Skasunath      0x00, 0x60, 0x00, 0x00, 0x00, 0x0,  0xf0, 0xf0, 0xf1, 0x0,  0x0,  0x0,
151*bac958d4Skasunath      0x1,  0x0,  0x0,  0x1,  0x54, 0x1,  0x5,  0x1,  0x2,  0x50, 0x1,  0x9,
152*bac958d4Skasunath      0x44, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x49, 0x44, 0x0,  0x1,  0x6,  0x20,
153*bac958d4Skasunath      0x1,  0x0,  0x1,  0x8,  0x60, 0x1,  0xb,  0x1,  0x2,  0x38, 0xea, 0x1,
154*bac958d4Skasunath      0x0,  0x2,  0xa3, 0x23, 0x1,  0x0,  0x1,  0x4,  0x70, 0x1,  0x1,  0x0,
155*bac958d4Skasunath      0x1,  0x0,  0x10, 0x1,  0x24, 0x1,  0x2,  0x1,  0x0,  0x0,  0x1,  0xf,
156*bac958d4Skasunath      0x1,  0x2,  0x1,  0x0,  0x70, 0x1,  0x1,  0x1,  0x1,  0x2,  0x40, 0x1,
157*bac958d4Skasunath      0x2,  0x1,  0x2,  0x1,  0x2,  0x0,  0x1,  0x9,  0x1,  0x1,  0x1,  0x2,
158*bac958d4Skasunath      0x40, 0x1,  0x2,  0x1,  0x2}};
159*bac958d4Skasunath 
160*bac958d4Skasunath class MockExternalStorer : public ExternalStorerInterface
161*bac958d4Skasunath {
162*bac958d4Skasunath   public:
163*bac958d4Skasunath     MOCK_METHOD(bool, publishJson, (std::string_view jsonStr), (override));
164*bac958d4Skasunath };
165*bac958d4Skasunath 
166*bac958d4Skasunath class RdeHandlerTest : public ::testing::Test
167*bac958d4Skasunath {
168*bac958d4Skasunath   public:
RdeHandlerTest()169*bac958d4Skasunath     RdeHandlerTest() : mockExStorer(std::make_unique<MockExternalStorer>())
170*bac958d4Skasunath     {
171*bac958d4Skasunath         mockExStorerPtr = dynamic_cast<MockExternalStorer*>(mockExStorer.get());
172*bac958d4Skasunath         rdeH = std::make_unique<RdeCommandHandler>(std::move(mockExStorer));
173*bac958d4Skasunath     }
174*bac958d4Skasunath 
175*bac958d4Skasunath   protected:
176*bac958d4Skasunath     std::unique_ptr<ExternalStorerInterface> mockExStorer;
177*bac958d4Skasunath     std::unique_ptr<RdeCommandHandler> rdeH;
178*bac958d4Skasunath     MockExternalStorer* mockExStorerPtr;
179*bac958d4Skasunath     const std::string exJson =
180*bac958d4Skasunath         R"({"Id":"Dummy ID","SampleIntegerProperty":null,"SampleRealProperty":-5576.9123,"SampleEnabledProperty":false,"ChildArrayProperty":[{"AnotherBoolean":true,"LinkStatus":"NoLink"},{"LinkStatus":"NoLink"}]})";
181*bac958d4Skasunath };
182*bac958d4Skasunath 
TEST_F(RdeHandlerTest,DictionaryStartAndEndTest)183*bac958d4Skasunath TEST_F(RdeHandlerTest, DictionaryStartAndEndTest)
184*bac958d4Skasunath {
185*bac958d4Skasunath     // Send a payload with START_AND_END flag.
186*bac958d4Skasunath     EXPECT_THAT(
187*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput0StartAndEnd),
188*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
189*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
190*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 1);
191*bac958d4Skasunath     // Send annotation dictionary.
192*bac958d4Skasunath     EXPECT_THAT(
193*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvDummyAnnotation),
194*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
195*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
196*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 2);
197*bac958d4Skasunath 
198*bac958d4Skasunath     // Send the encoded payload.
199*bac958d4Skasunath     EXPECT_CALL(*mockExStorerPtr, publishJson(exJson)).WillOnce(Return(true));
200*bac958d4Skasunath     EXPECT_THAT(rdeH->decodeRdeCommand(std::span(mInitOp),
201*bac958d4Skasunath                                        RdeCommandType::RdeOperationInitRequest),
202*bac958d4Skasunath                 RdeDecodeStatus::RdeOk);
203*bac958d4Skasunath }
204*bac958d4Skasunath 
TEST_F(RdeHandlerTest,DictionaryStartThenEndTest)205*bac958d4Skasunath TEST_F(RdeHandlerTest, DictionaryStartThenEndTest)
206*bac958d4Skasunath {
207*bac958d4Skasunath     // Send a payload with START flag.
208*bac958d4Skasunath     EXPECT_THAT(
209*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput1Start),
210*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
211*bac958d4Skasunath         RdeDecodeStatus::RdeOk);
212*bac958d4Skasunath     // We didn't send END. So dictionary count should be 0.
213*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 0);
214*bac958d4Skasunath     // Send a payload with END flag.
215*bac958d4Skasunath     EXPECT_THAT(
216*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput1End),
217*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
218*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
219*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 1);
220*bac958d4Skasunath     // Send annotation dictionary.
221*bac958d4Skasunath     EXPECT_THAT(
222*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvDummyAnnotation),
223*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
224*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
225*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 2);
226*bac958d4Skasunath 
227*bac958d4Skasunath     // Send the encoded payload.
228*bac958d4Skasunath     EXPECT_CALL(*mockExStorerPtr, publishJson(exJson)).WillOnce(Return(true));
229*bac958d4Skasunath     EXPECT_THAT(rdeH->decodeRdeCommand(std::span(mInitOp),
230*bac958d4Skasunath                                        RdeCommandType::RdeOperationInitRequest),
231*bac958d4Skasunath                 RdeDecodeStatus::RdeOk);
232*bac958d4Skasunath 
233*bac958d4Skasunath     // Sending the START again for same resource ID should decrease the
234*bac958d4Skasunath     // dictionary count.
235*bac958d4Skasunath     EXPECT_THAT(
236*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput1Start),
237*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
238*bac958d4Skasunath         RdeDecodeStatus::RdeOk);
239*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 1);
240*bac958d4Skasunath }
241*bac958d4Skasunath 
TEST_F(RdeHandlerTest,DictionaryStartMidEndTest)242*bac958d4Skasunath TEST_F(RdeHandlerTest, DictionaryStartMidEndTest)
243*bac958d4Skasunath {
244*bac958d4Skasunath     // Send a payload with START flag.
245*bac958d4Skasunath     EXPECT_THAT(
246*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput2Start),
247*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
248*bac958d4Skasunath         RdeDecodeStatus::RdeOk);
249*bac958d4Skasunath     // We didn't send END. So dictionary count should be 0.
250*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 0);
251*bac958d4Skasunath     // Send a payload with MIDDLE flag.
252*bac958d4Skasunath     EXPECT_THAT(
253*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput2Mid),
254*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
255*bac958d4Skasunath         RdeDecodeStatus::RdeOk);
256*bac958d4Skasunath     // We didn't send END. So dictionary count should be 0.
257*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 0);
258*bac958d4Skasunath     // Send a payload with END flag.
259*bac958d4Skasunath     EXPECT_THAT(
260*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput2End),
261*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
262*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
263*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 1);
264*bac958d4Skasunath 
265*bac958d4Skasunath     // Send annotation dictionary.
266*bac958d4Skasunath     EXPECT_THAT(
267*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvDummyAnnotation),
268*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
269*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
270*bac958d4Skasunath     EXPECT_THAT(rdeH->getDictionaryCount(), 2);
271*bac958d4Skasunath 
272*bac958d4Skasunath     // Send the encoded payload.
273*bac958d4Skasunath     EXPECT_CALL(*mockExStorerPtr, publishJson(exJson)).WillOnce(Return(true));
274*bac958d4Skasunath     EXPECT_THAT(rdeH->decodeRdeCommand(std::span(mInitOp),
275*bac958d4Skasunath                                        RdeCommandType::RdeOperationInitRequest),
276*bac958d4Skasunath                 RdeDecodeStatus::RdeOk);
277*bac958d4Skasunath }
278*bac958d4Skasunath 
TEST_F(RdeHandlerTest,InvalidDictionaryFlowTest)279*bac958d4Skasunath TEST_F(RdeHandlerTest, InvalidDictionaryFlowTest)
280*bac958d4Skasunath {
281*bac958d4Skasunath     // Send a payload with MIDDLE flag before START and it should fail.
282*bac958d4Skasunath     EXPECT_THAT(
283*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput2Mid),
284*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
285*bac958d4Skasunath         RdeDecodeStatus::RdeInvalidPktOrder);
286*bac958d4Skasunath     // Send a payload with END flag before START and it should fail.
287*bac958d4Skasunath     EXPECT_THAT(
288*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvInput2End),
289*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
290*bac958d4Skasunath         RdeDecodeStatus::RdeInvalidPktOrder);
291*bac958d4Skasunath }
292*bac958d4Skasunath 
TEST_F(RdeHandlerTest,MissingDictionaryTest)293*bac958d4Skasunath TEST_F(RdeHandlerTest, MissingDictionaryTest)
294*bac958d4Skasunath {
295*bac958d4Skasunath     // Try decoding without any dictionaries.
296*bac958d4Skasunath     EXPECT_THAT(rdeH->decodeRdeCommand(std::span(mInitOp),
297*bac958d4Skasunath                                        RdeCommandType::RdeOperationInitRequest),
298*bac958d4Skasunath                 RdeDecodeStatus::RdeNoDictionary);
299*bac958d4Skasunath 
300*bac958d4Skasunath     // Try decoding just with annotation dictionary.
301*bac958d4Skasunath     EXPECT_THAT(
302*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvDummyAnnotation),
303*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
304*bac958d4Skasunath         RdeDecodeStatus::RdeStopFlagReceived);
305*bac958d4Skasunath     EXPECT_THAT(rdeH->decodeRdeCommand(std::span(mInitOp),
306*bac958d4Skasunath                                        RdeCommandType::RdeOperationInitRequest),
307*bac958d4Skasunath                 RdeDecodeStatus::RdeNoDictionary);
308*bac958d4Skasunath }
309*bac958d4Skasunath 
TEST_F(RdeHandlerTest,InvalidDictionaryChecksumTest)310*bac958d4Skasunath TEST_F(RdeHandlerTest, InvalidDictionaryChecksumTest)
311*bac958d4Skasunath {
312*bac958d4Skasunath     // Send a dictionary with an invalid checksum.
313*bac958d4Skasunath     EXPECT_THAT(
314*bac958d4Skasunath         rdeH->decodeRdeCommand(std::span(mRcvDummyInvalidChecksum),
315*bac958d4Skasunath                                RdeCommandType::RdeMultiPartReceiveResponse),
316*bac958d4Skasunath         RdeDecodeStatus::RdeInvalidChecksum);
317*bac958d4Skasunath }
318*bac958d4Skasunath 
319*bac958d4Skasunath } // namespace rde
320*bac958d4Skasunath } // namespace bios_bmc_smm_error_logger
321