Added self-test function. Will only be invoked in DEBUG mode.

This commit is contained in:
LoRd_MuldeR 2017-04-21 23:11:47 +02:00
parent 41ee01394a
commit a6be7cd983
2 changed files with 73 additions and 8 deletions

View File

@ -30,6 +30,7 @@
#include <MUtils/CPUFeatures.h> #include <MUtils/CPUFeatures.h>
#include <MUtils/Sound.h> #include <MUtils/Sound.h>
#include <MUtils/Hash.h> #include <MUtils/Hash.h>
#include <MUtils/Exception.h>
#include <MUtils/Version.h> #include <MUtils/Version.h>
//Qt includes //Qt includes
@ -77,6 +78,22 @@ static QList<QPair<const QString, const QString>> HTML_ESCAPE(void)
return htmlEscape; return htmlEscape;
} }
//MediaInfo
static const struct
{
const char *const arch;
const char *const checksum;
const bool require_x64;
const bool require_sse2;
}
MEDIAINFO_BIN[] =
{
{ "x64-sse2", g_mixp_checksum_x64, bool(1), bool(1) },
{ "x86-sse2", g_mixp_checksum_sse, bool(0), bool(1) },
{ "x86-i686", g_mixp_checksum_gen, bool(0), bool(0) },
{ NULL, NULL, false, false }
};
//Const //Const
static const int FILE_RECEIVE_DELAY = 1750; static const int FILE_RECEIVE_DELAY = 1750;
@ -140,6 +157,12 @@ CMainWindow::CMainWindow(const QString &tempFolder, MUtils::IPCChannel *const ip
//Randomize //Randomize
qsrand((uint) time(NULL)); qsrand((uint) time(NULL));
//Selftest
if (MUTILS_DEBUG)
{
selfTest();
}
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -757,15 +780,55 @@ static bool VALIDATE_MEDIAINFO(QFile *const handle, const char *const expected_c
return true; return true;
} }
QPair<QString, const char*> CMainWindow::getMediaInfoArch(void)
{
const MUtils::CPUFetaures::cpu_info_t cpu_features = MUtils::CPUFetaures::detect();
for (size_t i = 0; MEDIAINFO_BIN[i].arch; ++i)
{
if (cpu_features.x64 || (!MEDIAINFO_BIN[i].require_x64))
{
if (HAVE_SSE2(cpu_features) || (!MEDIAINFO_BIN[i].require_sse2))
{
return qMakePair(QString::fromLatin1(MEDIAINFO_BIN[i].arch), MEDIAINFO_BIN[i].checksum);
}
}
}
MUTILS_THROW("This is not supposed to happen!");
}
void CMainWindow::selfTest(void)
{
qWarning("[Self-Test]");
for (size_t i = 0; MEDIAINFO_BIN[i].arch; ++i)
{
qWarning("%s: %s", MEDIAINFO_BIN[i].arch, MEDIAINFO_BIN[i].checksum);
const QResource mediaInfoRes(QString(":/res/bin/MediaInfo.%1.exe").arg(QString::fromLatin1(MEDIAINFO_BIN[i].arch)));
if (mediaInfoRes.isValid())
{
QScopedPointer<MUtils::Hash::Hash> hash(MUtils::Hash::create(MUtils::Hash::HASH_BLAKE2_512, HASH_SEED));
hash->update(mediaInfoRes.data(), mediaInfoRes.size());
const QByteArray checksum = hash->digest(true);
if (qstricmp(MEDIAINFO_BIN[i].checksum, checksum.constData()) != 0)
{
qWarning("\nComputed checksum: %s\n", checksum.constData());
qFatal("MediaInfo checksum mismatch detected!");
}
}
else
{
qFatal("MediaInfo resource could not be found!");
}
}
qWarning("Success.\n");
}
QString CMainWindow::getMediaInfoPath(void) QString CMainWindow::getMediaInfoPath(void)
{ {
//Detect arch //Detect MediaInfo arch
const MUtils::CPUFetaures::cpu_info_t cpu_features = MUtils::CPUFetaures::detect(); const QPair<QString, const char*> arch = getMediaInfoArch();
const QString arch = cpu_features.x64 ? QLatin1String("x64-sse2") : (HAVE_SSE2(cpu_features) ? QLatin1String("x86-sse2") : QLatin1String("x86-i686"));
const char *const checksum = cpu_features.x64 ? g_mixp_checksum_x64 : (HAVE_SSE2(cpu_features) ? g_mixp_checksum_sse : g_mixp_checksum_gen);
//Setup resource //Setup resource
QResource mediaInfoRes(QString(":/res/bin/MediaInfo.%1.exe").arg(arch)); const QResource mediaInfoRes(QString(":/res/bin/MediaInfo.%1.exe").arg(arch.first));
if((!mediaInfoRes.isValid()) || (!mediaInfoRes.data())) if((!mediaInfoRes.isValid()) || (!mediaInfoRes.data()))
{ {
qFatal("MediaInfo resource could not be initialized!"); qFatal("MediaInfo resource could not be initialized!");
@ -775,7 +838,7 @@ QString CMainWindow::getMediaInfoPath(void)
//Validate file content, if already extracted //Validate file content, if already extracted
if(!m_mediaInfoHandle.isNull()) if(!m_mediaInfoHandle.isNull())
{ {
if(VALIDATE_MEDIAINFO(m_mediaInfoHandle.data(), checksum)) if(VALIDATE_MEDIAINFO(m_mediaInfoHandle.data(), arch.second))
{ {
return m_mediaInfoHandle->fileName(); return m_mediaInfoHandle->fileName();
} }
@ -784,7 +847,7 @@ QString CMainWindow::getMediaInfoPath(void)
//Extract MediaInfo binary now! //Extract MediaInfo binary now!
qDebug("MediaInfo binary not existing yet, going to extract now...\n"); qDebug("MediaInfo binary not existing yet, going to extract now...\n");
const QString filePath = MUtils::make_unique_file(m_tempFolder, "MediaInfo", arch + QLatin1String(".exe")); const QString filePath = MUtils::make_unique_file(m_tempFolder, "MediaInfo", arch.first + QLatin1String(".exe"));
if (!filePath.isEmpty()) if (!filePath.isEmpty())
{ {
m_mediaInfoHandle.reset(new QFile(filePath)); m_mediaInfoHandle.reset(new QFile(filePath));
@ -819,7 +882,7 @@ QString CMainWindow::getMediaInfoPath(void)
//Validate file content, after it has been extracted //Validate file content, after it has been extracted
if(!m_mediaInfoHandle.isNull()) if(!m_mediaInfoHandle.isNull())
{ {
if(VALIDATE_MEDIAINFO(m_mediaInfoHandle.data(), checksum)) if(VALIDATE_MEDIAINFO(m_mediaInfoHandle.data(), arch.second))
{ {
return m_mediaInfoHandle->fileName(); return m_mediaInfoHandle->fileName();
} }

View File

@ -98,6 +98,8 @@ private:
const QList<QPair<const QString, const QString>> m_htmlEscape; const QList<QPair<const QString, const QString>> m_htmlEscape;
QPair<QString, const char*> getMediaInfoArch(void);
void selfTest(void);
QString getMediaInfoPath(void); QString getMediaInfoPath(void);
void escapeHtmlChars(QStringList &strings); void escapeHtmlChars(QStringList &strings);
}; };