diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-11-27 08:28:38 +0200 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-11-27 19:30:48 +0200 |
commit | d9dac46e6f7c1bfbb76daa016fd7aaa580026d70 (patch) | |
tree | 2b20fb7cbe039fa98905774c5d707b87721289a0 /test | |
parent | 1f6342f46bda8d2c4bc693dda01f6b5385e11cf6 (diff) |
test: message: Add slow receiver test
There's a race in the message delivery against object deletion. Add a
test that triggers it reliably. This test is expected to fail with an
assertion error.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'test')
-rw-r--r-- | test/message.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/message.cpp b/test/message.cpp index cf21d5ca..7ebedb55 100644 --- a/test/message.cpp +++ b/test/message.cpp @@ -52,6 +52,25 @@ private: Status status_; }; +class SlowMessageReceiver : public Object +{ +protected: + void message(Message *msg) + { + if (msg->type() != Message::None) { + Object::message(msg); + return; + } + + /* + * Don't access any member of the object here (including the + * vtable) as the object will be deleted by the main thread + * while we're sleeping. + */ + this_thread::sleep_for(chrono::milliseconds(100)); + } +}; + class MessageTest : public Test { protected: @@ -88,6 +107,19 @@ protected: break; } + /* + * Test for races between message delivery and object deletion. + * Failures result in assertion errors, there is no need for + * explicit checks. + */ + SlowMessageReceiver *slowReceiver = new SlowMessageReceiver(); + slowReceiver->moveToThread(&thread_); + slowReceiver->postMessage(utils::make_unique<Message>(Message::None)); + + this_thread::sleep_for(chrono::milliseconds(10)); + + delete slowReceiver; + return TestPass; } |