blob: fa1f9f320e2629e6f07bb4f056e4a759f36ea321 [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>
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080011#include <nlohmann/json.hpp>
12#include <filesystem>
13#include <fstream>
Thu Nguyene42fb482024-10-15 14:43:11 +000014#include <libcper/cper-parse.h>
15#include <libcper/json-schema.h>
16#include <libcper/generator/cper-generate.h>
17#include <libcper/sections/cper-section.h>
18#include <libcper/generator/sections/gen-section.h>
Lawrence Tangd34f2b12022-07-19 15:36:31 +010019
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080020namespace fs = std::filesystem;
21
Lawrence Tangd34f2b12022-07-19 15:36:31 +010022/*
23* Test templates.
24*/
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080025static const GEN_VALID_BITS_TEST_TYPE allValidbitsSet = ALL_VALID;
26static const GEN_VALID_BITS_TEST_TYPE fixedValidbitsSet = SOME_VALID;
27static const int GEN_EXAMPLES = 0;
28
29void cper_create_examples(const char *section_name)
30{
31 //Generate full CPER record for the given type.
32 fs::path file_path = LIBCPER_EXAMPLES;
33 file_path /= section_name;
34 fs::path cper_out = file_path.replace_extension("cper");
35 fs::path json_out = file_path.replace_extension("json");
36
37 char *buf;
38 size_t size;
39 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
40 0, fixedValidbitsSet);
41
42 // Write example CPER to disk
43 std::ofstream outFile(cper_out, std::ios::binary);
44 if (!outFile.is_open()) {
45 std::cerr << "Failed to create/open CPER output file: "
46 << cper_out << std::endl;
47 return;
48 }
49
50 char buffer[1024];
51 size_t bytesRead;
52 while ((bytesRead = fread(buffer, 1, sizeof(buffer), record)) > 0) {
53 outFile.write(buffer, bytesRead);
54 if (!outFile) {
55 std::cerr << "Failed to write to output file."
56 << std::endl;
57 outFile.close();
58 return;
59 }
60 }
61 outFile.close();
62
63 //Convert to IR, free resources.
64 rewind(record);
65 json_object *ir = cper_to_ir(record);
66 if (ir == NULL) {
67 std::cerr << "Empty JSON from CPER bin" << std::endl;
68 FAIL();
69 return;
70 }
71 char *str = strdup(json_object_to_json_string(ir));
72 nlohmann::json jsonData = nlohmann::json::parse(str, nullptr, false);
73 if (jsonData.is_discarded()) {
74 std::cerr << "cper_create_examples: JSON parse error:"
75 << std::endl;
76 }
77 free(str);
78 fclose(record);
79 free(buf);
80
81 //Write json output to disk
82 std::ofstream jsonOutFile(json_out);
83 jsonOutFile << std::setw(4) << jsonData << std::endl;
84 jsonOutFile.close();
85}
86
87//Tests fixed CPER sections for IR validity with an example set.
88void cper_example_section_ir_test(const char *section_name)
89{
90 //Open CPER record for the given type.
91 fs::path fpath = LIBCPER_EXAMPLES;
92 fpath /= section_name;
93 fs::path cper = fpath.replace_extension("cper");
94 fs::path json = fpath.replace_extension("json");
95
96 // Do a C style read to obtain FILE*
97 FILE *record = fopen(cper.string().c_str(), "rb");
98 if (record == NULL) {
99 std::cerr
100 << "cper_example_section_ir_test: File cannot be opened/does not exist "
101 << cper << std::endl;
102 FAIL() << "cper_example_section_ir_test: File cannot be opened/does not exist";
103 return;
104 }
105
106 //Convert to IR, free resources.
107 json_object *ir = cper_to_ir(record);
108 if (ir == NULL) {
109 fclose(record);
110 std::cerr << "Empty JSON from CPER bin" << std::endl;
111 FAIL();
112 return;
113 }
114 const char *str = json_object_to_json_string(ir);
115 nlohmann::json jsonData = nlohmann::json::parse(str, nullptr, false);
116 if (jsonData.is_discarded()) {
117 std::cerr << "cper_example_section_ir_test: JSON parse error:"
118 << std::endl;
119 FAIL() << "cper_example_section_ir_test: JSON parse error:";
120 fclose(record);
121 json_object_put(ir);
122
123 return;
124 }
125 fclose(record);
126
127 //Open json example file
128 nlohmann::json jGolden = loadJson(json.string().c_str());
129 if (jGolden.is_discarded()) {
130 std::cerr << "Could not open JSON example file: " << json
131 << std::endl;
132 FAIL() << "Could not open JSON example file";
133 }
134
135 json_object_put(ir);
136
137 EXPECT_EQ(jGolden, jsonData);
138}
Lawrence Tangcd505202022-07-19 16:55:11 +0100139
140//Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800141void cper_log_section_ir_test(const char *section_name, int single_section,
142 GEN_VALID_BITS_TEST_TYPE validBitsType)
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100143{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100144 //Generate full CPER record for the given type.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100145 char *buf;
146 size_t size;
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100147 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800148 single_section, validBitsType);
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100149
Lawrence Tange407b4c2022-07-21 13:54:01 +0100150 //Convert to IR, free resources.
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100151 json_object *ir;
John Chungf8fc7052024-05-03 20:05:29 +0800152 if (single_section) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100153 ir = cper_single_section_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800154 } else {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100155 ir = cper_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800156 }
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800157
158 char *str = strdup(json_object_to_json_string(ir));
159 nlohmann::json jsonData = nlohmann::json::parse(str, nullptr, false);
160 if (jsonData.is_discarded()) {
161 std::cerr << "Could not parse json output" << std::endl;
162 }
163 free(str);
Lawrence Tange407b4c2022-07-21 13:54:01 +0100164 fclose(record);
165 free(buf);
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100166
Lawrence Tange407b4c2022-07-21 13:54:01 +0100167 //Validate against schema.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800168 std::string error_message;
169
170 int valid = schema_validate_from_file(LIBCPER_JSON_SPEC, jsonData,
171 error_message);
John Chungf8fc7052024-05-03 20:05:29 +0800172 json_object_put(ir);
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100173 ASSERT_TRUE(valid)
174 << "IR validation test failed (single section mode = "
175 << single_section << ") with message: " << error_message;
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100176}
177
Lawrence Tangcd505202022-07-19 16:55:11 +0100178//Checks for binary round-trip equality for a given randomly generated CPER record.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800179void cper_log_section_binary_test(const char *section_name, int single_section,
180 GEN_VALID_BITS_TEST_TYPE validBitsType)
Lawrence Tangcd505202022-07-19 16:55:11 +0100181{
Lawrence Tange407b4c2022-07-21 13:54:01 +0100182 //Generate CPER record for the given type.
183 char *buf;
184 size_t size;
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100185 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800186 single_section, validBitsType);
187 if (record == NULL) {
188 std::cerr << "Could not generate memstream for binary test"
189 << std::endl;
190 return;
191 }
Lawrence Tangcd505202022-07-19 16:55:11 +0100192
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100193 //Convert to IR.
194 json_object *ir;
John Chungf8fc7052024-05-03 20:05:29 +0800195 if (single_section) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100196 ir = cper_single_section_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800197 } else {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100198 ir = cper_to_ir(record);
John Chungf8fc7052024-05-03 20:05:29 +0800199 }
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100200
201 //Now convert back to binary, and get a stream out.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100202 char *cper_buf;
203 size_t cper_buf_size;
204 FILE *stream = open_memstream(&cper_buf, &cper_buf_size);
John Chungf8fc7052024-05-03 20:05:29 +0800205 if (single_section) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100206 ir_single_section_to_cper(ir, stream);
John Chungf8fc7052024-05-03 20:05:29 +0800207 } else {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100208 ir_to_cper(ir, stream);
John Chungf8fc7052024-05-03 20:05:29 +0800209 }
Lawrence Tange407b4c2022-07-21 13:54:01 +0100210 fclose(stream);
Lawrence Tangcd505202022-07-19 16:55:11 +0100211
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800212 std::cout << "size: " << size << ", cper_buf_size: " << cper_buf_size
213 << std::endl;
214 EXPECT_EQ(std::string_view(buf, size),
215 std::string_view(cper_buf, std::min(size, cper_buf_size)))
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100216 << "Binary output was not identical to input (single section mode = "
217 << single_section << ").";
Lawrence Tange407b4c2022-07-21 13:54:01 +0100218
219 //Free everything up.
220 fclose(record);
221 free(buf);
222 free(cper_buf);
John Chungf8fc7052024-05-03 20:05:29 +0800223 json_object_put(ir);
Lawrence Tangcd505202022-07-19 16:55:11 +0100224}
225
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100226//Tests randomly generated CPER sections for IR validity of a given type, in both single section mode and full CPER log mode.
227void cper_log_section_dual_ir_test(const char *section_name)
228{
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800229 cper_log_section_ir_test(section_name, 0, allValidbitsSet);
230 cper_log_section_ir_test(section_name, 1, allValidbitsSet);
231 //Validate against examples
232 cper_example_section_ir_test(section_name);
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100233}
234
235//Tests randomly generated CPER sections for binary compatibility of a given type, in both single section mode and full CPER log mode.
236void cper_log_section_dual_binary_test(const char *section_name)
237{
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800238 cper_log_section_binary_test(section_name, 0, allValidbitsSet);
239 cper_log_section_binary_test(section_name, 1, allValidbitsSet);
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100240}
241
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100242/*
Lawrence Tang580423f2022-08-24 09:37:53 +0100243* Non-single section assertions.
244*/
245TEST(CompileTimeAssertions, TwoWayConversion)
246{
John Chungf8fc7052024-05-03 20:05:29 +0800247 for (size_t i = 0; i < section_definitions_len; i++) {
Lawrence Tang580423f2022-08-24 09:37:53 +0100248 //If a conversion one way exists, a conversion the other way must exist.
Lawrence Tang40519cb2022-08-24 15:50:08 +0100249 std::string err =
250 "If a CPER conversion exists one way, there must be an equivalent method in reverse.";
John Chungf8fc7052024-05-03 20:05:29 +0800251 if (section_definitions[i].ToCPER != NULL) {
252 ASSERT_NE(section_definitions[i].ToIR, nullptr) << err;
253 }
254 if (section_definitions[i].ToIR != NULL) {
255 ASSERT_NE(section_definitions[i].ToCPER, nullptr)
256 << err;
257 }
Lawrence Tang580423f2022-08-24 09:37:53 +0100258 }
259}
260
Lawrence Tang40519cb2022-08-24 15:50:08 +0100261TEST(CompileTimeAssertions, ShortcodeNoSpaces)
262{
John Chungf8fc7052024-05-03 20:05:29 +0800263 for (size_t i = 0; i < generator_definitions_len; i++) {
Lawrence Tang40519cb2022-08-24 15:50:08 +0100264 for (int j = 0;
265 generator_definitions[i].ShortName[j + 1] != '\0'; j++) {
266 ASSERT_FALSE(
267 isspace(generator_definitions[i].ShortName[j]))
268 << "Illegal space character detected in shortcode '"
269 << generator_definitions[i].ShortName << "'.";
270 }
271 }
272}
273
Lawrence Tang580423f2022-08-24 09:37:53 +0100274/*
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100275* Single section tests.
276*/
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100277
Lawrence Tangcd505202022-07-19 16:55:11 +0100278//Generic processor tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100279TEST(GenericProcessorTests, IRValid)
280{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100281 cper_log_section_dual_ir_test("generic");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100282}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100283TEST(GenericProcessorTests, BinaryEqual)
284{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100285 cper_log_section_dual_binary_test("generic");
Lawrence Tangcd505202022-07-19 16:55:11 +0100286}
287
288//IA32/x64 tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100289TEST(IA32x64Tests, IRValid)
290{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100291 cper_log_section_dual_ir_test("ia32x64");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100292}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100293TEST(IA32x64Tests, BinaryEqual)
294{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100295 cper_log_section_dual_binary_test("ia32x64");
Lawrence Tangcd505202022-07-19 16:55:11 +0100296}
297
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100298// TEST(IPFTests, IRValid) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100299// cper_log_section_dual_ir_test("ipf");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100300// }
Lawrence Tangcd505202022-07-19 16:55:11 +0100301
302//ARM tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100303TEST(ArmTests, IRValid)
304{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100305 cper_log_section_dual_ir_test("arm");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100306}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100307TEST(ArmTests, BinaryEqual)
308{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100309 cper_log_section_dual_binary_test("arm");
Lawrence Tangcd505202022-07-19 16:55:11 +0100310}
311
312//Memory tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100313TEST(MemoryTests, IRValid)
314{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100315 cper_log_section_dual_ir_test("memory");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100316}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100317TEST(MemoryTests, BinaryEqual)
318{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100319 cper_log_section_dual_binary_test("memory");
Lawrence Tangcd505202022-07-19 16:55:11 +0100320}
321
322//Memory 2 tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100323TEST(Memory2Tests, IRValid)
324{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100325 cper_log_section_dual_ir_test("memory2");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100326}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100327TEST(Memory2Tests, BinaryEqual)
328{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100329 cper_log_section_dual_binary_test("memory2");
Lawrence Tangcd505202022-07-19 16:55:11 +0100330}
331
332//PCIe tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100333TEST(PCIeTests, IRValid)
334{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100335 cper_log_section_dual_ir_test("pcie");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100336}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100337TEST(PCIeTests, BinaryEqual)
338{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100339 cper_log_section_dual_binary_test("pcie");
Lawrence Tangcd505202022-07-19 16:55:11 +0100340}
341
342//Firmware tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100343TEST(FirmwareTests, IRValid)
344{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100345 cper_log_section_dual_ir_test("firmware");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100346}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100347TEST(FirmwareTests, BinaryEqual)
348{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100349 cper_log_section_dual_binary_test("firmware");
Lawrence Tangcd505202022-07-19 16:55:11 +0100350}
351
352//PCI Bus tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100353TEST(PCIBusTests, IRValid)
354{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100355 cper_log_section_dual_ir_test("pcibus");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100356}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100357TEST(PCIBusTests, BinaryEqual)
358{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100359 cper_log_section_dual_binary_test("pcibus");
Lawrence Tangcd505202022-07-19 16:55:11 +0100360}
361
362//PCI Device tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100363TEST(PCIDevTests, IRValid)
364{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100365 cper_log_section_dual_ir_test("pcidev");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100366}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100367TEST(PCIDevTests, BinaryEqual)
368{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100369 cper_log_section_dual_binary_test("pcidev");
Lawrence Tangcd505202022-07-19 16:55:11 +0100370}
371
372//Generic DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100373TEST(DMArGenericTests, IRValid)
374{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100375 cper_log_section_dual_ir_test("dmargeneric");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100376}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100377TEST(DMArGenericTests, BinaryEqual)
378{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100379 cper_log_section_dual_binary_test("dmargeneric");
Lawrence Tangcd505202022-07-19 16:55:11 +0100380}
381
382//VT-d DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100383TEST(DMArVtdTests, IRValid)
384{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100385 cper_log_section_dual_ir_test("dmarvtd");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100386}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100387TEST(DMArVtdTests, BinaryEqual)
388{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100389 cper_log_section_dual_binary_test("dmarvtd");
Lawrence Tangcd505202022-07-19 16:55:11 +0100390}
391
392//IOMMU DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100393TEST(DMArIOMMUTests, IRValid)
394{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100395 cper_log_section_dual_ir_test("dmariommu");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100396}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100397TEST(DMArIOMMUTests, BinaryEqual)
398{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100399 cper_log_section_dual_binary_test("dmariommu");
Lawrence Tangcd505202022-07-19 16:55:11 +0100400}
401
402//CCIX PER tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100403TEST(CCIXPERTests, IRValid)
404{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100405 cper_log_section_dual_ir_test("ccixper");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100406}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100407TEST(CCIXPERTests, BinaryEqual)
408{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100409 cper_log_section_dual_binary_test("ccixper");
Lawrence Tangcd505202022-07-19 16:55:11 +0100410}
411
412//CXL Protocol tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100413TEST(CXLProtocolTests, IRValid)
414{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100415 cper_log_section_dual_ir_test("cxlprotocol");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100416}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100417TEST(CXLProtocolTests, BinaryEqual)
418{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100419 cper_log_section_dual_binary_test("cxlprotocol");
Lawrence Tangcd505202022-07-19 16:55:11 +0100420}
421
422//CXL Component tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100423TEST(CXLComponentTests, IRValid)
424{
Lawrence Tang8f977452022-08-24 14:55:07 +0100425 cper_log_section_dual_ir_test("cxlcomponent-media");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100426}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100427TEST(CXLComponentTests, BinaryEqual)
428{
Lawrence Tang8f977452022-08-24 14:55:07 +0100429 cper_log_section_dual_binary_test("cxlcomponent-media");
Lawrence Tangcd505202022-07-19 16:55:11 +0100430}
431
Ed Tanous2d17ace2024-08-27 14:45:38 -0700432//NVIDIA section tests.
433TEST(NVIDIASectionTests, IRValid)
434{
435 cper_log_section_dual_ir_test("nvidia");
436}
437TEST(NVIDIASectionTests, BinaryEqual)
438{
439 cper_log_section_dual_binary_test("nvidia");
440}
441
Lawrence Tangcd505202022-07-19 16:55:11 +0100442//Unknown section tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100443TEST(UnknownSectionTests, IRValid)
444{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100445 cper_log_section_dual_ir_test("unknown");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100446}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100447TEST(UnknownSectionTests, BinaryEqual)
448{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100449 cper_log_section_dual_binary_test("unknown");
Lawrence Tangcd505202022-07-19 16:55:11 +0100450}
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100451
452//Entrypoint for the testing program.
453int main()
454{
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -0800455 if (GEN_EXAMPLES) {
456 cper_create_examples("arm");
457 cper_create_examples("ia32x64");
458 cper_create_examples("memory");
459 cper_create_examples("memory2");
460 cper_create_examples("pcie");
461 cper_create_examples("firmware");
462 cper_create_examples("pcibus");
463 cper_create_examples("pcidev");
464 cper_create_examples("dmargeneric");
465 cper_create_examples("dmarvtd");
466 cper_create_examples("dmariommu");
467 cper_create_examples("ccixper");
468 cper_create_examples("cxlprotocol");
469 cper_create_examples("cxlcomponent-media");
470 cper_create_examples("nvidia");
471 cper_create_examples("unknown");
472 }
Lawrence Tange407b4c2022-07-21 13:54:01 +0100473 testing::InitGoogleTest();
474 return RUN_ALL_TESTS();
John Chungf8fc7052024-05-03 20:05:29 +0800475}