/*********************************************************************
* Software License Agreement (AGPL-3 License)
*
* OpenViBE SDK Test Software
* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
* Copyright (C) Inria, 2015-2017,V1.0
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program.
* If not, see .
*/
#include
#include
#include
#include "ebml/IReader.h"
#include "ebml/CReader.h"
#include "ebml/CReaderHelper.h"
#include "ovtAssert.h"
std::ofstream g_OutputStream;
class CReaderCallBack : public EBML::IReaderCallBack
{
public:
CReaderCallBack() { }
~CReaderCallBack() override { }
bool isMasterChild(const EBML::CIdentifier& identifier) override
{
if (identifier == EBML_Identifier_Header) { return true; }
if (identifier == EBML::CIdentifier(0xffff)) { return true; }
return false;
}
void openChild(const EBML::CIdentifier& identifier) override
{
m_CurrentID = identifier;
for (int i = 0; i < m_Depth; ++i) { g_OutputStream << " "; }
g_OutputStream << "Opening child node [0x" << std::setw(16) << std::setfill('0') << std::hex << m_CurrentID << std::dec << "]\n";
m_Depth++;
}
void processChildData(const void* buffer, const size_t size) override
{
for (int i = 0; i < m_Depth; ++i) { g_OutputStream << " "; }
if (m_CurrentID == EBML_Identifier_DocType) { g_OutputStream << "Got doc type : [" << m_helper.getStr(buffer, size) << "]\n"; }
else if (m_CurrentID == EBML_Identifier_EBMLVersion)
{
g_OutputStream << "Got EBML version : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << "]\n";
}
else if (m_CurrentID == EBML_Identifier_EBMLIdLength)
{
g_OutputStream << "Got EBML ID length : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec <<
"]\n";
}
else if (m_CurrentID == EBML_Identifier_DocTypeVersion)
{
g_OutputStream << "Got doc type version : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec <<
"]\n";
}
else if (m_CurrentID == EBML_Identifier_DocTypeReadVersion)
{
g_OutputStream << "Got doc type read version : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec
<< "]\n";
}
else if (m_CurrentID == EBML::CIdentifier(0x1234))
{
g_OutputStream << "Got uinteger : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << "]\n";
}
else if (m_CurrentID == EBML::CIdentifier(0xffffffffffffffffLL))
{
g_OutputStream << "Got uinteger : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << "]\n";
}
else if (m_CurrentID == EBML::CIdentifier(0x4321)) { g_OutputStream << "Got double : [" << m_helper.getDouble(buffer, size) << "]\n"; }
else if (m_CurrentID == EBML::CIdentifier(0x8765)) { g_OutputStream << "Got float : [" << m_helper.getDouble(buffer, size) << "]\n"; }
else { g_OutputStream << "Got " << size << " data bytes, node id not known\n"; }
}
void closeChild() override
{
m_Depth--;
for (int i = 0; i < m_Depth; ++i) { g_OutputStream << " "; }
g_OutputStream << "Node closed\n";
}
private:
int m_Depth = 0;
EBML::CReaderHelper m_helper;
EBML::CIdentifier m_CurrentID;
};
int uoEBMLReaderTest(int argc, char* argv[])
{
OVT_ASSERT(argc == 3, "Failure to retrieve tests arguments. Expecting: data_dir output_dir");
std::string dataFile = std::string(argv[1]) + "ref_data.ebml";
std::string expectedFile = std::string(argv[1]) + "ref_result.txt";
std::string outputFile = std::string(argv[2]) + "uoEBMLReaderTest.txt";
// The test parses a known ebml file,
// writes the results into a text file and compares the output
// text file to a reference text file.
g_OutputStream.open(outputFile);
OVT_ASSERT(g_OutputStream.is_open(), "Failure to open output file for writing");
// parsing
for (size_t n = 17; n >= 1; n--)
{
CReaderCallBack callback;
EBML::CReader reader(callback);
g_OutputStream << "testing with n=" << n << std::endl;
FILE* file = fopen(dataFile.c_str(), "rb");
OVT_ASSERT(file != nullptr, "Failure to open data file for reading");
unsigned char* c = new unsigned char[n];
size_t i = 0;
while (!feof(file))
{
i = fread(c, 1, n * sizeof(unsigned char), file);
reader.processData(c, i);
}
delete[] c;
fclose(file);
}
g_OutputStream.close();
// comparison part
std::ifstream generatedStream(outputFile);
std::ifstream expectedStream(expectedFile);
OVT_ASSERT(generatedStream.is_open(), "Failure to open generated results for reading");
OVT_ASSERT(expectedStream.is_open(), "Failure to open expected results for reading");
std::string generatedString;
std::string expectedString;
while (std::getline(expectedStream, expectedString))
{
OVT_ASSERT(std::getline(generatedStream, generatedString), "Failure to retrieve a line to match");
OVT_ASSERT_STREQ(expectedString, generatedString, "Failure to match expected line to generated line");
}
// last check to verify the expected file has no additional line
OVT_ASSERT(!std::getline(generatedStream, generatedString), "Failure to match expected file size and generated file size");
return EXIT_SUCCESS;
}