blob: 2275663422271e3ed90affe86148659044e99035 [file] [log] [blame]
/**
* Defines tests for validating CPER-JSON IR output from the cper-parse library.
*
* Author: Lawrence.Tang@arm.com
**/
#include "gtest/gtest.h"
#include "test-utils.hpp"
extern "C" {
#include "json.h"
#include "../cper-parse.h"
#include "../json-schema.h"
#include "../generator/cper-generate.h"
}
/*
* Test templates.
*/
//Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
void single_section_ir_test(const char* section_name)
{
//Generate CPER record for the given type.
char* buf;
size_t size;
FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
//Convert to IR, free resources.
json_object* ir = cper_to_ir(record);
fclose(record);
free(buf);
//Validate against schema.
char error_message[JSON_ERROR_MSG_MAX_LEN] = {0};
int valid = validate_schema_from_file("./specification/cper-json.json", ir, error_message);
ASSERT_TRUE(valid) << error_message;
}
//Checks for binary round-trip equality for a given randomly generated CPER record.
void single_section_binary_test(const char* section_name)
{
//Generate CPER record for the given type.
char* buf;
size_t size;
FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
//Convert to IR, then back to binary, getting a stream out.
json_object* ir = cper_to_ir(record);
char* cper_buf;
size_t cper_buf_size;
FILE* stream = open_memstream(&cper_buf, &cper_buf_size);
ir_to_cper(ir, stream);
fclose(stream);
//Validate the two are identical.
ASSERT_EQ(size, cper_buf_size);
ASSERT_EQ(memcmp(buf, cper_buf, size), 0) << "Binary output was not identical to input.";
//Free everything up.
fclose(record);
free(buf);
free(cper_buf);
}
/*
* Single section tests.
*/
//Generic processor tests.
TEST(GenericProcessorTests, IRValid) {
single_section_ir_test("generic");
}
TEST(GenericProcessorTests, BinaryEqual) {
single_section_binary_test("generic");
}
//IA32/x64 tests.
TEST(IA32x64Tests, IRValid) {
single_section_ir_test("ia32x64");
}
TEST(IA32x64Tests, BinaryEqual) {
single_section_binary_test("ia32x64");
}
// TEST(IPFTests, IRValid) {
// single_section_ir_test("ipf");
// }
//ARM tests.
TEST(ArmTests, IRValid) {
single_section_ir_test("arm");
}
TEST(ArmTests, BinaryEqual) {
single_section_binary_test("arm");
}
//Memory tests.
TEST(MemoryTests, IRValid) {
single_section_ir_test("memory");
}
TEST(MemoryTests, BinaryEqual) {
single_section_binary_test("memory");
}
//Memory 2 tests.
TEST(Memory2Tests, IRValid) {
single_section_ir_test("memory2");
}
TEST(Memory2Tests, BinaryEqual) {
single_section_binary_test("memory2");
}
//PCIe tests.
TEST(PCIeTests, IRValid) {
single_section_ir_test("pcie");
}
TEST(PCIeTests, BinaryEqual) {
single_section_binary_test("pcie");
}
//Firmware tests.
TEST(FirmwareTests, IRValid) {
single_section_ir_test("firmware");
}
TEST(FirmwareTests, BinaryEqual) {
single_section_binary_test("firmware");
}
//PCI Bus tests.
TEST(PCIBusTests, IRValid) {
single_section_ir_test("pcibus");
}
TEST(PCIBusTests, BinaryEqual) {
single_section_binary_test("pcibus");
}
//PCI Device tests.
TEST(PCIDevTests, IRValid) {
single_section_ir_test("pcidev");
}
TEST(PCIDevTests, BinaryEqual) {
single_section_binary_test("pcidev");
}
//Generic DMAr tests.
TEST(DMArGenericTests, IRValid) {
single_section_ir_test("dmargeneric");
}
TEST(DMArGenericTests, BinaryEqual) {
single_section_binary_test("dmargeneric");
}
//VT-d DMAr tests.
TEST(DMArVtdTests, IRValid) {
single_section_ir_test("dmarvtd");
}
TEST(DMArVtdTests, BinaryEqual) {
single_section_binary_test("dmarvtd");
}
//IOMMU DMAr tests.
TEST(DMArIOMMUTests, IRValid) {
single_section_ir_test("dmariommu");
}
TEST(DMArIOMMUTests, BinaryEqual) {
single_section_binary_test("dmariommu");
}
//CCIX PER tests.
TEST(CCIXPERTests, IRValid) {
single_section_ir_test("ccixper");
}
TEST(CCIXPERTests, BinaryEqual) {
single_section_binary_test("ccixper");
}
//CXL Protocol tests.
TEST(CXLProtocolTests, IRValid) {
single_section_ir_test("cxlprotocol");
}
TEST(CXLProtocolTests, BinaryEqual) {
single_section_binary_test("cxlprotocol");
}
//CXL Component tests.
TEST(CXLComponentTests, IRValid) {
single_section_ir_test("cxlcomponent");
}
TEST(CXLComponentTests, BinaryEqual) {
single_section_binary_test("cxlcomponent");
}
//Unknown section tests.
TEST(UnknownSectionTests, IRValid) {
single_section_ir_test("unknown");
}
TEST(UnknownSectionTests, BinaryEqual) {
single_section_binary_test("unknown");
}
//Entrypoint for the testing program.
int main()
{
testing::InitGoogleTest();
return RUN_ALL_TESTS();
}