blob: aff5d6d62f75c722c3fe6e3c8a2ebd164d94cdb2 [file] [log] [blame]
Sampa Misra032bd502019-03-06 05:03:22 -06001#include <string.h>
2
3#include <array>
4
5#include "libpldm/base.h"
6#include "libpldm/bios.h"
7
8#include <gtest/gtest.h>
9
Zahed Hossain223a73d2019-07-04 12:46:18 -050010constexpr auto hdrSize = sizeof(pldm_msg_hdr);
11
Sampa Misra032bd502019-03-06 05:03:22 -060012TEST(GetDateTime, testEncodeRequest)
13{
14 pldm_msg request{};
Sampa Misra032bd502019-03-06 05:03:22 -060015
16 auto rc = encode_get_date_time_req(0, &request);
17 ASSERT_EQ(rc, PLDM_SUCCESS);
18}
19
20TEST(GetDateTime, testEncodeResponse)
21{
22 uint8_t completionCode = 0;
23 uint8_t seconds = 50;
24 uint8_t minutes = 20;
25 uint8_t hours = 5;
26 uint8_t day = 23;
27 uint8_t month = 11;
28 uint16_t year = 2019;
29
vkaverapa6575b82019-04-03 05:33:52 -050030 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_DATE_TIME_RESP_BYTES>
31 responseMsg{};
Sampa Misra032bd502019-03-06 05:03:22 -060032
vkaverapa6575b82019-04-03 05:33:52 -050033 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
Sampa Misra032bd502019-03-06 05:03:22 -060034
35 auto rc = encode_get_date_time_resp(0, PLDM_SUCCESS, seconds, minutes,
vkaverapa6575b82019-04-03 05:33:52 -050036 hours, day, month, year, response);
Sampa Misra032bd502019-03-06 05:03:22 -060037
38 ASSERT_EQ(rc, PLDM_SUCCESS);
vkaverapa6575b82019-04-03 05:33:52 -050039 ASSERT_EQ(completionCode, response->payload[0]);
Sampa Misra032bd502019-03-06 05:03:22 -060040
vkaverapa6575b82019-04-03 05:33:52 -050041 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
42 &seconds, sizeof(seconds)));
43 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
44 sizeof(seconds),
Sampa Misra032bd502019-03-06 05:03:22 -060045 &minutes, sizeof(minutes)));
vkaverapa6575b82019-04-03 05:33:52 -050046 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
47 sizeof(seconds) + sizeof(minutes),
48 &hours, sizeof(hours)));
49 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
50 sizeof(seconds) + sizeof(minutes) + sizeof(hours),
51 &day, sizeof(day)));
52 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
53 sizeof(seconds) + sizeof(minutes) + sizeof(hours) +
54 sizeof(day),
Sampa Misra032bd502019-03-06 05:03:22 -060055 &month, sizeof(month)));
vkaverapa6575b82019-04-03 05:33:52 -050056 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
57 sizeof(seconds) + sizeof(minutes) + sizeof(hours) +
58 sizeof(day) + sizeof(month),
59 &year, sizeof(year)));
Sampa Misra032bd502019-03-06 05:03:22 -060060}
61
62TEST(GetDateTime, testDecodeResponse)
63{
Zahed Hossain223a73d2019-07-04 12:46:18 -050064 std::array<uint8_t, hdrSize + PLDM_GET_DATE_TIME_RESP_BYTES> responseMsg{};
Sampa Misra032bd502019-03-06 05:03:22 -060065
66 uint8_t completionCode = 0;
67
68 uint8_t seconds = 55;
69 uint8_t minutes = 2;
70 uint8_t hours = 8;
71 uint8_t day = 9;
72 uint8_t month = 7;
73 uint16_t year = 2020;
74
75 uint8_t retSeconds = 0;
76 uint8_t retMinutes = 0;
77 uint8_t retHours = 0;
78 uint8_t retDay = 0;
79 uint8_t retMonth = 0;
80 uint16_t retYear = 0;
81
Zahed Hossain223a73d2019-07-04 12:46:18 -050082 memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize, &seconds,
Sampa Misra032bd502019-03-06 05:03:22 -060083 sizeof(seconds));
Zahed Hossain223a73d2019-07-04 12:46:18 -050084 memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
85 hdrSize,
Sampa Misra032bd502019-03-06 05:03:22 -060086 &minutes, sizeof(minutes));
vkaverapa6575b82019-04-03 05:33:52 -050087 memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
Zahed Hossain223a73d2019-07-04 12:46:18 -050088 sizeof(minutes) + hdrSize,
Sampa Misra032bd502019-03-06 05:03:22 -060089 &hours, sizeof(hours));
vkaverapa6575b82019-04-03 05:33:52 -050090 memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
Zahed Hossain223a73d2019-07-04 12:46:18 -050091 sizeof(minutes) + sizeof(hours) + hdrSize,
Sampa Misra032bd502019-03-06 05:03:22 -060092 &day, sizeof(day));
vkaverapa6575b82019-04-03 05:33:52 -050093 memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
Zahed Hossain223a73d2019-07-04 12:46:18 -050094 sizeof(minutes) + sizeof(hours) + sizeof(day) + hdrSize,
Sampa Misra032bd502019-03-06 05:03:22 -060095 &month, sizeof(month));
vkaverapa6575b82019-04-03 05:33:52 -050096 memcpy(responseMsg.data() + sizeof(completionCode) + sizeof(seconds) +
Zahed Hossain223a73d2019-07-04 12:46:18 -050097 sizeof(minutes) + sizeof(hours) + sizeof(day) + sizeof(month) +
98 hdrSize,
Sampa Misra032bd502019-03-06 05:03:22 -060099 &year, sizeof(year));
100
Zahed Hossain223a73d2019-07-04 12:46:18 -0500101 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
102
vkaverapa6575b82019-04-03 05:33:52 -0500103 auto rc = decode_get_date_time_resp(
Zahed Hossain223a73d2019-07-04 12:46:18 -0500104 response, responseMsg.size() - hdrSize, &completionCode, &retSeconds,
vkaverapa6575b82019-04-03 05:33:52 -0500105 &retMinutes, &retHours, &retDay, &retMonth, &retYear);
Sampa Misra032bd502019-03-06 05:03:22 -0600106
107 ASSERT_EQ(rc, PLDM_SUCCESS);
108 ASSERT_EQ(seconds, retSeconds);
109 ASSERT_EQ(minutes, retMinutes);
110 ASSERT_EQ(hours, retHours);
111 ASSERT_EQ(day, retDay);
112 ASSERT_EQ(month, retMonth);
113 ASSERT_EQ(year, retYear);
114}
Sampa Misrab37be312019-07-03 02:26:41 -0500115
116TEST(GetBIOSTable, testGoodEncodeResponse)
117{
118 std::array<uint8_t,
119 sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4>
120 responseMsg{};
121 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
122
123 uint8_t completionCode = PLDM_SUCCESS;
124 uint32_t nextTransferHandle = 32;
125 uint8_t transferFlag = PLDM_START_AND_END;
126 std::array<uint8_t, 4> tableData{1, 2, 3, 4};
127
128 auto rc = encode_get_bios_table_resp(
129 0, PLDM_SUCCESS, nextTransferHandle, transferFlag, tableData.data(),
130 sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4,
131 response);
132 ASSERT_EQ(rc, PLDM_SUCCESS);
133
134 struct pldm_get_bios_table_resp* resp =
135 reinterpret_cast<struct pldm_get_bios_table_resp*>(response->payload);
136
137 ASSERT_EQ(completionCode, resp->completion_code);
138 ASSERT_EQ(nextTransferHandle, resp->next_transfer_handle);
139 ASSERT_EQ(transferFlag, resp->transfer_flag);
140 ASSERT_EQ(0, memcmp(tableData.data(), resp->table_data, tableData.size()));
141}
142
143TEST(GetBIOSTable, testBadEncodeResponse)
144{
145 uint32_t nextTransferHandle = 32;
146 uint8_t transferFlag = PLDM_START_AND_END;
147 std::array<uint8_t, 4> tableData{1, 2, 3, 4};
148
149 auto rc = encode_get_bios_table_resp(
150 0, PLDM_SUCCESS, nextTransferHandle, transferFlag, tableData.data(),
151 sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES + 4, nullptr);
152 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
153}
154
155TEST(GetBIOSTable, testGoodDecodeRequest)
156{
157 const auto hdr_size = sizeof(pldm_msg_hdr);
158 std::array<uint8_t, hdr_size + PLDM_GET_BIOS_TABLE_REQ_BYTES> requestMsg{};
159 uint32_t transferHandle = 31;
160 uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
161 uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
162 uint32_t retTransferHandle = 0;
163 uint8_t retTransferOpFlag = 0;
164 uint8_t retTableType = 0;
165
166 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
167 struct pldm_get_bios_table_req* request =
168 reinterpret_cast<struct pldm_get_bios_table_req*>(req->payload);
169
170 request->transfer_handle = transferHandle;
171 request->transfer_op_flag = transferOpFlag;
172 request->table_type = tableType;
173
174 auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size,
175 &retTransferHandle, &retTransferOpFlag,
176 &retTableType);
177
178 ASSERT_EQ(rc, PLDM_SUCCESS);
179 ASSERT_EQ(transferHandle, retTransferHandle);
180 ASSERT_EQ(transferOpFlag, retTransferOpFlag);
181 ASSERT_EQ(tableType, retTableType);
182}
183
184TEST(GetBIOSTable, testBadDecodeRequest)
185{
186 const auto hdr_size = sizeof(pldm_msg_hdr);
187 std::array<uint8_t, hdr_size + PLDM_GET_BIOS_TABLE_REQ_BYTES> requestMsg{};
188 uint32_t transferHandle = 31;
189 uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
190 uint8_t tableType = PLDM_BIOS_ATTR_TABLE;
191 uint32_t retTransferHandle = 0;
192 uint8_t retTransferOpFlag = 0;
193 uint8_t retTableType = 0;
194
195 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
196 struct pldm_get_bios_table_req* request =
197 reinterpret_cast<struct pldm_get_bios_table_req*>(req->payload);
198
199 request->transfer_handle = transferHandle;
200 request->transfer_op_flag = transferOpFlag;
201 request->table_type = tableType;
202
203 auto rc = decode_get_bios_table_req(req, requestMsg.size() - hdr_size - 3,
204 &retTransferHandle, &retTransferOpFlag,
205 &retTableType);
206
207 ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
208}