xref: /openbmc/libcper/tests/ir-tests.cpp (revision aacf0e26)
1d34f2b11SLawrence Tang /**
2d34f2b11SLawrence Tang  * Defines tests for validating CPER-JSON IR output from the cper-parse library.
3d34f2b11SLawrence Tang  *
4d34f2b11SLawrence Tang  * Author: Lawrence.Tang@arm.com
5d34f2b11SLawrence Tang  **/
6d34f2b11SLawrence Tang 
7d34f2b11SLawrence Tang #include "gtest/gtest.h"
8d34f2b11SLawrence Tang #include "test-utils.hpp"
9d34f2b11SLawrence Tang extern "C" {
10d34f2b11SLawrence Tang #include "json.h"
11d34f2b11SLawrence Tang #include "../cper-parse.h"
12d34f2b11SLawrence Tang #include "../json-schema.h"
13d34f2b11SLawrence Tang #include "../generator/cper-generate.h"
14d34f2b11SLawrence Tang }
15d34f2b11SLawrence Tang 
16d34f2b11SLawrence Tang /*
17d34f2b11SLawrence Tang * Test templates.
18d34f2b11SLawrence Tang */
19cd505205SLawrence Tang 
20cd505205SLawrence Tang //Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
21d34f2b11SLawrence Tang void single_section_ir_test(const char* section_name)
22d34f2b11SLawrence Tang {
23cd505205SLawrence Tang     //Generate CPER record for the given type.
24d34f2b11SLawrence Tang     char* buf;
25d34f2b11SLawrence Tang     size_t size;
26d34f2b11SLawrence Tang     FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
27d34f2b11SLawrence Tang 
28d34f2b11SLawrence Tang     //Convert to IR, free resources.
29d34f2b11SLawrence Tang     json_object* ir = cper_to_ir(record);
30d34f2b11SLawrence Tang     fclose(record);
31d34f2b11SLawrence Tang     free(buf);
32d34f2b11SLawrence Tang 
33d34f2b11SLawrence Tang     //Validate against schema.
34d34f2b11SLawrence Tang     char error_message[JSON_ERROR_MSG_MAX_LEN] = {0};
35d34f2b11SLawrence Tang     int valid = validate_schema_from_file("./specification/cper-json.json", ir, error_message);
36d34f2b11SLawrence Tang     ASSERT_TRUE(valid) << error_message;
37d34f2b11SLawrence Tang }
38d34f2b11SLawrence Tang 
39cd505205SLawrence Tang //Checks for binary round-trip equality for a given randomly generated CPER record.
40cd505205SLawrence Tang void single_section_binary_test(const char* section_name)
41cd505205SLawrence Tang {
42cd505205SLawrence Tang     //Generate CPER record for the given type.
43cd505205SLawrence Tang     char* buf;
44cd505205SLawrence Tang     size_t size;
45cd505205SLawrence Tang     FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
46cd505205SLawrence Tang 
47cd505205SLawrence Tang     //Convert to IR, then back to binary, getting a stream out.
48cd505205SLawrence Tang     json_object* ir = cper_to_ir(record);
49cd505205SLawrence Tang     char* cper_buf;
50cd505205SLawrence Tang     size_t cper_buf_size;
51cd505205SLawrence Tang     FILE* stream = open_memstream(&cper_buf, &cper_buf_size);
52cd505205SLawrence Tang     ir_to_cper(ir, stream);
53*aacf0e26SLawrence Tang     size_t cper_len = ftell(stream);
54cd505205SLawrence Tang     fclose(stream);
55cd505205SLawrence Tang 
56cd505205SLawrence Tang     //Validate the two are identical.
57*aacf0e26SLawrence Tang     ASSERT_GE(size, cper_len);
58*aacf0e26SLawrence Tang     ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0) << "Binary output was not identical to input.";
59cd505205SLawrence Tang 
60cd505205SLawrence Tang     //Free everything up.
61cd505205SLawrence Tang     fclose(record);
62cd505205SLawrence Tang     free(buf);
63cd505205SLawrence Tang     free(cper_buf);
64cd505205SLawrence Tang }
65cd505205SLawrence Tang 
66d34f2b11SLawrence Tang /*
67d34f2b11SLawrence Tang * Single section tests.
68d34f2b11SLawrence Tang */
69cd505205SLawrence Tang //Generic processor tests.
70d34f2b11SLawrence Tang TEST(GenericProcessorTests, IRValid) {
71d34f2b11SLawrence Tang     single_section_ir_test("generic");
72d34f2b11SLawrence Tang }
73cd505205SLawrence Tang TEST(GenericProcessorTests, BinaryEqual) {
74cd505205SLawrence Tang     single_section_binary_test("generic");
75cd505205SLawrence Tang }
76cd505205SLawrence Tang 
77cd505205SLawrence Tang //IA32/x64 tests.
78d34f2b11SLawrence Tang TEST(IA32x64Tests, IRValid) {
79d34f2b11SLawrence Tang     single_section_ir_test("ia32x64");
80d34f2b11SLawrence Tang }
81cd505205SLawrence Tang TEST(IA32x64Tests, BinaryEqual) {
82cd505205SLawrence Tang     single_section_binary_test("ia32x64");
83cd505205SLawrence Tang }
84cd505205SLawrence Tang 
85d34f2b11SLawrence Tang // TEST(IPFTests, IRValid) {
86d34f2b11SLawrence Tang //     single_section_ir_test("ipf");
87d34f2b11SLawrence Tang // }
88cd505205SLawrence Tang 
89cd505205SLawrence Tang //ARM tests.
90d34f2b11SLawrence Tang TEST(ArmTests, IRValid) {
91d34f2b11SLawrence Tang     single_section_ir_test("arm");
92d34f2b11SLawrence Tang }
93cd505205SLawrence Tang TEST(ArmTests, BinaryEqual) {
94cd505205SLawrence Tang     single_section_binary_test("arm");
95cd505205SLawrence Tang }
96cd505205SLawrence Tang 
97cd505205SLawrence Tang //Memory tests.
98d34f2b11SLawrence Tang TEST(MemoryTests, IRValid) {
99d34f2b11SLawrence Tang     single_section_ir_test("memory");
100d34f2b11SLawrence Tang }
101cd505205SLawrence Tang TEST(MemoryTests, BinaryEqual) {
102cd505205SLawrence Tang     single_section_binary_test("memory");
103cd505205SLawrence Tang }
104cd505205SLawrence Tang 
105cd505205SLawrence Tang //Memory 2 tests.
106d34f2b11SLawrence Tang TEST(Memory2Tests, IRValid) {
107d34f2b11SLawrence Tang     single_section_ir_test("memory2");
108d34f2b11SLawrence Tang }
109cd505205SLawrence Tang TEST(Memory2Tests, BinaryEqual) {
110cd505205SLawrence Tang     single_section_binary_test("memory2");
111cd505205SLawrence Tang }
112cd505205SLawrence Tang 
113cd505205SLawrence Tang //PCIe tests.
114d34f2b11SLawrence Tang TEST(PCIeTests, IRValid) {
115d34f2b11SLawrence Tang     single_section_ir_test("pcie");
116d34f2b11SLawrence Tang }
117cd505205SLawrence Tang TEST(PCIeTests, BinaryEqual) {
118cd505205SLawrence Tang     single_section_binary_test("pcie");
119cd505205SLawrence Tang }
120cd505205SLawrence Tang 
121cd505205SLawrence Tang //Firmware tests.
122d34f2b11SLawrence Tang TEST(FirmwareTests, IRValid) {
123d34f2b11SLawrence Tang     single_section_ir_test("firmware");
124d34f2b11SLawrence Tang }
125cd505205SLawrence Tang TEST(FirmwareTests, BinaryEqual) {
126cd505205SLawrence Tang     single_section_binary_test("firmware");
127cd505205SLawrence Tang }
128cd505205SLawrence Tang 
129cd505205SLawrence Tang //PCI Bus tests.
130d34f2b11SLawrence Tang TEST(PCIBusTests, IRValid) {
131d34f2b11SLawrence Tang     single_section_ir_test("pcibus");
132d34f2b11SLawrence Tang }
133cd505205SLawrence Tang TEST(PCIBusTests, BinaryEqual) {
134cd505205SLawrence Tang     single_section_binary_test("pcibus");
135cd505205SLawrence Tang }
136cd505205SLawrence Tang 
137cd505205SLawrence Tang //PCI Device tests.
138d34f2b11SLawrence Tang TEST(PCIDevTests, IRValid) {
139d34f2b11SLawrence Tang     single_section_ir_test("pcidev");
140d34f2b11SLawrence Tang }
141cd505205SLawrence Tang TEST(PCIDevTests, BinaryEqual) {
142cd505205SLawrence Tang     single_section_binary_test("pcidev");
143cd505205SLawrence Tang }
144cd505205SLawrence Tang 
145cd505205SLawrence Tang //Generic DMAr tests.
146d34f2b11SLawrence Tang TEST(DMArGenericTests, IRValid) {
147d34f2b11SLawrence Tang     single_section_ir_test("dmargeneric");
148d34f2b11SLawrence Tang }
149cd505205SLawrence Tang TEST(DMArGenericTests, BinaryEqual) {
150cd505205SLawrence Tang     single_section_binary_test("dmargeneric");
151cd505205SLawrence Tang }
152cd505205SLawrence Tang 
153cd505205SLawrence Tang //VT-d DMAr tests.
154d34f2b11SLawrence Tang TEST(DMArVtdTests, IRValid) {
155d34f2b11SLawrence Tang     single_section_ir_test("dmarvtd");
156d34f2b11SLawrence Tang }
157cd505205SLawrence Tang TEST(DMArVtdTests, BinaryEqual) {
158cd505205SLawrence Tang     single_section_binary_test("dmarvtd");
159cd505205SLawrence Tang }
160cd505205SLawrence Tang 
161cd505205SLawrence Tang //IOMMU DMAr tests.
162d34f2b11SLawrence Tang TEST(DMArIOMMUTests, IRValid) {
163d34f2b11SLawrence Tang     single_section_ir_test("dmariommu");
164d34f2b11SLawrence Tang }
165cd505205SLawrence Tang TEST(DMArIOMMUTests, BinaryEqual) {
166cd505205SLawrence Tang     single_section_binary_test("dmariommu");
167cd505205SLawrence Tang }
168cd505205SLawrence Tang 
169cd505205SLawrence Tang //CCIX PER tests.
170d34f2b11SLawrence Tang TEST(CCIXPERTests, IRValid) {
171d34f2b11SLawrence Tang     single_section_ir_test("ccixper");
172d34f2b11SLawrence Tang }
173cd505205SLawrence Tang TEST(CCIXPERTests, BinaryEqual) {
174cd505205SLawrence Tang     single_section_binary_test("ccixper");
175cd505205SLawrence Tang }
176cd505205SLawrence Tang 
177cd505205SLawrence Tang //CXL Protocol tests.
178d34f2b11SLawrence Tang TEST(CXLProtocolTests, IRValid) {
179d34f2b11SLawrence Tang     single_section_ir_test("cxlprotocol");
180d34f2b11SLawrence Tang }
181cd505205SLawrence Tang TEST(CXLProtocolTests, BinaryEqual) {
182cd505205SLawrence Tang     single_section_binary_test("cxlprotocol");
183cd505205SLawrence Tang }
184cd505205SLawrence Tang 
185cd505205SLawrence Tang //CXL Component tests.
186d34f2b11SLawrence Tang TEST(CXLComponentTests, IRValid) {
187d34f2b11SLawrence Tang     single_section_ir_test("cxlcomponent");
188d34f2b11SLawrence Tang }
189cd505205SLawrence Tang TEST(CXLComponentTests, BinaryEqual) {
190cd505205SLawrence Tang     single_section_binary_test("cxlcomponent");
191cd505205SLawrence Tang }
192cd505205SLawrence Tang 
193cd505205SLawrence Tang //Unknown section tests.
194d34f2b11SLawrence Tang TEST(UnknownSectionTests, IRValid) {
195d34f2b11SLawrence Tang     single_section_ir_test("unknown");
196d34f2b11SLawrence Tang }
197cd505205SLawrence Tang TEST(UnknownSectionTests, BinaryEqual) {
198cd505205SLawrence Tang     single_section_binary_test("unknown");
199cd505205SLawrence Tang }
200d34f2b11SLawrence Tang 
201d34f2b11SLawrence Tang //Entrypoint for the testing program.
202d34f2b11SLawrence Tang int main()
203d34f2b11SLawrence Tang {
204d34f2b11SLawrence Tang     testing::InitGoogleTest();
205d34f2b11SLawrence Tang     return RUN_ALL_TESTS();
206d34f2b11SLawrence Tang }