blob: d255353d945471eecb7ec1380918cae7c44a8a29 [file] [log] [blame]
Lawrence Tangd34f2b12022-07-19 15:36:31 +01001/**
2 * Defines tests for validating CPER-JSON IR output from the cper-parse library.
Ed Tanousfedd4572024-07-12 13:56:00 -07003 *
Lawrence Tangd34f2b12022-07-19 15:36:31 +01004 * Author: Lawrence.Tang@arm.com
5 **/
6
John Chungf8fc7052024-05-03 20:05:29 +08007#include <cctype>
Lawrence Tangd34f2b12022-07-19 15:36:31 +01008#include "gtest/gtest.h"
9#include "test-utils.hpp"
Lawrence Tang5202bbb2022-08-12 14:54:36 +010010#include <json.h>
Ed Tanousa2dce4b2025-03-05 15:33:06 -080011#include <charconv>
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080012#include <nlohmann/json.hpp>
13#include <filesystem>
14#include <fstream>
Thu Nguyene42fb482024-10-15 14:43:11 +000015#include <libcper/cper-parse.h>
16#include <libcper/json-schema.h>
17#include <libcper/generator/cper-generate.h>
18#include <libcper/sections/cper-section.h>
19#include <libcper/generator/sections/gen-section.h>
Ed Tanousa2dce4b2025-03-05 15:33:06 -080020#include <format>
Lawrence Tangd34f2b12022-07-19 15:36:31 +010021
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080022namespace fs = std::filesystem;
23
Lawrence Tangd34f2b12022-07-19 15:36:31 +010024/*
25* Test templates.
26*/
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080027static const GEN_VALID_BITS_TEST_TYPE allValidbitsSet = ALL_VALID;
28static const GEN_VALID_BITS_TEST_TYPE fixedValidbitsSet = SOME_VALID;
29static const int GEN_EXAMPLES = 0;
30
31void cper_create_examples(const char *section_name)
32{
33 //Generate full CPER record for the given type.
34 fs::path file_path = LIBCPER_EXAMPLES;
35 file_path /= section_name;
Ed Tanousa2dce4b2025-03-05 15:33:06 -080036 fs::path cper_out = file_path.replace_extension("cperhex");
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080037 fs::path json_out = file_path.replace_extension("json");
38
39 char *buf;
40 size_t size;
41 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
42 0, fixedValidbitsSet);
43
44 // Write example CPER to disk
45 std::ofstream outFile(cper_out, std::ios::binary);
46 if (!outFile.is_open()) {
47 std::cerr << "Failed to create/open CPER output file: "
48 << cper_out << std::endl;
49 return;
50 }
51
Ed Tanousa2dce4b2025-03-05 15:33:06 -080052 std::vector<unsigned char> file_data;
53 fseek(record, 0, SEEK_END);
54 size_t file_size = ftell(record);
55 rewind(record);
56 file_data.resize(file_size);
57 if (fread(file_data.data(), 1, file_data.size(), record) != file_size) {
58 std::cerr << "Failed to read CPER data from memstream."
59 << std::endl;
60 FAIL();
61 return;
62 }
63 for (size_t index = 0; index < file_data.size(); index++) {
64 outFile << std::format("{:02x}", file_data[index]);
65 if (index % 30 == 29) {
66 outFile << "\n";
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080067 }
68 }
69 outFile.close();
70
71 //Convert to IR, free resources.
72 rewind(record);
73 json_object *ir = cper_to_ir(record);
74 if (ir == NULL) {
75 std::cerr << "Empty JSON from CPER bin" << std::endl;
76 FAIL();
77 return;
78 }
79 char *str = strdup(json_object_to_json_string(ir));
80 nlohmann::json jsonData = nlohmann::json::parse(str, nullptr, false);
81 if (jsonData.is_discarded()) {
82 std::cerr << "cper_create_examples: JSON parse error:"
83 << std::endl;
84 }
85 free(str);
86 fclose(record);
87 free(buf);
88
89 //Write json output to disk
90 std::ofstream jsonOutFile(json_out);
91 jsonOutFile << std::setw(4) << jsonData << std::endl;
92 jsonOutFile.close();
93}
94
Ed Tanousa2dce4b2025-03-05 15:33:06 -080095std::vector<unsigned char> string_to_binary(const std::string &source)
96{
97 std::vector<unsigned char> retval;
98 bool uppernibble = true;
99 for (const char c : source) {
100 unsigned char val = 0;
101 if (c == '\n') {
102 continue;
103 }
104 std::from_chars_result r = std::from_chars(&c, &c + 1, val, 16);
105 EXPECT_TRUE(r.ec == std::error_code())
106 << "Invalid hex character in test file: " << c;
107
108 if (uppernibble) {
109 retval.push_back(val << 4);
110 } else {
111 retval.back() += val;
112 }
113 uppernibble = !uppernibble;
114 }
115 return retval;
116}
117
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800118//Tests fixed CPER sections for IR validity with an example set.
119void cper_example_section_ir_test(const char *section_name)
120{
121 //Open CPER record for the given type.
122 fs::path fpath = LIBCPER_EXAMPLES;
123 fpath /= section_name;
Ed Tanousa2dce4b2025-03-05 15:33:06 -0800124 fs::path cper = fpath.replace_extension("cperhex");
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800125 fs::path json = fpath.replace_extension("json");
126
Ed Tanousa2dce4b2025-03-05 15:33:06 -0800127 std::ifstream cper_file(cper, std::ios::binary);
128 if (!cper_file.is_open()) {
129 std::cerr << "Failed to open CPER file: " << cper << std::endl;
130 FAIL() << "Failed to open CPER file";
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800131 return;
132 }
Ed Tanousa2dce4b2025-03-05 15:33:06 -0800133 std::string cper_str((std::istreambuf_iterator<char>(cper_file)),
134 std::istreambuf_iterator<char>());
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800135
Ed Tanousa2dce4b2025-03-05 15:33:06 -0800136 std::vector<unsigned char> cper_bin = string_to_binary(cper_str);
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800137 //Convert to IR, free resources.
Ed Tanousa2dce4b2025-03-05 15:33:06 -0800138 json_object *ir = cper_buf_to_ir(cper_bin.data(), cper_bin.size());
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800139 if (ir == NULL) {
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800140 std::cerr << "Empty JSON from CPER bin" << std::endl;
141 FAIL();
142 return;
143 }
144 const char *str = json_object_to_json_string(ir);
145 nlohmann::json jsonData = nlohmann::json::parse(str, nullptr, false);
146 if (jsonData.is_discarded()) {
147 std::cerr << "cper_example_section_ir_test: JSON parse error:"
148 << std::endl;
149 FAIL() << "cper_example_section_ir_test: JSON parse error:";
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800150 json_object_put(ir);
151
152 return;
153 }
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800154
155 //Open json example file
156 nlohmann::json jGolden = loadJson(json.string().c_str());
157 if (jGolden.is_discarded()) {
158 std::cerr << "Could not open JSON example file: " << json
159 << std::endl;
160 FAIL() << "Could not open JSON example file";
161 }
162
163 json_object_put(ir);
164
165 EXPECT_EQ(jGolden, jsonData);
166}
Lawrence Tangcd505202022-07-19 16:55:11 +0100167
168//Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800169void cper_log_section_ir_test(const char *section_name, int single_section,
170 GEN_VALID_BITS_TEST_TYPE validBitsType)
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100171{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100172 //Generate full CPER record for the given type.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100173 char *buf;
174 size_t size;
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100175 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800176 single_section, validBitsType);
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100177
Lawrence Tange407b4c2022-07-21 13:54:01 +0100178 //Convert to IR, free resources.
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100179 json_object *ir;
John Chungf8fc7052024-05-03 20:05:29 +0800180 if (single_section) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100181 ir = cper_single_section_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800182 } else {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100183 ir = cper_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800184 }
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800185
186 char *str = strdup(json_object_to_json_string(ir));
187 nlohmann::json jsonData = nlohmann::json::parse(str, nullptr, false);
188 if (jsonData.is_discarded()) {
189 std::cerr << "Could not parse json output" << std::endl;
190 }
191 free(str);
Lawrence Tange407b4c2022-07-21 13:54:01 +0100192 fclose(record);
193 free(buf);
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100194
Lawrence Tange407b4c2022-07-21 13:54:01 +0100195 //Validate against schema.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800196 std::string error_message;
Ed Tanousd6b62632025-03-14 15:30:07 -0700197 std::unique_ptr<valijson::Schema> schema =
198 load_schema(AddRequiredProps::YES, single_section);
199 int valid = schema_validate_from_file(*schema, jsonData, error_message);
John Chungf8fc7052024-05-03 20:05:29 +0800200 json_object_put(ir);
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100201 ASSERT_TRUE(valid)
202 << "IR validation test failed (single section mode = "
Ed Tanousd6b62632025-03-14 15:30:07 -0700203 << single_section << ") with message: " << error_message
204 << jsonData.dump(4) << "\n";
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100205}
206
Ed Tanous50b966f2025-03-11 09:06:19 -0700207std::string to_hex(char *input, size_t size)
208{
209 std::string out;
210 for (char c : std::span<unsigned char>((unsigned char *)input, size)) {
211 out += std::format("{:02x}", static_cast<unsigned char>(c));
212 }
213 return out;
214}
215
Lawrence Tangcd505202022-07-19 16:55:11 +0100216//Checks for binary round-trip equality for a given randomly generated CPER record.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800217void cper_log_section_binary_test(const char *section_name, int single_section,
218 GEN_VALID_BITS_TEST_TYPE validBitsType)
Lawrence Tangcd505202022-07-19 16:55:11 +0100219{
Lawrence Tange407b4c2022-07-21 13:54:01 +0100220 //Generate CPER record for the given type.
221 char *buf;
222 size_t size;
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100223 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800224 single_section, validBitsType);
225 if (record == NULL) {
226 std::cerr << "Could not generate memstream for binary test"
227 << std::endl;
228 return;
229 }
Lawrence Tangcd505202022-07-19 16:55:11 +0100230
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100231 //Convert to IR.
232 json_object *ir;
John Chungf8fc7052024-05-03 20:05:29 +0800233 if (single_section) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100234 ir = cper_single_section_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800235 } else {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100236 ir = cper_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800237 }
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100238
239 //Now convert back to binary, and get a stream out.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100240 char *cper_buf;
241 size_t cper_buf_size;
242 FILE *stream = open_memstream(&cper_buf, &cper_buf_size);
John Chungf8fc7052024-05-03 20:05:29 +0800243 if (single_section) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100244 ir_single_section_to_cper(ir, stream);
John Chungf8fc7052024-05-03 20:05:29 +0800245 } else {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100246 ir_to_cper(ir, stream);
John Chungf8fc7052024-05-03 20:05:29 +0800247 }
Lawrence Tange407b4c2022-07-21 13:54:01 +0100248 fclose(stream);
Lawrence Tangcd505202022-07-19 16:55:11 +0100249
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800250 std::cout << "size: " << size << ", cper_buf_size: " << cper_buf_size
251 << std::endl;
Ed Tanous50b966f2025-03-11 09:06:19 -0700252 EXPECT_EQ(to_hex(buf, size),
253 to_hex(cper_buf, std::min(size, cper_buf_size)))
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100254 << "Binary output was not identical to input (single section mode = "
255 << single_section << ").";
Lawrence Tange407b4c2022-07-21 13:54:01 +0100256
257 //Free everything up.
258 fclose(record);
259 free(buf);
260 free(cper_buf);
John Chungf8fc7052024-05-03 20:05:29 +0800261 json_object_put(ir);
Lawrence Tangcd505202022-07-19 16:55:11 +0100262}
263
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100264//Tests randomly generated CPER sections for IR validity of a given type, in both single section mode and full CPER log mode.
265void cper_log_section_dual_ir_test(const char *section_name)
266{
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800267 cper_log_section_ir_test(section_name, 0, allValidbitsSet);
268 cper_log_section_ir_test(section_name, 1, allValidbitsSet);
269 //Validate against examples
270 cper_example_section_ir_test(section_name);
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100271}
272
273//Tests randomly generated CPER sections for binary compatibility of a given type, in both single section mode and full CPER log mode.
274void cper_log_section_dual_binary_test(const char *section_name)
275{
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800276 cper_log_section_binary_test(section_name, 0, allValidbitsSet);
277 cper_log_section_binary_test(section_name, 1, allValidbitsSet);
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100278}
279
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100280/*
Lawrence Tang580423f2022-08-24 09:37:53 +0100281* Non-single section assertions.
282*/
283TEST(CompileTimeAssertions, TwoWayConversion)
284{
John Chungf8fc7052024-05-03 20:05:29 +0800285 for (size_t i = 0; i < section_definitions_len; i++) {
Lawrence Tang580423f2022-08-24 09:37:53 +0100286 //If a conversion one way exists, a conversion the other way must exist.
Lawrence Tang40519cb2022-08-24 15:50:08 +0100287 std::string err =
288 "If a CPER conversion exists one way, there must be an equivalent method in reverse.";
John Chungf8fc7052024-05-03 20:05:29 +0800289 if (section_definitions[i].ToCPER != NULL) {
290 ASSERT_NE(section_definitions[i].ToIR, nullptr) << err;
291 }
292 if (section_definitions[i].ToIR != NULL) {
293 ASSERT_NE(section_definitions[i].ToCPER, nullptr)
294 << err;
295 }
Lawrence Tang580423f2022-08-24 09:37:53 +0100296 }
297}
298
Lawrence Tang40519cb2022-08-24 15:50:08 +0100299TEST(CompileTimeAssertions, ShortcodeNoSpaces)
300{
John Chungf8fc7052024-05-03 20:05:29 +0800301 for (size_t i = 0; i < generator_definitions_len; i++) {
Lawrence Tang40519cb2022-08-24 15:50:08 +0100302 for (int j = 0;
303 generator_definitions[i].ShortName[j + 1] != '\0'; j++) {
304 ASSERT_FALSE(
305 isspace(generator_definitions[i].ShortName[j]))
306 << "Illegal space character detected in shortcode '"
307 << generator_definitions[i].ShortName << "'.";
308 }
309 }
310}
311
Lawrence Tang580423f2022-08-24 09:37:53 +0100312/*
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100313* Single section tests.
314*/
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100315
Lawrence Tangcd505202022-07-19 16:55:11 +0100316//Generic processor tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100317TEST(GenericProcessorTests, IRValid)
318{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100319 cper_log_section_dual_ir_test("generic");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100320}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100321TEST(GenericProcessorTests, BinaryEqual)
322{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100323 cper_log_section_dual_binary_test("generic");
Lawrence Tangcd505202022-07-19 16:55:11 +0100324}
325
326//IA32/x64 tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100327TEST(IA32x64Tests, IRValid)
328{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100329 cper_log_section_dual_ir_test("ia32x64");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100330}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100331TEST(IA32x64Tests, BinaryEqual)
332{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100333 cper_log_section_dual_binary_test("ia32x64");
Lawrence Tangcd505202022-07-19 16:55:11 +0100334}
335
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100336// TEST(IPFTests, IRValid) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100337// cper_log_section_dual_ir_test("ipf");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100338// }
Lawrence Tangcd505202022-07-19 16:55:11 +0100339
340//ARM tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100341TEST(ArmTests, IRValid)
342{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100343 cper_log_section_dual_ir_test("arm");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100344}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100345TEST(ArmTests, BinaryEqual)
346{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100347 cper_log_section_dual_binary_test("arm");
Lawrence Tangcd505202022-07-19 16:55:11 +0100348}
349
350//Memory tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100351TEST(MemoryTests, IRValid)
352{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100353 cper_log_section_dual_ir_test("memory");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100354}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100355TEST(MemoryTests, BinaryEqual)
356{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100357 cper_log_section_dual_binary_test("memory");
Lawrence Tangcd505202022-07-19 16:55:11 +0100358}
359
360//Memory 2 tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100361TEST(Memory2Tests, IRValid)
362{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100363 cper_log_section_dual_ir_test("memory2");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100364}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100365TEST(Memory2Tests, BinaryEqual)
366{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100367 cper_log_section_dual_binary_test("memory2");
Lawrence Tangcd505202022-07-19 16:55:11 +0100368}
369
370//PCIe tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100371TEST(PCIeTests, IRValid)
372{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100373 cper_log_section_dual_ir_test("pcie");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100374}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100375TEST(PCIeTests, BinaryEqual)
376{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100377 cper_log_section_dual_binary_test("pcie");
Lawrence Tangcd505202022-07-19 16:55:11 +0100378}
379
380//Firmware tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100381TEST(FirmwareTests, IRValid)
382{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100383 cper_log_section_dual_ir_test("firmware");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100384}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100385TEST(FirmwareTests, BinaryEqual)
386{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100387 cper_log_section_dual_binary_test("firmware");
Lawrence Tangcd505202022-07-19 16:55:11 +0100388}
389
390//PCI Bus tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100391TEST(PCIBusTests, IRValid)
392{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100393 cper_log_section_dual_ir_test("pcibus");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100394}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100395TEST(PCIBusTests, BinaryEqual)
396{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100397 cper_log_section_dual_binary_test("pcibus");
Lawrence Tangcd505202022-07-19 16:55:11 +0100398}
399
400//PCI Device tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100401TEST(PCIDevTests, IRValid)
402{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100403 cper_log_section_dual_ir_test("pcidev");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100404}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100405TEST(PCIDevTests, BinaryEqual)
406{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100407 cper_log_section_dual_binary_test("pcidev");
Lawrence Tangcd505202022-07-19 16:55:11 +0100408}
409
410//Generic DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100411TEST(DMArGenericTests, IRValid)
412{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100413 cper_log_section_dual_ir_test("dmargeneric");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100414}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100415TEST(DMArGenericTests, BinaryEqual)
416{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100417 cper_log_section_dual_binary_test("dmargeneric");
Lawrence Tangcd505202022-07-19 16:55:11 +0100418}
419
420//VT-d DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100421TEST(DMArVtdTests, IRValid)
422{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100423 cper_log_section_dual_ir_test("dmarvtd");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100424}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100425TEST(DMArVtdTests, BinaryEqual)
426{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100427 cper_log_section_dual_binary_test("dmarvtd");
Lawrence Tangcd505202022-07-19 16:55:11 +0100428}
429
430//IOMMU DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100431TEST(DMArIOMMUTests, IRValid)
432{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100433 cper_log_section_dual_ir_test("dmariommu");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100434}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100435TEST(DMArIOMMUTests, BinaryEqual)
436{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100437 cper_log_section_dual_binary_test("dmariommu");
Lawrence Tangcd505202022-07-19 16:55:11 +0100438}
439
440//CCIX PER tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100441TEST(CCIXPERTests, IRValid)
442{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100443 cper_log_section_dual_ir_test("ccixper");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100444}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100445TEST(CCIXPERTests, BinaryEqual)
446{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100447 cper_log_section_dual_binary_test("ccixper");
Lawrence Tangcd505202022-07-19 16:55:11 +0100448}
449
450//CXL Protocol tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100451TEST(CXLProtocolTests, IRValid)
452{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100453 cper_log_section_dual_ir_test("cxlprotocol");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100454}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100455TEST(CXLProtocolTests, BinaryEqual)
456{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100457 cper_log_section_dual_binary_test("cxlprotocol");
Lawrence Tangcd505202022-07-19 16:55:11 +0100458}
459
460//CXL Component tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100461TEST(CXLComponentTests, IRValid)
462{
Lawrence Tang8f977452022-08-24 14:55:07 +0100463 cper_log_section_dual_ir_test("cxlcomponent-media");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100464}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100465TEST(CXLComponentTests, BinaryEqual)
466{
Lawrence Tang8f977452022-08-24 14:55:07 +0100467 cper_log_section_dual_binary_test("cxlcomponent-media");
Lawrence Tangcd505202022-07-19 16:55:11 +0100468}
469
Ed Tanous2d17ace2024-08-27 14:45:38 -0700470//NVIDIA section tests.
471TEST(NVIDIASectionTests, IRValid)
472{
473 cper_log_section_dual_ir_test("nvidia");
474}
475TEST(NVIDIASectionTests, BinaryEqual)
476{
477 cper_log_section_dual_binary_test("nvidia");
478}
479
Lawrence Tangcd505202022-07-19 16:55:11 +0100480//Unknown section tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100481TEST(UnknownSectionTests, IRValid)
482{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100483 cper_log_section_dual_ir_test("unknown");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100484}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100485TEST(UnknownSectionTests, BinaryEqual)
486{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100487 cper_log_section_dual_binary_test("unknown");
Lawrence Tangcd505202022-07-19 16:55:11 +0100488}
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100489
490//Entrypoint for the testing program.
491int main()
492{
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800493 if (GEN_EXAMPLES) {
494 cper_create_examples("arm");
495 cper_create_examples("ia32x64");
496 cper_create_examples("memory");
497 cper_create_examples("memory2");
498 cper_create_examples("pcie");
499 cper_create_examples("firmware");
500 cper_create_examples("pcibus");
501 cper_create_examples("pcidev");
502 cper_create_examples("dmargeneric");
503 cper_create_examples("dmarvtd");
504 cper_create_examples("dmariommu");
505 cper_create_examples("ccixper");
506 cper_create_examples("cxlprotocol");
507 cper_create_examples("cxlcomponent-media");
508 cper_create_examples("nvidia");
509 cper_create_examples("unknown");
510 }
Lawrence Tange407b4c2022-07-21 13:54:01 +0100511 testing::InitGoogleTest();
512 return RUN_ALL_TESTS();
John Chungf8fc7052024-05-03 20:05:29 +0800513}