//----------------------------------------------------------------------------- int ctkErrorLogModelTerminalOutputTest1(int argc, char * argv []) { QCoreApplication app(argc, argv); Q_UNUSED(app); QString fdMessage0("This is stdout message"); QString fdMessage1("This is stderr message"); QString qtMessage0("This is a qDebug message"); QString qtMessage1("This is a qWarning message"); QString qtMessage2("This is a qCritical message"); QString stdMessage0("This is a std::cerr message"); QString stdMessage1("This is a std::cout message"); QStringList expectedMessages; expectedMessages << fdMessage0 << fdMessage1 << qtMessage0 << qtMessage1 << qtMessage2 << stdMessage0 << stdMessage1; // Since the order of the messages outputed on the terminal is not deterministic, // let's just make sure that all messages have been displayed on the terminal // independently of their order. if (!checkTerminalOutput(expectedMessages)) { return EXIT_FAILURE; } QString errorMsg; ctkErrorLogModel model; ctkErrorLogModel::TerminalOutputs currentTerminalOutputEnabled = model.terminalOutputs(); errorMsg = checkBoolean(__LINE__, "TerminalOutputEnabled", currentTerminalOutputEnabled, ctkErrorLogModel::None); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } model.setTerminalOutputs(ctkErrorLogModel::All); currentTerminalOutputEnabled = model.terminalOutputs(); errorMsg = checkBoolean(__LINE__, "TerminalOutputEnabled", currentTerminalOutputEnabled, ctkErrorLogModel::All); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } ctkModelTester modelTester; modelTester.setVerbose(false); try { modelTester.setModel(&model); // Monitor Qt messages model.registerMsgHandler(new ctkErrorLogQtMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogQtMessageHandler::HandlerName, true); // Monitor Stream messages model.registerMsgHandler(new ctkErrorLogStreamMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogStreamMessageHandler::HandlerName, true); // Monitor FD messages model.registerMsgHandler(new ctkErrorLogFDMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogFDMessageHandler::HandlerName, true); fprintf(stdout, "%s\n", qPrintable(fdMessage0)); fflush(stdout); qDebug().nospace() << qPrintable(qtMessage0); std::cerr << qPrintable(stdMessage0) << std::endl; qWarning().nospace() << qPrintable(qtMessage1); fprintf(stderr, "%s\n", qPrintable(fdMessage1)); fflush(stderr); std::cout << qPrintable(stdMessage1) << std::endl; qCritical().nospace() << qPrintable(qtMessage2); // Give enough time to the ErrorLogModel to consider the queued messages. processEvents(1000); errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ expectedMessages.count()); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } errorMsg = checkTextMessages(__LINE__, model, expectedMessages); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } } catch (const char* error) { model.disableAllMsgHandler(); std::cerr << error << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }
//----------------------------------------------------------------------------- int ctkErrorLogModelTest1(int argc, char * argv []) { QCoreApplication app(argc, argv); Q_UNUSED(app); ctkErrorLogModel model; ctkModelTester modelTester; modelTester.setVerbose(false); QString errorMsg; QStringList enabledMessageHandlers = model.msgHandlerEnabled(); int currentEnabledMessageHandlersCount = enabledMessageHandlers.count(); errorMsg = checkInteger(__LINE__, "EnabledMessageHandlersCount", currentEnabledMessageHandlersCount, 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); return EXIT_FAILURE; } try { modelTester.setModel(&model); // -------------------------------------------------------------------------- // Monitor Qt messages { model.registerMsgHandler(new ctkErrorLogQtMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogQtMessageHandler::HandlerName, true); errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); return EXIT_FAILURE; } QString qtMessage0("This is a qDebug message"); qDebug().nospace() << qPrintable(qtMessage0); QString qtMessage1("This is a qWarning message"); qWarning().nospace() << qPrintable(qtMessage1); QString qtMessage2("This is a qCritical message"); qCritical().nospace() << qPrintable(qtMessage2); QStringList expectedQtMessages; expectedQtMessages << qtMessage0 << qtMessage1 << qtMessage2; errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ expectedQtMessages.count()); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } errorMsg = checkTextMessages(__LINE__, model, expectedQtMessages); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); return EXIT_FAILURE; } // Check if msgHandlerEnabled() works as expected enabledMessageHandlers = model.msgHandlerEnabled(); currentEnabledMessageHandlersCount = enabledMessageHandlers.count(); errorMsg = checkInteger(__LINE__, "EnabledMessageHandlersCount", currentEnabledMessageHandlersCount, 1); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); return EXIT_FAILURE; } // Clear model.clear(); // Disable Qt messages monitoring model.setMsgHandlerEnabled(ctkErrorLogQtMessageHandler::HandlerName, false); qDebug() << "This qDebug message should appear in the console"; qWarning() << "This qWarning message should appear in the console"; qCritical() << "This qCritical message should appear in the console"; errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } } // -------------------------------------------------------------------------- // Monitor Stream messages { model.registerMsgHandler(new ctkErrorLogStreamMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogStreamMessageHandler::HandlerName, true); // Make sure Qt message handler is still disabled if (model.msgHandlerEnabled(ctkErrorLogQtMessageHandler::HandlerName)) { model.disableAllMsgHandler(); errorMsg = QLatin1String("Line %1 - Qt message handler should be disabled"); printErrorMessage(errorMsg.arg(__LINE__)); return EXIT_FAILURE; } errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } QString streamMessage0("This is a Cout message"); std::cout << qPrintable(streamMessage0) << std::endl; QString streamMessage1("This is a Cerr message"); std::cerr << qPrintable(streamMessage1) << std::endl; QStringList expectedStreamMessages; expectedStreamMessages << streamMessage0 << streamMessage1; errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ expectedStreamMessages.count()); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } errorMsg = checkTextMessages(__LINE__, model, expectedStreamMessages); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); return EXIT_FAILURE; } // Clear model.clear(); // Disable Stream messages monitoring model.setMsgHandlerEnabled(ctkErrorLogStreamMessageHandler::HandlerName, false); std::cout << "This std::cout message should appear in the console" << std::endl; std::cerr << "This std::cerr message should appear in the console" << std::endl; errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } } // -------------------------------------------------------------------------- // Monitor FD messages { model.registerMsgHandler(new ctkErrorLogFDMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogFDMessageHandler::HandlerName, true); errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } QString fdMessage0("This is a stdout"); fprintf(stdout, "%s", qPrintable(fdMessage0)); QString fdMessage0b(" message"); fprintf(stdout, "%s\n", qPrintable(fdMessage0b)); fdMessage0.append(fdMessage0b); fflush(stdout); // QString fdMessage1("This is a 2nd stdout message"); // fprintf(stdout, "%s\n", qPrintable(fdMessage1)); // fflush(stdout); QString fdMessage2("This is a stderr"); fprintf(stderr, "%s", qPrintable(fdMessage2)); QString fdMessage2b(" message"); fprintf(stderr, "%s\n", qPrintable(fdMessage2b)); fdMessage2.append(fdMessage2b); fflush(stderr); // QString fdMessage3("This is a 2nd stderr message"); // fprintf(stderr, "%s\n", qPrintable(fdMessage3)); // fflush(stderr); QStringList expectedFDMessages; expectedFDMessages << fdMessage0 /*<< fdMessage1*/ << fdMessage2 /*<< fdMessage3*/; // Give enough time to the QFileSystemWatcher used internally by ctkErrorLogFDMessageHandler // to consider the updated files. QTimer timer; timer.setSingleShot(true); timer.start(1000); while(timer.isActive()) { QCoreApplication::processEvents(); } errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ expectedFDMessages.count()); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } errorMsg = checkTextMessages(__LINE__, model, expectedFDMessages); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); return EXIT_FAILURE; } // Clear model.clear(); // Disable FD messages monitoring model.setMsgHandlerEnabled(ctkErrorLogFDMessageHandler::HandlerName, false); fprintf(stdout, "%s", "This stdout message should appear in the console\n"); fprintf(stderr, "%s", "This stderr message should appear in the console\n"); fflush(stderr); errorMsg = checkRowCount(__LINE__, model.rowCount(), /* expected = */ 0); if (!errorMsg.isEmpty()) { model.disableAllMsgHandler(); printErrorMessage(errorMsg); printTextMessages(model); return EXIT_FAILURE; } } } catch (const char* error) { model.disableAllMsgHandler(); std::cerr << error << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }
//----------------------------------------------------------------------------- int ctkErrorLogModelFileLoggingTest1(int argc, char * argv []) { QCoreApplication app(argc, argv); Q_UNUSED(app); ctkErrorLogModel model; // fileLoggingEnabled if (!checkBoolean(__LINE__, "FileLoggingEnabled", model.fileLoggingEnabled(), false).isEmpty()) { return EXIT_FAILURE; } model.setFileLoggingEnabled(true); if (!checkBoolean(__LINE__, "FileLoggingEnabled", model.fileLoggingEnabled(), true).isEmpty()) { return EXIT_FAILURE; } // Create log file QTemporaryFile logFile(QDir::tempPath() + "/ctkErrorLogModelFileLoggingTest1.XXXXXX"); logFile.setAutoRemove(false); logFile.open(); logFile.close(); QString logFilePath = logFile.fileName(); // filePath if (!checkString(__LINE__, "FilePath", model.filePath(), "").isEmpty()) { return EXIT_FAILURE; } model.setFilePath(logFilePath); if (!checkString(__LINE__, "FilePath", model.filePath(), logFilePath).isEmpty()) { return EXIT_FAILURE; } // Monitor Qt messages model.registerMsgHandler(new ctkErrorLogQtMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogQtMessageHandler::HandlerName, true); // Monitor Stream messages model.registerMsgHandler(new ctkErrorLogStreamMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogStreamMessageHandler::HandlerName, true); // Monitor FD messages model.registerMsgHandler(new ctkErrorLogFDMessageHandler); model.setMsgHandlerEnabled(ctkErrorLogFDMessageHandler::HandlerName, true); // Qt messages QString qtMessage0("This is a qDebug message"); qDebug().nospace() << qPrintable(qtMessage0); QString qtMessage1("This is a qWarning message"); qWarning().nospace() << qPrintable(qtMessage1); QString qtMessage2("This is a qCritical message"); qCritical().nospace() << qPrintable(qtMessage2); // Stream messages QString streamMessage0("This is a Cout message"); std::cout << qPrintable(streamMessage0) << std::endl; QString streamMessage1("This is a Cerr message"); std::cerr << qPrintable(streamMessage1) << std::endl; // FD messages QString fdMessage0("This is a stdout"); fprintf(stdout, "%s", qPrintable(fdMessage0)); QString fdMessage0b(" message"); fprintf(stdout, "%s\n", qPrintable(fdMessage0b)); fdMessage0.append(fdMessage0b); fflush(stdout); // XXX FD messages from stderr and stdout are not always reported in the same order //QString fdMessage1("This is a 2nd stdout message"); //fprintf(stdout, "%s\n", qPrintable(fdMessage1)); //fflush(stdout); QString fdMessage2("This is a stderr"); fprintf(stderr, "%s", qPrintable(fdMessage2)); QString fdMessage2b(" message"); fprintf(stderr, "%s\n", qPrintable(fdMessage2b)); fdMessage2.append(fdMessage2b); fflush(stderr); //QString fdMessage3("This is a 2nd stderr message"); //fprintf(stderr, "%s\n", qPrintable(fdMessage3)); //fflush(stderr); // Give enough time to the ErrorLogModel to consider the queued messages. processEvents(1000); model.disableAllMsgHandler(); QList<QStringList> expectedLogEntries; expectedLogEntries << (QStringList() << "DEBUG" << "Qt" << qtMessage0); expectedLogEntries << (QStringList() << "WARNING" << "Qt" << qtMessage1); expectedLogEntries << (QStringList() << "CRITICAL" << "Qt" << qtMessage2); expectedLogEntries << (QStringList() << "INFO" << "Stream" << streamMessage0); expectedLogEntries << (QStringList() << "CRITICAL" << "Stream" << streamMessage1); expectedLogEntries << (QStringList() << "INFO" << "FD" << fdMessage0); //expectedLogEntries << (QStringList() << "INFO" << "FD" << fdMessage1); expectedLogEntries << (QStringList() << "CRITICAL" << "FD" << fdMessage2); //expectedLogEntries << (QStringList() << "CRITICAL" << "FD" << fdMessage3); QStringList currentLogEntries = readFile(logFilePath); QString expectedLogEntryPatternTemplate("^\\[%1\\]\\[%2\\] [0-9\\.\\s\\:]+ \\[\\] \\(unknown\\:0\\) \\- %3$"); for(int entryIndex = 0; entryIndex < expectedLogEntries.size(); ++entryIndex) { QStringList entry = expectedLogEntries.at(entryIndex); QRegExp regexp(expectedLogEntryPatternTemplate.arg(entry.at(0)).arg(entry.at(1)).arg(entry.at(2))); if (!regexp.exactMatch(currentLogEntries.at(entryIndex))) { printErrorMessage( QString("Line %1 - Log entry %2 does NOT math expected regular expression.\n\tLogEntry: %3\n\tRegExp: %4"). arg(__LINE__).arg(entryIndex).arg(currentLogEntries.at(entryIndex)).arg(regexp.pattern())); return EXIT_FAILURE; } } return EXIT_SUCCESS; }