blob: 6ca44a33739de474b0bd0c6e2fd280c176e34a08 [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
7#include "gtest/gtest.h"
8#include "test-utils.hpp"
9extern "C" {
10#include "json.h"
11#include "../cper-parse.h"
12#include "../json-schema.h"
13#include "../generator/cper-generate.h"
14}
15
16/*
17* Test templates.
18*/
Lawrence Tangcd505202022-07-19 16:55:11 +010019
20//Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010021void single_section_ir_test(const char* section_name)
22{
Lawrence Tangcd505202022-07-19 16:55:11 +010023 //Generate CPER record for the given type.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010024 char* buf;
25 size_t size;
26 FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
27
28 //Convert to IR, free resources.
29 json_object* ir = cper_to_ir(record);
30 fclose(record);
31 free(buf);
32
33 //Validate against schema.
34 char error_message[JSON_ERROR_MSG_MAX_LEN] = {0};
35 int valid = validate_schema_from_file("./specification/cper-json.json", ir, error_message);
36 ASSERT_TRUE(valid) << error_message;
37}
38
Lawrence Tangcd505202022-07-19 16:55:11 +010039//Checks for binary round-trip equality for a given randomly generated CPER record.
40void single_section_binary_test(const char* section_name)
41{
42 //Generate CPER record for the given type.
43 char* buf;
44 size_t size;
45 FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
46
47 //Convert to IR, then back to binary, getting a stream out.
48 json_object* ir = cper_to_ir(record);
49 char* cper_buf;
50 size_t cper_buf_size;
51 FILE* stream = open_memstream(&cper_buf, &cper_buf_size);
52 ir_to_cper(ir, stream);
Lawrence Tangaacf0e22022-07-20 13:28:52 +010053 size_t cper_len = ftell(stream);
Lawrence Tangcd505202022-07-19 16:55:11 +010054 fclose(stream);
55
56 //Validate the two are identical.
Lawrence Tangaacf0e22022-07-20 13:28:52 +010057 ASSERT_GE(size, cper_len);
58 ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0) << "Binary output was not identical to input.";
Lawrence Tangcd505202022-07-19 16:55:11 +010059
60 //Free everything up.
61 fclose(record);
62 free(buf);
63 free(cper_buf);
64}
65
Lawrence Tangd34f2b12022-07-19 15:36:31 +010066/*
67* Single section tests.
68*/
Lawrence Tangcd505202022-07-19 16:55:11 +010069//Generic processor tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010070TEST(GenericProcessorTests, IRValid) {
71 single_section_ir_test("generic");
72}
Lawrence Tangcd505202022-07-19 16:55:11 +010073TEST(GenericProcessorTests, BinaryEqual) {
74 single_section_binary_test("generic");
75}
76
77//IA32/x64 tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010078TEST(IA32x64Tests, IRValid) {
79 single_section_ir_test("ia32x64");
80}
Lawrence Tangcd505202022-07-19 16:55:11 +010081TEST(IA32x64Tests, BinaryEqual) {
82 single_section_binary_test("ia32x64");
83}
84
Lawrence Tangd34f2b12022-07-19 15:36:31 +010085// TEST(IPFTests, IRValid) {
86// single_section_ir_test("ipf");
87// }
Lawrence Tangcd505202022-07-19 16:55:11 +010088
89//ARM tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010090TEST(ArmTests, IRValid) {
91 single_section_ir_test("arm");
92}
Lawrence Tangcd505202022-07-19 16:55:11 +010093TEST(ArmTests, BinaryEqual) {
94 single_section_binary_test("arm");
95}
96
97//Memory tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010098TEST(MemoryTests, IRValid) {
99 single_section_ir_test("memory");
100}
Lawrence Tangcd505202022-07-19 16:55:11 +0100101TEST(MemoryTests, BinaryEqual) {
102 single_section_binary_test("memory");
103}
104
105//Memory 2 tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100106TEST(Memory2Tests, IRValid) {
107 single_section_ir_test("memory2");
108}
Lawrence Tangcd505202022-07-19 16:55:11 +0100109TEST(Memory2Tests, BinaryEqual) {
110 single_section_binary_test("memory2");
111}
112
113//PCIe tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100114TEST(PCIeTests, IRValid) {
115 single_section_ir_test("pcie");
116}
Lawrence Tangcd505202022-07-19 16:55:11 +0100117TEST(PCIeTests, BinaryEqual) {
118 single_section_binary_test("pcie");
119}
120
121//Firmware tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100122TEST(FirmwareTests, IRValid) {
123 single_section_ir_test("firmware");
124}
Lawrence Tangcd505202022-07-19 16:55:11 +0100125TEST(FirmwareTests, BinaryEqual) {
126 single_section_binary_test("firmware");
127}
128
129//PCI Bus tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100130TEST(PCIBusTests, IRValid) {
131 single_section_ir_test("pcibus");
132}
Lawrence Tangcd505202022-07-19 16:55:11 +0100133TEST(PCIBusTests, BinaryEqual) {
134 single_section_binary_test("pcibus");
135}
136
137//PCI Device tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100138TEST(PCIDevTests, IRValid) {
139 single_section_ir_test("pcidev");
140}
Lawrence Tangcd505202022-07-19 16:55:11 +0100141TEST(PCIDevTests, BinaryEqual) {
142 single_section_binary_test("pcidev");
143}
144
145//Generic DMAr tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100146TEST(DMArGenericTests, IRValid) {
147 single_section_ir_test("dmargeneric");
148}
Lawrence Tangcd505202022-07-19 16:55:11 +0100149TEST(DMArGenericTests, BinaryEqual) {
150 single_section_binary_test("dmargeneric");
151}
152
153//VT-d DMAr tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100154TEST(DMArVtdTests, IRValid) {
155 single_section_ir_test("dmarvtd");
156}
Lawrence Tangcd505202022-07-19 16:55:11 +0100157TEST(DMArVtdTests, BinaryEqual) {
158 single_section_binary_test("dmarvtd");
159}
160
161//IOMMU DMAr tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100162TEST(DMArIOMMUTests, IRValid) {
163 single_section_ir_test("dmariommu");
164}
Lawrence Tangcd505202022-07-19 16:55:11 +0100165TEST(DMArIOMMUTests, BinaryEqual) {
166 single_section_binary_test("dmariommu");
167}
168
169//CCIX PER tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100170TEST(CCIXPERTests, IRValid) {
171 single_section_ir_test("ccixper");
172}
Lawrence Tangcd505202022-07-19 16:55:11 +0100173TEST(CCIXPERTests, BinaryEqual) {
174 single_section_binary_test("ccixper");
175}
176
177//CXL Protocol tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100178TEST(CXLProtocolTests, IRValid) {
179 single_section_ir_test("cxlprotocol");
180}
Lawrence Tangcd505202022-07-19 16:55:11 +0100181TEST(CXLProtocolTests, BinaryEqual) {
182 single_section_binary_test("cxlprotocol");
183}
184
185//CXL Component tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100186TEST(CXLComponentTests, IRValid) {
187 single_section_ir_test("cxlcomponent");
188}
Lawrence Tangcd505202022-07-19 16:55:11 +0100189TEST(CXLComponentTests, BinaryEqual) {
190 single_section_binary_test("cxlcomponent");
191}
192
193//Unknown section tests.
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100194TEST(UnknownSectionTests, IRValid) {
195 single_section_ir_test("unknown");
196}
Lawrence Tangcd505202022-07-19 16:55:11 +0100197TEST(UnknownSectionTests, BinaryEqual) {
198 single_section_binary_test("unknown");
199}
Lawrence Tangd34f2b12022-07-19 15:36:31 +0100200
201//Entrypoint for the testing program.
202int main()
203{
204 testing::InitGoogleTest();
205 return RUN_ALL_TESTS();
206}