diff --git a/plugins/debuggercommon/tests/debuggees/CMakeLists.txt b/plugins/debuggercommon/tests/debuggees/CMakeLists.txt index 61e8033837..9d346f2e3b 100644 --- a/plugins/debuggercommon/tests/debuggees/CMakeLists.txt +++ b/plugins/debuggercommon/tests/debuggees/CMakeLists.txt @@ -1,91 +1,92 @@ function(add_debuggable_executable target) cmake_parse_arguments(add_debuggable_executable "" "" "SRCS" ${ARGN}) add_executable(${target} ${add_debuggable_executable_SRCS}) + ecm_mark_nongui_executable(${target}) # force debug symbols for our debuggees, disable optimizations if (WIN32) set(_flags "/0d") else() set(_flags "-O0") endif() set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} ${_flags}") endfunction() add_debuggable_executable(debuggee_debugee SRCS debugee.cpp) add_debuggable_executable(debuggee_debugeeslow SRCS debugeeslow.cpp) add_debuggable_executable(debuggee_crash SRCS debugeecrash.cpp) add_debuggable_executable(debuggee_debugeerecursion SRCS debugeerecursion.cpp) add_debuggable_executable(debuggee_debugeespace SRCS "debugee space.cpp") add_debuggable_executable(debuggee_debugeemultilocbreakpoint SRCS debugeemultilocbreakpoint.cpp) add_debuggable_executable(debuggee_debugeemultiplebreakpoint SRCS debugeemultiplebreakpoint.cpp) add_debuggable_executable(debuggee_debugeeechoenv SRCS debugeeechoenv.cpp) add_debuggable_executable(debuggee_debugeepath SRCS debugeepath.cpp) add_debuggable_executable(debuggee_debugeethreads SRCS debugeethreads.cpp) target_link_libraries(debuggee_debugeethreads Qt5::Core) add_debuggable_executable(debuggee_debugeeqt SRCS debugeeqt.cpp) target_link_libraries(debuggee_debugeeqt Qt5::Core) add_debuggable_executable(debuggee_debugeeexception SRCS debugeeexception.cpp) kde_target_enable_exceptions(debuggee_debugeeexception PRIVATE) if (HAVE_PATH_WITH_SPACES_TEST) add_subdirectory("path with space") endif() add_debuggable_executable(debuggee_qstring SRCS qstring.cpp) target_link_libraries(debuggee_qstring Qt5::Core) add_debuggable_executable(debuggee_qbytearray SRCS qbytearray.cpp) target_link_libraries(debuggee_qbytearray Qt5::Core) add_debuggable_executable(debuggee_qlistcontainer SRCS qlistcontainer.cpp) target_link_libraries(debuggee_qlistcontainer Qt5::Core) add_debuggable_executable(debuggee_qmapint SRCS qmapint.cpp) target_link_libraries(debuggee_qmapint Qt5::Core) add_debuggable_executable(debuggee_qmapstring SRCS qmapstring.cpp) target_link_libraries(debuggee_qmapstring Qt5::Core) add_debuggable_executable(debuggee_qmapstringbool SRCS qmapstringbool.cpp) target_link_libraries(debuggee_qmapstringbool Qt5::Core) add_debuggable_executable(debuggee_qdate SRCS qdate.cpp) target_link_libraries(debuggee_qdate Qt5::Core) add_debuggable_executable(debuggee_qtime SRCS qtime.cpp) target_link_libraries(debuggee_qtime Qt5::Core) add_debuggable_executable(debuggee_qdatetime SRCS qdatetime.cpp) target_link_libraries(debuggee_qdatetime Qt5::Core) add_debuggable_executable(debuggee_qurl SRCS qurl.cpp) target_link_libraries(debuggee_qurl Qt5::Core) add_debuggable_executable(debuggee_qhashint SRCS qhashint.cpp) target_link_libraries(debuggee_qhashint Qt5::Core) add_debuggable_executable(debuggee_qhashstring SRCS qhashstring.cpp) target_link_libraries(debuggee_qhashstring Qt5::Core) add_debuggable_executable(debuggee_qsetint SRCS qsetint.cpp) target_link_libraries(debuggee_qsetint Qt5::Core) add_debuggable_executable(debuggee_qsetstring SRCS qsetstring.cpp) target_link_libraries(debuggee_qsetstring Qt5::Core) add_debuggable_executable(debuggee_qchar SRCS qchar.cpp) target_link_libraries(debuggee_qchar Qt5::Core) add_debuggable_executable(debuggee_quuid SRCS quuid.cpp) target_link_libraries(debuggee_quuid Qt5::Core) add_debuggable_executable(debuggee_qlistpod SRCS qlistpod.cpp) target_link_libraries(debuggee_qlistpod Qt5::Core) add_debuggable_executable(debuggee_ktexteditortypes SRCS ktexteditortypes.cpp) target_link_libraries(debuggee_ktexteditortypes Qt5::Core KF5::TextEditor KDev::Util) add_debuggable_executable(debuggee_kdeveloptypes SRCS kdeveloptypes.cpp) target_link_libraries(debuggee_kdeveloptypes Qt5::Core KF5::TextEditor KDev::Util) diff --git a/plugins/debuggercommon/tests/testhelper.cpp b/plugins/debuggercommon/tests/testhelper.cpp index 97d6a5b454..e67fc00cc3 100644 --- a/plugins/debuggercommon/tests/testhelper.cpp +++ b/plugins/debuggercommon/tests/testhelper.cpp @@ -1,170 +1,174 @@ /* * Common helpers for MI debugger unit tests * Copyright 2016 Aetf * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "testhelper.h" #include "debuggers-tests-config.h" #include "midebugsession.h" #include #include #include #include #include #include namespace KDevMI { QUrl findExecutable(const QString& name) { - QFileInfo info(QString::fromLocal8Bit(DEBUGGEE_BIN_DIR), name); + QString exeExtension; +#ifdef Q_OS_WIN + exeExtension = QStringLiteral(".exe"); +#endif + QFileInfo info(QString::fromLocal8Bit(DEBUGGEE_BIN_DIR), name + exeExtension); Q_ASSERT_X(info.exists(), "findExecutable", info.filePath().toLocal8Bit()); Q_ASSERT(info.isExecutable()); return QUrl::fromLocalFile(info.canonicalFilePath()); } QString findSourceFile(const QString& name) { return findFile(DEBUGGEE_SRC_DIR, name); } QString findFile(const char* dir, const QString& name) { QFileInfo info(QString::fromLocal8Bit(dir), name); Q_ASSERT_X(info.exists(), "findFile", info.filePath().toLocal8Bit()); return info.canonicalFilePath(); } bool isAttachForbidden(const char *file, int line) { // if on linux, ensure we can actually attach QFile canRun(QStringLiteral("/proc/sys/kernel/yama/ptrace_scope")); if (canRun.exists()) { if (!canRun.open(QIODevice::ReadOnly)) { QTest::qFail("Something is wrong: /proc/sys/kernel/yama/ptrace_scope exists but cannot be read", file, line); return true; } if (canRun.read(1).toInt() != 0) { QTest::qSkip("ptrace attaching not allowed, skipping test. To enable it, set /proc/sys/kernel/yama/ptrace_scope to 0.", file, line); return true; } } return false; } bool compareData(QModelIndex index, const QString& expected, const char *file, int line, bool useRE) { QString s = index.model()->data(index, Qt::DisplayRole).toString(); bool matched = true; if (useRE) { QRegularExpression re(expected); matched = re.match(s).hasMatch(); } else { matched = s == expected; } return QTest::qVerify(matched, "Comparsion of data", qPrintable(QString("'%0' didn't match expected '%1' in %2:%3") .arg(s).arg(expected).arg(file).arg(line)), file, line); } bool waitForAWhile(MIDebugSession *session, int ms, const char *file, int line) { QPointer s(session); //session can get deleted in DebugController QTest::qWait(ms); if (!s) { QTest::qFail("Session ended while waiting", file, line); return false; } return true; } bool waitForState(MIDebugSession *session, KDevelop::IDebugSession::DebuggerState state, const char *file, int line, bool waitForIdle) { QPointer s(session); //session can get deleted in DebugController QTime stopWatch; stopWatch.start(); // legacy behavior for tests that implicitly may require waiting for idle, // but which were written before waitForIdle was added waitForIdle = waitForIdle || state != MIDebugSession::EndedState; while (s && (s->state() != state || (waitForIdle && s->debuggerStateIsOn(s_dbgBusy)))) { if (stopWatch.elapsed() > 10000) { qWarning() << "current state" << s->state() << "waiting for" << state; QTest::qFail(qPrintable(QString("Timeout before reaching state %0").arg(state)), file, line); return false; } QTest::qWait(20); } // NOTE: don't wait anymore after leaving the loop. Waiting reenters event loop and // may change session state. if (!s && state != MIDebugSession::EndedState) { QTest::qFail(qPrintable(QString("Session ended before reaching state %0").arg(state)), file, line); return false; } qDebug() << "Reached state " << state << " in " << file << ':' << line; return true; } TestWaiter::TestWaiter(MIDebugSession * session_, const char * condition_, const char * file_, int line_) : session(session_) , condition(condition_) , file(file_) , line(line_) { stopWatch.start(); } bool TestWaiter::waitUnless(bool ok) { if (ok) { qDebug() << "Condition " << condition << " reached in " << file << ':' << line; return false; } if (stopWatch.elapsed() > 5000) { QTest::qFail(qPrintable(QString("Timeout before reaching condition %0").arg(condition)), file, line); return false; } QTest::qWait(100); if (!session) { QTest::qFail(qPrintable(QString("Session ended without reaching condition %0").arg(condition)), file, line); return false; } return true; } } // end of namespace KDevMI