xref: /openbmc/libbej/test/include/bej_common_test.hpp (revision da6e55739306fb4361cbbda8c7e4400cad3037d1)
1*da6e5573SNikhil Namjoshi #include "bej_dictionary.h"
2*da6e5573SNikhil Namjoshi #include "bej_encoder_core.h"
3*da6e5573SNikhil Namjoshi #include "bej_tree.h"
4*da6e5573SNikhil Namjoshi 
5*da6e5573SNikhil Namjoshi #include "nlohmann/json.hpp"
6*da6e5573SNikhil Namjoshi 
7*da6e5573SNikhil Namjoshi #include <fstream>
8*da6e5573SNikhil Namjoshi #include <iostream>
9*da6e5573SNikhil Namjoshi #include <optional>
10*da6e5573SNikhil Namjoshi #include <span>
11*da6e5573SNikhil Namjoshi 
12*da6e5573SNikhil Namjoshi namespace libbej
13*da6e5573SNikhil Namjoshi {
14*da6e5573SNikhil Namjoshi 
15*da6e5573SNikhil Namjoshi // Buffer size for storing a single binary file data.
16*da6e5573SNikhil Namjoshi constexpr uint32_t maxBufferSize = 16 * 1024;
17*da6e5573SNikhil Namjoshi 
18*da6e5573SNikhil Namjoshi struct BejTestInputFiles
19*da6e5573SNikhil Namjoshi {
20*da6e5573SNikhil Namjoshi     const char* jsonFile;
21*da6e5573SNikhil Namjoshi     const char* schemaDictionaryFile;
22*da6e5573SNikhil Namjoshi     const char* annotationDictionaryFile;
23*da6e5573SNikhil Namjoshi     const char* errorDictionaryFile;
24*da6e5573SNikhil Namjoshi     const char* encodedStreamFile;
25*da6e5573SNikhil Namjoshi };
26*da6e5573SNikhil Namjoshi 
27*da6e5573SNikhil Namjoshi struct BejTestInputs
28*da6e5573SNikhil Namjoshi {
29*da6e5573SNikhil Namjoshi     nlohmann::json expectedJson;
30*da6e5573SNikhil Namjoshi     const uint8_t* schemaDictionary;
31*da6e5573SNikhil Namjoshi     const uint8_t* annotationDictionary;
32*da6e5573SNikhil Namjoshi     const uint8_t* errorDictionary;
33*da6e5573SNikhil Namjoshi     std::span<const uint8_t> encodedStream;
34*da6e5573SNikhil Namjoshi };
35*da6e5573SNikhil Namjoshi 
readBinaryFile(const char * fileName,std::span<uint8_t> buffer)36*da6e5573SNikhil Namjoshi std::streamsize readBinaryFile(const char* fileName, std::span<uint8_t> buffer)
37*da6e5573SNikhil Namjoshi {
38*da6e5573SNikhil Namjoshi     std::ifstream inputStream(fileName, std::ios::binary);
39*da6e5573SNikhil Namjoshi     if (!inputStream.is_open())
40*da6e5573SNikhil Namjoshi     {
41*da6e5573SNikhil Namjoshi         std::cerr << "Cannot open file: " << fileName << "\n";
42*da6e5573SNikhil Namjoshi         return 0;
43*da6e5573SNikhil Namjoshi     }
44*da6e5573SNikhil Namjoshi     auto readLength = inputStream.readsome(
45*da6e5573SNikhil Namjoshi         reinterpret_cast<char*>(buffer.data()), buffer.size_bytes());
46*da6e5573SNikhil Namjoshi     if (inputStream.peek() != EOF)
47*da6e5573SNikhil Namjoshi     {
48*da6e5573SNikhil Namjoshi         std::cerr << "Failed to read the complete file: " << fileName
49*da6e5573SNikhil Namjoshi                   << "  read length: " << readLength << "\n";
50*da6e5573SNikhil Namjoshi         return 0;
51*da6e5573SNikhil Namjoshi     }
52*da6e5573SNikhil Namjoshi     return readLength;
53*da6e5573SNikhil Namjoshi }
54*da6e5573SNikhil Namjoshi 
loadInputs(const BejTestInputFiles & files,bool readErrorDictionary=false)55*da6e5573SNikhil Namjoshi std::optional<BejTestInputs> loadInputs(const BejTestInputFiles& files,
56*da6e5573SNikhil Namjoshi                                         bool readErrorDictionary = false)
57*da6e5573SNikhil Namjoshi {
58*da6e5573SNikhil Namjoshi     std::ifstream jsonInput(files.jsonFile);
59*da6e5573SNikhil Namjoshi     if (!jsonInput.is_open())
60*da6e5573SNikhil Namjoshi     {
61*da6e5573SNikhil Namjoshi         std::cerr << "Cannot open file: " << files.jsonFile << "\n";
62*da6e5573SNikhil Namjoshi         return std::nullopt;
63*da6e5573SNikhil Namjoshi     }
64*da6e5573SNikhil Namjoshi     nlohmann::json expJson;
65*da6e5573SNikhil Namjoshi     jsonInput >> expJson;
66*da6e5573SNikhil Namjoshi 
67*da6e5573SNikhil Namjoshi     static uint8_t schemaDictBuffer[maxBufferSize];
68*da6e5573SNikhil Namjoshi     if (readBinaryFile(files.schemaDictionaryFile,
69*da6e5573SNikhil Namjoshi                        std::span(schemaDictBuffer, maxBufferSize)) == 0)
70*da6e5573SNikhil Namjoshi     {
71*da6e5573SNikhil Namjoshi         return std::nullopt;
72*da6e5573SNikhil Namjoshi     }
73*da6e5573SNikhil Namjoshi 
74*da6e5573SNikhil Namjoshi     static uint8_t annoDictBuffer[maxBufferSize];
75*da6e5573SNikhil Namjoshi     if (readBinaryFile(files.annotationDictionaryFile,
76*da6e5573SNikhil Namjoshi                        std::span(annoDictBuffer, maxBufferSize)) == 0)
77*da6e5573SNikhil Namjoshi     {
78*da6e5573SNikhil Namjoshi         return std::nullopt;
79*da6e5573SNikhil Namjoshi     }
80*da6e5573SNikhil Namjoshi 
81*da6e5573SNikhil Namjoshi     static uint8_t encBuffer[maxBufferSize];
82*da6e5573SNikhil Namjoshi     auto encLen = readBinaryFile(files.encodedStreamFile,
83*da6e5573SNikhil Namjoshi                                  std::span(encBuffer, maxBufferSize));
84*da6e5573SNikhil Namjoshi     if (encLen == 0)
85*da6e5573SNikhil Namjoshi     {
86*da6e5573SNikhil Namjoshi         return std::nullopt;
87*da6e5573SNikhil Namjoshi     }
88*da6e5573SNikhil Namjoshi 
89*da6e5573SNikhil Namjoshi     static uint8_t errorDict[maxBufferSize];
90*da6e5573SNikhil Namjoshi     if (readErrorDictionary)
91*da6e5573SNikhil Namjoshi     {
92*da6e5573SNikhil Namjoshi         if (readBinaryFile(files.errorDictionaryFile,
93*da6e5573SNikhil Namjoshi                            std::span(errorDict, maxBufferSize)) == 0)
94*da6e5573SNikhil Namjoshi         {
95*da6e5573SNikhil Namjoshi             return std::nullopt;
96*da6e5573SNikhil Namjoshi         }
97*da6e5573SNikhil Namjoshi     }
98*da6e5573SNikhil Namjoshi 
99*da6e5573SNikhil Namjoshi     BejTestInputs inputs = {
100*da6e5573SNikhil Namjoshi         .expectedJson = expJson,
101*da6e5573SNikhil Namjoshi         .schemaDictionary = schemaDictBuffer,
102*da6e5573SNikhil Namjoshi         .annotationDictionary = annoDictBuffer,
103*da6e5573SNikhil Namjoshi         .errorDictionary = errorDict,
104*da6e5573SNikhil Namjoshi         .encodedStream = std::span(encBuffer, encLen),
105*da6e5573SNikhil Namjoshi     };
106*da6e5573SNikhil Namjoshi     return inputs;
107*da6e5573SNikhil Namjoshi }
108*da6e5573SNikhil Namjoshi 
109*da6e5573SNikhil Namjoshi } // namespace libbej
110