blob: affa305078b1ba552fbaf8b173a4f9e43500ce7b [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.
3 *
4 * Author: Lawrence.Tang@arm.com
5 **/
6
Lawrence Tang40519cb2022-08-24 15:50:08 +01007#include <ctype.h>
Lawrence Tangd34f2b12022-07-19 15:36:31 +01008#include "gtest/gtest.h"
9#include "test-utils.hpp"
10extern "C" {
Lawrence Tang5202bbb2022-08-12 14:54:36 +010011#include <json.h>
Lawrence Tangd34f2b12022-07-19 15:36:31 +010012#include "../cper-parse.h"
13#include "../json-schema.h"
14#include "../generator/cper-generate.h"
Lawrence Tang580423f2022-08-24 09:37:53 +010015#include "../sections/cper-section.h"
Lawrence Tang40519cb2022-08-24 15:50:08 +010016#include "../generator/sections/gen-section.h"
Lawrence Tangd34f2b12022-07-19 15:36:31 +010017}
18
19/*
20* Test templates.
21*/
Lawrence Tangcd505202022-07-19 16:55:11 +010022
23//Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
Lawrence Tanga4f662f2022-08-08 14:37:36 +010024void cper_log_section_ir_test(const char *section_name, int single_section)
Lawrence Tangd34f2b12022-07-19 15:36:31 +010025{
Lawrence Tanga4f662f2022-08-08 14:37:36 +010026 //Generate full CPER record for the given type.
Lawrence Tange407b4c2022-07-21 13:54:01 +010027 char *buf;
28 size_t size;
Lawrence Tanga4f662f2022-08-08 14:37:36 +010029 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
30 single_section);
Lawrence Tangd34f2b12022-07-19 15:36:31 +010031
Lawrence Tange407b4c2022-07-21 13:54:01 +010032 //Convert to IR, free resources.
Lawrence Tanga4f662f2022-08-08 14:37:36 +010033 json_object *ir;
34 if (single_section)
35 ir = cper_single_section_to_ir(record);
36 else
37 ir = cper_to_ir(record);
Lawrence Tange407b4c2022-07-21 13:54:01 +010038 fclose(record);
39 free(buf);
Lawrence Tangd34f2b12022-07-19 15:36:31 +010040
Lawrence Tange407b4c2022-07-21 13:54:01 +010041 //Validate against schema.
42 char error_message[JSON_ERROR_MSG_MAX_LEN] = { 0 };
43 int valid = validate_schema_from_file("./specification/cper-json.json",
44 ir, error_message);
Lawrence Tanga4f662f2022-08-08 14:37:36 +010045 ASSERT_TRUE(valid)
46 << "IR validation test failed (single section mode = "
47 << single_section << ") with message: " << error_message;
Lawrence Tangd34f2b12022-07-19 15:36:31 +010048}
49
Lawrence Tangcd505202022-07-19 16:55:11 +010050//Checks for binary round-trip equality for a given randomly generated CPER record.
Lawrence Tanga4f662f2022-08-08 14:37:36 +010051void cper_log_section_binary_test(const char *section_name, int single_section)
Lawrence Tangcd505202022-07-19 16:55:11 +010052{
Lawrence Tange407b4c2022-07-21 13:54:01 +010053 //Generate CPER record for the given type.
54 char *buf;
55 size_t size;
Lawrence Tanga4f662f2022-08-08 14:37:36 +010056 FILE *record = generate_record_memstream(&section_name, 1, &buf, &size,
57 single_section);
Lawrence Tangcd505202022-07-19 16:55:11 +010058
Lawrence Tanga4f662f2022-08-08 14:37:36 +010059 //Convert to IR.
60 json_object *ir;
61 if (single_section)
62 ir = cper_single_section_to_ir(record);
63 else
64 ir = cper_to_ir(record);
65
66 //Now convert back to binary, and get a stream out.
Lawrence Tange407b4c2022-07-21 13:54:01 +010067 char *cper_buf;
68 size_t cper_buf_size;
69 FILE *stream = open_memstream(&cper_buf, &cper_buf_size);
Lawrence Tanga4f662f2022-08-08 14:37:36 +010070 if (single_section)
71 ir_single_section_to_cper(ir, stream);
72 else
73 ir_to_cper(ir, stream);
Lawrence Tange407b4c2022-07-21 13:54:01 +010074 size_t cper_len = ftell(stream);
75 fclose(stream);
Lawrence Tangcd505202022-07-19 16:55:11 +010076
Lawrence Tange407b4c2022-07-21 13:54:01 +010077 //Validate the two are identical.
78 ASSERT_GE(size, cper_len);
79 ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0)
Lawrence Tanga4f662f2022-08-08 14:37:36 +010080 << "Binary output was not identical to input (single section mode = "
81 << single_section << ").";
Lawrence Tange407b4c2022-07-21 13:54:01 +010082
83 //Free everything up.
84 fclose(record);
85 free(buf);
86 free(cper_buf);
Lawrence Tangcd505202022-07-19 16:55:11 +010087}
88
Lawrence Tanga4f662f2022-08-08 14:37:36 +010089//Tests randomly generated CPER sections for IR validity of a given type, in both single section mode and full CPER log mode.
90void cper_log_section_dual_ir_test(const char *section_name)
91{
92 cper_log_section_ir_test(section_name, 0);
93 cper_log_section_ir_test(section_name, 1);
94}
95
96//Tests randomly generated CPER sections for binary compatibility of a given type, in both single section mode and full CPER log mode.
97void cper_log_section_dual_binary_test(const char *section_name)
98{
99 cper_log_section_binary_test(section_name, 0);
100 cper_log_section_binary_test(section_name, 1);
101}
102
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100103/*
Lawrence Tang580423f2022-08-24 09:37:53 +0100104* Non-single section assertions.
105*/
106TEST(CompileTimeAssertions, TwoWayConversion)
107{
Lawrence Tang40519cb2022-08-24 15:50:08 +0100108 for (int i = 0; i < section_definitions_len; i++) {
Lawrence Tang580423f2022-08-24 09:37:53 +0100109 //If a conversion one way exists, a conversion the other way must exist.
Lawrence Tang40519cb2022-08-24 15:50:08 +0100110 std::string err =
111 "If a CPER conversion exists one way, there must be an equivalent method in reverse.";
Lawrence Tang580423f2022-08-24 09:37:53 +0100112 if (section_definitions[i].ToCPER != NULL)
113 ASSERT_NE(section_definitions[i].ToIR, NULL) << err;
114 if (section_definitions[i].ToIR != NULL)
115 ASSERT_NE(section_definitions[i].ToCPER, NULL) << err;
116 }
117}
118
Lawrence Tang40519cb2022-08-24 15:50:08 +0100119TEST(CompileTimeAssertions, ShortcodeNoSpaces)
120{
121 for (int i = 0; i < generator_definitions_len; i++) {
122 for (int j = 0;
123 generator_definitions[i].ShortName[j + 1] != '\0'; j++) {
124 ASSERT_FALSE(
125 isspace(generator_definitions[i].ShortName[j]))
126 << "Illegal space character detected in shortcode '"
127 << generator_definitions[i].ShortName << "'.";
128 }
129 }
130}
131
Lawrence Tang580423f2022-08-24 09:37:53 +0100132/*
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100133* Single section tests.
134*/
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100135
Lawrence Tangcd505202022-07-19 16:55:11 +0100136//Generic processor tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100137TEST(GenericProcessorTests, IRValid)
138{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100139 cper_log_section_dual_ir_test("generic");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100140}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100141TEST(GenericProcessorTests, BinaryEqual)
142{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100143 cper_log_section_dual_binary_test("generic");
Lawrence Tangcd505202022-07-19 16:55:11 +0100144}
145
146//IA32/x64 tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100147TEST(IA32x64Tests, IRValid)
148{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100149 cper_log_section_dual_ir_test("ia32x64");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100150}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100151TEST(IA32x64Tests, BinaryEqual)
152{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100153 cper_log_section_dual_binary_test("ia32x64");
Lawrence Tangcd505202022-07-19 16:55:11 +0100154}
155
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100156// TEST(IPFTests, IRValid) {
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100157// cper_log_section_dual_ir_test("ipf");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100158// }
Lawrence Tangcd505202022-07-19 16:55:11 +0100159
160//ARM tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100161TEST(ArmTests, IRValid)
162{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100163 cper_log_section_dual_ir_test("arm");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100164}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100165TEST(ArmTests, BinaryEqual)
166{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100167 cper_log_section_dual_binary_test("arm");
Lawrence Tangcd505202022-07-19 16:55:11 +0100168}
169
170//Memory tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100171TEST(MemoryTests, IRValid)
172{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100173 cper_log_section_dual_ir_test("memory");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100174}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100175TEST(MemoryTests, BinaryEqual)
176{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100177 cper_log_section_dual_binary_test("memory");
Lawrence Tangcd505202022-07-19 16:55:11 +0100178}
179
180//Memory 2 tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100181TEST(Memory2Tests, IRValid)
182{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100183 cper_log_section_dual_ir_test("memory2");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100184}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100185TEST(Memory2Tests, BinaryEqual)
186{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100187 cper_log_section_dual_binary_test("memory2");
Lawrence Tangcd505202022-07-19 16:55:11 +0100188}
189
190//PCIe tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100191TEST(PCIeTests, IRValid)
192{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100193 cper_log_section_dual_ir_test("pcie");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100194}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100195TEST(PCIeTests, BinaryEqual)
196{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100197 cper_log_section_dual_binary_test("pcie");
Lawrence Tangcd505202022-07-19 16:55:11 +0100198}
199
200//Firmware tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100201TEST(FirmwareTests, IRValid)
202{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100203 cper_log_section_dual_ir_test("firmware");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100204}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100205TEST(FirmwareTests, BinaryEqual)
206{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100207 cper_log_section_dual_binary_test("firmware");
Lawrence Tangcd505202022-07-19 16:55:11 +0100208}
209
210//PCI Bus tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100211TEST(PCIBusTests, IRValid)
212{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100213 cper_log_section_dual_ir_test("pcibus");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100214}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100215TEST(PCIBusTests, BinaryEqual)
216{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100217 cper_log_section_dual_binary_test("pcibus");
Lawrence Tangcd505202022-07-19 16:55:11 +0100218}
219
220//PCI Device tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100221TEST(PCIDevTests, IRValid)
222{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100223 cper_log_section_dual_ir_test("pcidev");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100224}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100225TEST(PCIDevTests, BinaryEqual)
226{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100227 cper_log_section_dual_binary_test("pcidev");
Lawrence Tangcd505202022-07-19 16:55:11 +0100228}
229
230//Generic DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100231TEST(DMArGenericTests, IRValid)
232{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100233 cper_log_section_dual_ir_test("dmargeneric");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100234}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100235TEST(DMArGenericTests, BinaryEqual)
236{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100237 cper_log_section_dual_binary_test("dmargeneric");
Lawrence Tangcd505202022-07-19 16:55:11 +0100238}
239
240//VT-d DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100241TEST(DMArVtdTests, IRValid)
242{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100243 cper_log_section_dual_ir_test("dmarvtd");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100244}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100245TEST(DMArVtdTests, BinaryEqual)
246{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100247 cper_log_section_dual_binary_test("dmarvtd");
Lawrence Tangcd505202022-07-19 16:55:11 +0100248}
249
250//IOMMU DMAr tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100251TEST(DMArIOMMUTests, IRValid)
252{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100253 cper_log_section_dual_ir_test("dmariommu");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100254}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100255TEST(DMArIOMMUTests, BinaryEqual)
256{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100257 cper_log_section_dual_binary_test("dmariommu");
Lawrence Tangcd505202022-07-19 16:55:11 +0100258}
259
260//CCIX PER tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100261TEST(CCIXPERTests, IRValid)
262{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100263 cper_log_section_dual_ir_test("ccixper");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100264}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100265TEST(CCIXPERTests, BinaryEqual)
266{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100267 cper_log_section_dual_binary_test("ccixper");
Lawrence Tangcd505202022-07-19 16:55:11 +0100268}
269
270//CXL Protocol tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100271TEST(CXLProtocolTests, IRValid)
272{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100273 cper_log_section_dual_ir_test("cxlprotocol");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100274}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100275TEST(CXLProtocolTests, BinaryEqual)
276{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100277 cper_log_section_dual_binary_test("cxlprotocol");
Lawrence Tangcd505202022-07-19 16:55:11 +0100278}
279
280//CXL Component tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100281TEST(CXLComponentTests, IRValid)
282{
Lawrence Tang8f977452022-08-24 14:55:07 +0100283 cper_log_section_dual_ir_test("cxlcomponent-media");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100284}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100285TEST(CXLComponentTests, BinaryEqual)
286{
Lawrence Tang8f977452022-08-24 14:55:07 +0100287 cper_log_section_dual_binary_test("cxlcomponent-media");
Lawrence Tangcd505202022-07-19 16:55:11 +0100288}
289
290//Unknown section tests.
Lawrence Tange407b4c2022-07-21 13:54:01 +0100291TEST(UnknownSectionTests, IRValid)
292{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100293 cper_log_section_dual_ir_test("unknown");
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100294}
Lawrence Tange407b4c2022-07-21 13:54:01 +0100295TEST(UnknownSectionTests, BinaryEqual)
296{
Lawrence Tanga4f662f2022-08-08 14:37:36 +0100297 cper_log_section_dual_binary_test("unknown");
Lawrence Tangcd505202022-07-19 16:55:11 +0100298}
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100299
300//Entrypoint for the testing program.
301int main()
302{
Lawrence Tange407b4c2022-07-21 13:54:01 +0100303 testing::InitGoogleTest();
304 return RUN_ALL_TESTS();
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100305}