98 TestScript(std::string name) :
101#if defined(TRACEFLAGS)
102 traceFlags = TRACEFLAGS;
107 std::string scriptName;
110 log4cxx::LoggerPtr logger =
nullptr;
113 bool isLog4cxxConfigured =
false;
116 std::vector<MiKTeX::Trace::TraceCallback::TraceMessage> pendingTraceMessages;
121 if (!isLog4cxxConfigured)
123 if (pendingTraceMessages.size() > 100)
125 pendingTraceMessages.clear();
127 pendingTraceMessages.push_back(traceMessage);
130 FlushPendingTraceMessages();
131 TraceInternal(traceMessage);
136 void FlushPendingTraceMessages()
142 pendingTraceMessages.clear();
148 log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(std::string(
"trace.test.") + traceMessage.facility);
149 switch (traceMessage.level)
151 case MiKTeX::Trace::TraceLevel::Fatal:
152 LOG4CXX_FATAL(logger, traceMessage.message);
154 case MiKTeX::Trace::TraceLevel::Error:
155 LOG4CXX_ERROR(logger, traceMessage.message);
157 case MiKTeX::Trace::TraceLevel::Warning:
158 LOG4CXX_WARN(logger, traceMessage.message);
160 case MiKTeX::Trace::TraceLevel::Info:
161 LOG4CXX_INFO(logger, traceMessage.message);
163 case MiKTeX::Trace::TraceLevel::Trace:
164 LOG4CXX_TRACE(logger, traceMessage.message);
166 case MiKTeX::Trace::TraceLevel::Debug:
168 LOG4CXX_DEBUG(logger, traceMessage.message);
174 virtual ~TestScript()
179 std::vector<std::string> argv;
182 int Main(
int argc,
const char** argv)
185 _setmode(_fileno(stdin), _O_BINARY);
186 _setmode(_fileno(stdout), _O_BINARY);
187 _setmode(_fileno(stderr), _O_BINARY);
191 MiKTeX::Wrappers::PoptWrapper popt(argc, argv, optionTable);
192 while ((chOption = popt.GetNextOpt()) >= 0)
194 switch ((Option)chOption)
196 case Option::InstallRoot:
197 installRoot = popt.GetOptArg();
199 case Option::DataRoot:
200 dataRoot = popt.GetOptArg();
202 case Option::RootDirectories:
203 rootDirectories = popt.GetOptArg();
206 traceFlags = popt.GetOptArg();
212 for (
const std::string& arg : popt.GetLeftovers())
214 vecArgs.push_back(arg);
218 for (
int idx = 0; idx < argc && argv[idx] !=
nullptr; ++idx)
220 this->argv.push_back(argv[idx]);
225#if defined(INSTALLROOT) && defined(DATAROOT)
229 startupConfig.
userRoots = rootDirectories;
235#if defined(INITFLAGS)
236 initInfo.SetFlags(INITFLAGS);
240# error BINDIR is deprecated
248 if (pSession->FindFile(
"log4cxx.xml",
"%R/miktex/config", xmlFileName))
250#if defined(MIKTEX_WINDOWS)
251 log4cxx::xml::DOMConfigurator::configure(xmlFileName.ToWideCharString());
253 log4cxx::xml::DOMConfigurator::configure(xmlFileName.
ToString());
258 log4cxx::BasicConfigurator::configure();
260 logger = log4cxx::Logger::getLogger(scriptName);
261 isLog4cxxConfigured =
true;
263 LOG4CXX_INFO(logger,
"starting tests");
264 if (!traceFlags.empty())
266 MiKTeX::Trace::TraceStream::SetOptions(traceFlags);
274 if (isLog4cxxConfigured)
276 LOG4CXX_FATAL(logger, f.strFile <<
":" << f.iLine <<
": TEST FAILED");
282 if (isLog4cxxConfigured)
284 LOG4CXX_INFO(logger,
"caught TestException");
289 catch (
const MiKTeX::Core::MiKTeXException& e)
291 fprintf(stderr,
"catched MiKTeXException thrown here: %s:%d\n", e.GetSourceFile().c_str(), e.GetSourceLine());
292 if (isLog4cxxConfigured)
294 LOG4CXX_FATAL(logger, e.what());
295 LOG4CXX_FATAL(logger,
"Info: " << e.GetInfo());
296 LOG4CXX_FATAL(logger,
"Source: " << e.GetSourceFile());
297 LOG4CXX_FATAL(logger,
"Line: " << e.GetSourceLine());
301 catch (
const std::exception& e)
303 fprintf(stderr,
"catched std::exception: %s\n", e.what());
304 if (isLog4cxxConfigured)
306 LOG4CXX_FATAL(logger, e.what());
312 fprintf(stderr,
"catched int: %d\n", code);
313 if (isLog4cxxConfigured)
315 LOG4CXX_FATAL(logger,
"test script failure " << code);
335 virtual void Run() = 0;
338 bool FindFile(
const char* lpszFileName,
const char* lpszPathList)
341 return pSession->FindFile(lpszFileName, lpszPathList, path);
345 bool RunTestCommand(
const char* lpszProgramName)
348 for (std::vector<std::string>::const_iterator it = argv.begin(); it != argv.end(); ++it)
350 if (it != argv.begin())
352 commandLine +=
" " + *it;
355 return system(commandLine.c_str()) == 0;
359 void Touch(
const char* lpszPath)
362#if defined(_MSC_VER) && _MSC_VER >= 1400
363 if (_wfopen_s(&pFile, MiKTeX::Util::PathName(lpszPath).
ToExtendedLengthPathName().ToWideCharString().c_str(), L
"wb") != 0)
368 pFile = fopen(lpszPath,
"wb");
370 if (pFile ==
nullptr)
378 void Touch(
const MiKTeX::Util::PathName& path)
380 Touch(path.GetData());
384 std::shared_ptr<MiKTeX::Core::Session> pSession;
387 std::vector<std::string> vecArgs;
390 std::string traceFlags;
393 std::string rootDirectories;
396 std::string installRoot;
399 std::string dataRoot;
402 static const struct poptOption optionTable[];