feat(tests): add test for stack overflow in ConcurrentTask

Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
flow 2023-01-17 22:51:54 -03:00
parent 1a35fec134
commit ad74fedfba
No known key found for this signature in database
GPG Key ID: 8D0F221F0A59F469

View File

@ -1,4 +1,6 @@
#include <QTest> #include <QTest>
#include <QTimer>
#include <QThread>
#include <tasks/ConcurrentTask.h> #include <tasks/ConcurrentTask.h>
#include <tasks/MultipleOptionsTask.h> #include <tasks/MultipleOptionsTask.h>
@ -11,6 +13,9 @@ class BasicTask : public Task {
friend class TaskTest; friend class TaskTest;
public:
BasicTask(bool show_debug_log = true) : Task(nullptr, show_debug_log) {}
private: private:
void executeTask() override void executeTask() override
{ {
@ -30,6 +35,41 @@ class BasicTask_MultiStep : public Task {
void executeTask() override {}; void executeTask() override {};
}; };
class BigConcurrentTask : public QThread {
Q_OBJECT
ConcurrentTask big_task;
void run() override
{
QTimer deadline;
deadline.setInterval(10000);
connect(&deadline, &QTimer::timeout, this, [this]{ passed_the_deadline = true; });
deadline.start();
static const unsigned s_num_tasks = 1 << 14;
auto sub_tasks = new BasicTask*[s_num_tasks];
for (unsigned i = 0; i < s_num_tasks; i++) {
sub_tasks[i] = new BasicTask(false);
big_task.addTask(sub_tasks[i]);
}
big_task.run();
while (!big_task.isFinished() && !passed_the_deadline)
QCoreApplication::processEvents();
emit finished();
}
public:
bool passed_the_deadline = false;
signals:
void finished();
};
class TaskTest : public QObject { class TaskTest : public QObject {
Q_OBJECT Q_OBJECT
@ -183,6 +223,23 @@ class TaskTest : public QObject {
return t.isFinished(); return t.isFinished();
}, 1000), "Task didn't finish as it should."); }, 1000), "Task didn't finish as it should.");
} }
void test_stackOverflowInConcurrentTask()
{
QEventLoop loop;
auto thread = new BigConcurrentTask;
thread->setStackSize(32 * 1024);
connect(thread, &BigConcurrentTask::finished, &loop, &QEventLoop::quit);
thread->start();
loop.exec();
QVERIFY(!thread->passed_the_deadline);
thread->deleteLater();
}
}; };
QTEST_GUILESS_MAIN(TaskTest) QTEST_GUILESS_MAIN(TaskTest)