feat(tests): add test for stack overflow in ConcurrentTask
Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
parent
1a35fec134
commit
ad74fedfba
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user