Commit e789e5f5 authored by Dominik Charousset's avatar Dominik Charousset

Fix message lifetime test

parent d8912f51
...@@ -27,7 +27,7 @@ testee::~testee() { ...@@ -27,7 +27,7 @@ testee::~testee() {
behavior testee::make_behavior() { behavior testee::make_behavior() {
return { return {
others() >> [=] { others() >> [=] {
CAF_CHECK_EQUAL(last_dequeued().vals()->get_reference_count(), 2); CAF_CHECK_EQUAL(last_dequeued().cvals()->get_reference_count(), 2);
quit(); quit();
return last_dequeued(); return last_dequeued();
} }
...@@ -59,22 +59,51 @@ behavior tester::make_behavior() { ...@@ -59,22 +59,51 @@ behavior tester::make_behavior() {
send(m_aut, m_msg); send(m_aut, m_msg);
return { return {
on(1, 2, 3) >> [=] { on(1, 2, 3) >> [=] {
CAF_CHECK(last_dequeued().vals()->get_reference_count() >= 2); CAF_CHECK_EQUAL(last_dequeued().cvals()->get_reference_count(), 2);
CAF_CHECK(last_dequeued().vals().get() == m_msg.vals().get()); CAF_CHECK(last_dequeued().cvals().get() == m_msg.cvals().get());
}, },
[=](const down_msg& dm) { [=](const down_msg& dm) {
CAF_CHECK(dm.source == m_aut); CAF_CHECK(dm.source == m_aut);
CAF_CHECK_EQUAL(dm.reason, exit_reason::normal); CAF_CHECK_EQUAL(dm.reason, exit_reason::normal);
CAF_CHECK_EQUAL(last_dequeued().vals()->get_reference_count(), 1); CAF_CHECK_EQUAL(last_dequeued().cvals()->get_reference_count(), 1);
quit(); quit();
}, },
others() >> CAF_UNEXPECTED_MSG_CB(this) others() >> CAF_UNEXPECTED_MSG_CB(this)
}; };
} }
void test_message_lifetime_in_scoped_actor() {
auto msg = make_message(1, 2, 3);
scoped_actor self;
self->send(self, msg);
self->receive(
on(1, 2, 3) >> [&] {
CAF_CHECK_EQUAL(msg.cvals()->get_reference_count(), 2);
CAF_CHECK_EQUAL(self->last_dequeued().cvals()->get_reference_count(), 2);
CAF_CHECK(self->last_dequeued().cvals().get() == msg.cvals().get());
}
);
CAF_CHECK_EQUAL(msg.cvals()->get_reference_count(), 1);
msg = make_message(42);
self->send(self, msg);
self->receive(
[&](int& value) {
CAF_CHECK_EQUAL(msg.cvals()->get_reference_count(), 1);
CAF_CHECK_EQUAL(self->last_dequeued().cvals()->get_reference_count(), 1);
CAF_CHECK(self->last_dequeued().cvals().get() != msg.cvals().get());
value = 10;
}
);
CAF_CHECK_EQUAL(msg.get_as<int>(0), 42);
}
void test_message_lifetime() { void test_message_lifetime() {
// put some preassure on the scheduler test_message_lifetime_in_scoped_actor();
for (size_t i = 0; i < 1000; ++i) { if (CAF_TEST_RESULT() != 0) {
return;
}
// put some preassure on the scheduler (check for thread safety)
for (size_t i = 0; i < 100; ++i) {
spawn<tester>(spawn<testee>()); spawn<tester>(spawn<testee>());
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment