From ce87bb84617cfe626a685da2d233fccd5a3e395d Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 17 Oct 2022 17:37:42 +0300 Subject: [PATCH] Update x2tTester --- Test/Applications/x2tTester/README.md | 21 ++-- Test/Applications/x2tTester/x2tTester.cpp | 126 ++++++++++++++++------ Test/Applications/x2tTester/x2tTester.h | 24 +++-- 3 files changed, 119 insertions(+), 52 deletions(-) diff --git a/Test/Applications/x2tTester/README.md b/Test/Applications/x2tTester/README.md index 8ddf0e7108..85ef29a473 100644 --- a/Test/Applications/x2tTester/README.md +++ b/Test/Applications/x2tTester/README.md @@ -6,7 +6,7 @@ You need to create an xml configuration file. It must contain: # root of xml - # report.csv path + # report (.csv) path # directory with test documents @@ -21,23 +21,23 @@ You need to create an xml configuration file. It must contain: # num cores to use - # reports only errors (0 or 1) + # (non-required) reports only errors (default - 0) - # fonts settings - # if no node - using system fonts + # (non-required) timestamp in report file name (default - 1) + + + # (non-required) fonts settings (default - "1") # you can set "system" param to "0" or "1", - # if "1", set additional directory for fonts + # if "0", set additional directory for fonts - # (non-required) input extensions of files - # if no this node, sets all input extensions + # (non-required) input extensions of files (default - all possible input extensions) - # (non-required) output extensions of files, for example docx - # if no this node, sets all possible output extensions + # (non-required) output extensions of files (default - all possible output extensions) # input & output values example: @@ -56,7 +56,8 @@ You can use the following template: - + + diff --git a/Test/Applications/x2tTester/x2tTester.cpp b/Test/Applications/x2tTester/x2tTester.cpp index ea3dbc7200..5003585017 100644 --- a/Test/Applications/x2tTester/x2tTester.cpp +++ b/Test/Applications/x2tTester/x2tTester.cpp @@ -1,65 +1,65 @@ #include "x2tTester.h" #include "../../../X2tConverter/src/run.h" -class FormatsList; +class CFormatsList; class Cx2tTester; class CConverter; -FormatsList::FormatsList() +CFormatsList::CFormatsList() { } -std::vector FormatsList::GetDocuments() const +std::vector CFormatsList::GetDocuments() const { return m_documents; } -std::vector FormatsList::GetPresentations() const +std::vector CFormatsList::GetPresentations() const { return m_presentations; } -std::vector FormatsList::GetSpreadsheets() const +std::vector CFormatsList::GetSpreadsheets() const { return m_spreadsheets; } -std::vector FormatsList::GetCrossplatform() const +std::vector CFormatsList::GetCrossplatform() const { return m_crossplatform; } -std::vector FormatsList::GetImages() const +std::vector CFormatsList::GetImages() const { return m_images; } -int FormatsList::GetPdf() const +int CFormatsList::GetPdf() const { return m_pdf; } -bool FormatsList::isDocument(int format) const +bool CFormatsList::isDocument(int format) const { return std::find(m_documents.begin(), m_documents.end(), format) != m_documents.end(); } -bool FormatsList::isPresentation(int format) const +bool CFormatsList::isPresentation(int format) const { return std::find(m_presentations.begin(), m_presentations.end(), format) != m_presentations.end(); } -bool FormatsList::isSpreadsheet(int format) const +bool CFormatsList::isSpreadsheet(int format) const { return std::find(m_spreadsheets.begin(), m_spreadsheets.end(), format) != m_spreadsheets.end(); } -bool FormatsList::isCrossplatform(int format) const +bool CFormatsList::isCrossplatform(int format) const { return std::find(m_crossplatform.begin(), m_crossplatform.end(), format) != m_crossplatform.end(); } -bool FormatsList::isImage(int format) const +bool CFormatsList::isImage(int format) const { return std::find(m_images.begin(), m_images.end(), format) != m_images.end(); } -bool FormatsList::isPdf(int format) const +bool CFormatsList::isPdf(int format) const { return format == m_pdf; } -void FormatsList::SetDefault() +void CFormatsList::SetDefault() { m_documents.push_back(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX); m_documents.push_back(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC); @@ -117,7 +117,7 @@ void FormatsList::SetDefault() m_pdf = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF; } -void FormatsList::SetOutput() +void CFormatsList::SetOutput() { m_documents.push_back(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX); // m_documents.push_back(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC); @@ -174,7 +174,7 @@ void FormatsList::SetOutput() m_pdf = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF; } -std::vector FormatsList::allFormats() const +std::vector CFormatsList::allFormats() const { std::vector all_formats; @@ -203,9 +203,28 @@ Cx2tTester::Cx2tTester(const std::wstring& configPath) { m_bIsUseSystemFonts = true; m_bIsErrorsOnly = false; + m_bIsTimestamp = true; m_inputFormatsList.SetDefault(); m_outputFormatsList.SetOutput(); setConfig(configPath); + m_errorsXmlDirectory = m_outputDirectory + L"/_errors"; + + if(m_bIsTimestamp) + { + time_t now = time(0); + std::tm* time = std::localtime(&now); + std::wstring timestamp = + std::to_wstring(time->tm_mday) + L"_" + + std::to_wstring(time->tm_mon + 1) + L"_" + + std::to_wstring(time->tm_year + 1900) + L"_" + + std::to_wstring(time->tm_hour) + L"_" + + std::to_wstring(time->tm_min) + L"_" + + std::to_wstring(time->tm_sec); + + std::wstring report_ext = NSFile::GetFileExtention(m_reportFile); + m_reportFile = m_reportFile.substr(0, m_reportFile.size() - report_ext.size() - 1); + m_reportFile += L"_" + timestamp + L"." + report_ext; + } if(NSFile::CFileBinary::Exists(m_reportFile)) NSFile::CFileBinary::Remove(m_reportFile); @@ -218,16 +237,14 @@ Cx2tTester::Cx2tTester(const std::wstring& configPath) m_coresCS.InitializeCriticalSection(); m_reportCS.InitializeCriticalSection(); - m_outputCS.InitializeCriticalSection(); m_currentProc = 0; - setReportHeader(); + writeReportHeader(); } Cx2tTester::~Cx2tTester() { m_coresCS.DeleteCriticalSection(); m_reportCS.DeleteCriticalSection(); - m_outputCS.DeleteCriticalSection(); m_reportStream.CloseFile(); } @@ -254,6 +271,7 @@ void Cx2tTester::setConfig(const std::wstring& configPath) else if(name == L"x2tPath") m_x2tPath = node.GetText(); else if(name == L"cores") m_maxProc = std::stoi(node.GetText()); else if(name == L"errorsOnly") m_bIsErrorsOnly = std::stoi(node.GetText()); + else if(name == L"timestamp") m_bIsTimestamp = std::stoi(node.GetText()); else if(name == L"input") { default_input_formats = false; @@ -293,6 +311,9 @@ void Cx2tTester::setConfig(const std::wstring& configPath) } void Cx2tTester::Start() { + // setup timer + m_timeStart = NSTimers::GetTickCount(); + // check fonts std::wstring fonts_directory = NSFile::GetProcessDirectory() + L"/fonts"; CApplicationFontsWorker fonts_worker; @@ -320,13 +341,21 @@ void Cx2tTester::Start() NSDirectory::CreateDirectory(m_outputDirectory); + // setup & clear errors folder + if(NSDirectory::Exists(m_errorsXmlDirectory)) + NSDirectory::DeleteDirectory(m_errorsXmlDirectory); + + NSDirectory::CreateDirectory(m_errorsXmlDirectory); + std::vector files = NSDirectory::GetFiles(m_inputDirectory, false); if(files.size() < m_maxProc) m_maxProc = files.size(); - for(std::wstring& input_file : files) + for(int i = 0; i < files.size(); i++) { + std::wstring& input_file = files[i]; + std::wstring input_ext = NSFile::GetFileExtention(input_file); int input_format = COfficeFileFormatChecker::GetFormatByExtension(L'.' + input_ext); @@ -334,6 +363,9 @@ void Cx2tTester::Start() if(std::find(m_inputFormats.begin(), m_inputFormats.end(), input_format) == m_inputFormats.end()) continue; + // show proggres + std::cout << i << "/" << files.size() << " - " << U_TO_UTF8(input_file) << " started\n"; + // setup folder for output files std::wstring output_files_directory = m_outputDirectory + L'/' + NSFile::GetFileName(input_file); @@ -382,6 +414,7 @@ void Cx2tTester::Start() converter->SetFontsDirectory(fonts_directory); converter->SetX2tPath(m_x2tPath); converter->SetOnlyErrors(m_bIsErrorsOnly); + converter->SetXmlErrorsDirectory(m_errorsXmlDirectory); converter->DestroyOnFinish(); converter->Start(0); @@ -390,8 +423,18 @@ void Cx2tTester::Start() // waiting all procs end while(!isAllFree()) NSThreads::Sleep(150); -} + writeTime(); +} +void Cx2tTester::writeReportHeader() +{ + m_reportStream.WriteStringUTF8(L"Input file\t", false); + m_reportStream.WriteStringUTF8(L"Output file\t", true); + m_reportStream.WriteStringUTF8(L"Input extension\t", true); + m_reportStream.WriteStringUTF8(L"Output extension\t", true); + m_reportStream.WriteStringUTF8(L"Time\t", true); + m_reportStream.WriteStringUTF8(L"Exit code\n", true); +} void Cx2tTester::writeReport(const Report& report) { CTemporaryCS CS(&m_reportCS); @@ -400,6 +443,7 @@ void Cx2tTester::writeReport(const Report& report) m_reportStream.WriteStringUTF8(report.outputFile + L"\t", true); m_reportStream.WriteStringUTF8(report.inputExt + L"\t", true); m_reportStream.WriteStringUTF8(report.outputExt + L"\t", true); + m_reportStream.WriteStringUTF8(std::to_wstring(report.time) + L"\t", true); m_reportStream.WriteStringUTF8(std::to_wstring(report.exitCode) + L"\n", true); } void Cx2tTester::writeReports(const std::vector& reports) @@ -411,9 +455,16 @@ void Cx2tTester::writeReports(const std::vector& reports) m_reportStream.WriteStringUTF8(report.outputFile + L"\t", true); m_reportStream.WriteStringUTF8(report.inputExt + L"\t", true); m_reportStream.WriteStringUTF8(report.outputExt + L"\t", true); + m_reportStream.WriteStringUTF8(std::to_wstring(report.time) + L"\t", true); m_reportStream.WriteStringUTF8(std::to_wstring(report.exitCode) + L"\n", true); } } +void Cx2tTester::writeTime() +{ + CTemporaryCS CS(&m_reportCS); + DWORD time = NSTimers::GetTickCount() - m_timeStart; + m_reportStream.WriteStringUTF8(L"Time: " + std::to_wstring(time)); +} bool Cx2tTester::isAllBusy() { @@ -426,16 +477,7 @@ bool Cx2tTester::isAllFree() return m_currentProc == 0; } -void Cx2tTester::setReportHeader() -{ - m_reportStream.WriteStringUTF8(L"Input file\t", false); - m_reportStream.WriteStringUTF8(L"Output file\t", true); - m_reportStream.WriteStringUTF8(L"Input extension\t", true); - m_reportStream.WriteStringUTF8(L"Output extension\t", true); - m_reportStream.WriteStringUTF8(L"Exit code\n", true); -} - -std::vector Cx2tTester::parseExtensionsString(std::wstring extensions, const FormatsList& fl) +std::vector Cx2tTester::parseExtensionsString(std::wstring extensions, const CFormatsList& fl) { std::vector formats; int pos = 0; @@ -501,20 +543,28 @@ void CConverter::SetOnlyErrors(bool bIsErrorsOnly) { m_bIsErrorsOnly = bIsErrorsOnly; } +void CConverter::SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory) +{ + m_errorsXmlDirectory = errorsXmlDirectory; +} DWORD CConverter::ThreadProc() { std::wstring xml_params_file = m_outputFilesDirectory + L"/params.xml"; std::vector reports; + DWORD time_file_start = NSTimers::GetTickCount(); + // input_format in many output exts for(int& output_format : m_outputFormats) { if(m_inputFormat == output_format) continue; + std::wstring output_ext = checker.GetExtensionByType(output_format); + std::wstring output_file = m_outputFilesDirectory - + L"/" + NSFile::GetFileName(m_inputFile) + checker.GetExtensionByType(output_format); + + L"/" + NSFile::GetFileName(m_inputFile) + output_ext; // creating temporary xml file with params NSStringUtils::CStringBuilder builder; @@ -580,6 +630,14 @@ DWORD CConverter::ThreadProc() NSFile::CFileBinary::Remove(output_file + L".zip"); } + // save param xml of error conversion + if(exit_code) + { + std::wstring err_xml_file = m_errorsXmlDirectory; + std::wstring input_fielname = NSFile::GetFileName(m_inputFile); + err_xml_file += L"/" + input_fielname + L"_" + output_ext + L".xml"; + NSFile::CFileBinary::SaveToFile(err_xml_file, xml_params, true); + } // writing report if(!m_bIsErrorsOnly || exit_code) @@ -589,6 +647,7 @@ DWORD CConverter::ThreadProc() report.outputFile = output_file; report.inputExt = checker.GetExtensionByType(m_inputFormat); report.outputExt = checker.GetExtensionByType(output_format); + report.time = NSTimers::GetTickCount() - time_file_start; report.exitCode = exit_code; reports.push_back(report); } @@ -596,7 +655,6 @@ DWORD CConverter::ThreadProc() std::string input_file_UTF8 = U_TO_UTF8(m_inputFile); std::string output_file_UTF8 = U_TO_UTF8(output_file); - CTemporaryCS CS(&m_internal->m_outputCS); std::cout << input_file_UTF8 << " to " << output_file_UTF8 << " "; if(!exit_code) diff --git a/Test/Applications/x2tTester/x2tTester.h b/Test/Applications/x2tTester/x2tTester.h index 64284b3164..e2dc0f44d1 100644 --- a/Test/Applications/x2tTester/x2tTester.h +++ b/Test/Applications/x2tTester/x2tTester.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "../../../Common/OfficeFileFormats.h" #include "../../../Common/OfficeFileFormatChecker.h" @@ -19,10 +20,10 @@ #include "../../../OfficeUtils/src/OfficeUtils.h" -class FormatsList +class CFormatsList { public: - FormatsList(); + CFormatsList(); std::vector GetDocuments() const; std::vector GetPresentations() const; @@ -66,6 +67,7 @@ public: std::wstring outputFile; std::wstring inputExt; std::wstring outputExt; + DWORD time; int exitCode; }; @@ -75,24 +77,23 @@ public: void setConfig(const std::wstring& configPath); void Start(); + void writeReportHeader(); void writeReport(const Report& report); void writeReports(const std::vector& reports); + void writeTime(); bool isAllBusy(); bool isAllFree(); NSCriticalSection::CRITICAL_SECTION m_coresCS; NSCriticalSection::CRITICAL_SECTION m_reportCS; - NSCriticalSection::CRITICAL_SECTION m_outputCS; int m_currentProc; int m_maxProc; private: - void setReportHeader(); - // parse string like "docx txt" into vector of formats - std::vector parseExtensionsString(std::wstring extensions, const FormatsList& fl); + std::vector parseExtensionsString(std::wstring extensions, const CFormatsList& fl); // takes from config std::wstring m_reportFile; @@ -100,6 +101,8 @@ private: std::wstring m_outputDirectory; std::wstring m_x2tPath; + std::wstring m_errorsXmlDirectory; + // fonts bool m_bIsUseSystemFonts; std::vector m_arAdditionalFontsDirs; @@ -111,10 +114,13 @@ private: std::vector m_outputFormats; // list of formats - FormatsList m_inputFormatsList; - FormatsList m_outputFormatsList; + CFormatsList m_inputFormatsList; + CFormatsList m_outputFormatsList; bool m_bIsErrorsOnly; + bool m_bIsTimestamp; + + DWORD m_timeStart; }; // generates temp xml, convert, calls m_internal->writeReport @@ -134,6 +140,7 @@ public: void SetX2tPath(const std::wstring& x2tPath); void SetOnlyErrors(bool bIsErrorsOnly); + void SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory); virtual DWORD ThreadProc(); @@ -150,6 +157,7 @@ private: COfficeFileFormatChecker checker; std::wstring m_x2tPath; + std::wstring m_errorsXmlDirectory; bool m_bIsErrorsOnly; };