Commit 05df7bfe authored by Dominik Charousset's avatar Dominik Charousset

Leave cleanup in unit tests to ref counting

parent 765b76a8
......@@ -61,7 +61,6 @@ CAF_TEST(test_custom_exception_handler) {
}
return exit_reason::unhandled_exception;
};
{
scoped_actor self{system};
auto testee1 = self->spawn<monitored>([=](event_based_actor* eb_self) {
eb_self->set_exception_handler(handler);
......@@ -91,6 +90,4 @@ CAF_TEST(test_custom_exception_handler) {
}
}
);
self->await_all_other_actors_done();
}
}
......@@ -564,9 +564,8 @@ CAF_TEST(constructor_attach) {
},
[=](ok_atom, const error& reason) {
CAF_CHECK_EQUAL(reason, exit_reason::user_shutdown);
if (++downs_ == 2) {
if (++downs_ == 2)
quit(reason);
}
},
[=](exit_msg& msg) {
delegate(testee_, std::move(msg));
......
......@@ -31,26 +31,26 @@ using namespace caf;
using msg_atom = atom_constant<atom("msg")>;
using timeout_atom = atom_constant<atom("timeout")>;
void testee(event_based_actor* self) {
behavior testee(event_based_actor* self) {
auto counter = std::make_shared<int>(0);
auto grp = self->system().groups().get("local", "test");
self->join(grp);
CAF_MESSAGE("self joined group");
self->become(
self->send(grp, msg_atom::value);
return {
[=](msg_atom) {
CAF_MESSAGE("received `msg_atom`");
++*counter;
self->leave(grp);
self->send(grp, msg_atom::value);
self->send(self, timeout_atom::value);
},
[=](timeout_atom) {
// this actor should receive only 1 message
CAF_CHECK_EQUAL(*counter, 1);
self->quit();
}
);
self->send(grp, msg_atom::value);
self->delayed_send(self, std::chrono::seconds(1), timeout_atom::value);
};
}
CAF_TEST(test_local_group) {
......
......@@ -19,7 +19,7 @@
#include "caf/config.hpp"
#define CAF_SUITE request
#define CAF_SUITE request_response
#include "caf/test/unit_test.hpp"
#include "caf/all.hpp"
......@@ -409,24 +409,22 @@ CAF_TEST(client_server_worker_user_case) {
);
}
behavior snyc_send_no_then_A(event_based_actor * self) {
behavior request_no_then_A(event_based_actor*) {
return [=](int number) {
CAF_MESSAGE("got " << number);
self->quit();
};
}
behavior snyc_send_no_then_B(event_based_actor * self) {
behavior request_no_then_B(event_based_actor* self) {
return {
[=](int number) {
self->request(self->spawn(snyc_send_no_then_A), infinite, number);
self->quit();
self->request(self->spawn(request_no_then_A), infinite, number);
}
};
}
CAF_TEST(request_no_then) {
anon_send(system.spawn(snyc_send_no_then_B), 8);
anon_send(system.spawn(request_no_then_B), 8);
}
CAF_TEST(async_request) {
......
......@@ -29,6 +29,9 @@
using namespace caf;
using std::chrono::seconds;
using std::chrono::milliseconds;
namespace {
using ping_atom = atom_constant<atom("ping")>;
......@@ -38,7 +41,7 @@ using send_ping_atom = atom_constant<atom("send_ping")>;
behavior pong() {
return {
[=] (ping_atom) {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::this_thread::sleep_for(seconds(1));
return pong_atom::value;
}
};
......@@ -49,7 +52,7 @@ behavior ping1(event_based_actor* self, const actor& pong_actor) {
self->send(self, send_ping_atom::value);
return {
[=](send_ping_atom) {
self->request(pong_actor, std::chrono::milliseconds(100), ping_atom::value).then(
self->request(pong_actor, milliseconds(100), ping_atom::value).then(
[=](pong_atom) {
CAF_ERROR("received pong atom");
self->quit(exit_reason::user_shutdown);
......@@ -69,7 +72,7 @@ behavior ping2(event_based_actor* self, const actor& pong_actor) {
auto received_inner = std::make_shared<bool>(false);
return {
[=](send_ping_atom) {
self->request(pong_actor, std::chrono::milliseconds(100), ping_atom::value).then(
self->request(pong_actor, milliseconds(100), ping_atom::value).then(
[=](pong_atom) {
CAF_ERROR("received pong atom");
self->quit(exit_reason::user_shutdown);
......@@ -81,7 +84,7 @@ behavior ping2(event_based_actor* self, const actor& pong_actor) {
}
);
},
after(std::chrono::milliseconds(100)) >> [=] {
after(milliseconds(100)) >> [=] {
CAF_CHECK_EQUAL(*received_inner, true);
self->quit(exit_reason::user_shutdown);
}
......@@ -93,7 +96,7 @@ behavior ping3(event_based_actor* self, const actor& pong_actor) {
self->send(self, send_ping_atom::value);
return {
[=](send_ping_atom) {
self->request(pong_actor, std::chrono::milliseconds(100),
self->request(pong_actor, milliseconds(100),
ping_atom::value).then(
[=](pong_atom) {
CAF_ERROR("received pong atom");
......@@ -115,7 +118,7 @@ behavior ping4(event_based_actor* self, const actor& pong_actor) {
auto received_outer = std::make_shared<bool>(false);
return {
[=](send_ping_atom) {
self->request(pong_actor, std::chrono::milliseconds(100),
self->request(pong_actor, milliseconds(100),
ping_atom::value).then(
[=](pong_atom) {
CAF_ERROR("received pong atom");
......@@ -128,7 +131,7 @@ behavior ping4(event_based_actor* self, const actor& pong_actor) {
}
);
},
after(std::chrono::milliseconds(50)) >> [=] {
after(milliseconds(50)) >> [=] {
CAF_MESSAGE("outer timeout: check");
*received_outer = true;
}
......@@ -138,7 +141,7 @@ behavior ping4(event_based_actor* self, const actor& pong_actor) {
void ping5(event_based_actor* self, const actor& pong_actor) {
self->link_to(pong_actor);
auto timeouts = std::make_shared<int>(0);
self->request(pong_actor, std::chrono::milliseconds(100),
self->request(pong_actor, milliseconds(100),
ping_atom::value).then(
[=](pong_atom) {
CAF_ERROR("received pong atom");
......@@ -149,7 +152,7 @@ void ping5(event_based_actor* self, const actor& pong_actor) {
self->quit();
}
);
self->request(pong_actor, std::chrono::milliseconds(100),
self->request(pong_actor, milliseconds(100),
ping_atom::value).await(
[=](pong_atom) {
CAF_ERROR("received pong atom");
......
......@@ -92,10 +92,6 @@ CAF_TEST(identity) {
CAF_CHECK_NOT_EQUAL(h->id(), g->id());
CAF_CHECK_NOT_EQUAL(h.address(), g.address());
CAF_CHECK_EQUAL(h->message_types(), g->home_system().message_types(h));
anon_send_exit(f, exit_reason::kill);
anon_send_exit(g, exit_reason::kill);
// killing both f and g triggers down messages to h,
// ultimately clearing up held references and h will become unreachable
}
// spawned dead if `g` is already dead upon spawning
......@@ -107,7 +103,6 @@ CAF_TEST(lifetime_1a) {
wait_until_is_terminated();
auto h = f * g;
CAF_CHECK(exited(h));
anon_send_exit(f, exit_reason::kill);
}
// spawned dead if `f` is already dead upon spawning
......@@ -119,7 +114,6 @@ CAF_TEST(lifetime_1b) {
wait_until_is_terminated();
auto h = f * g;
CAF_CHECK(exited(h));
anon_send_exit(g, exit_reason::kill);
}
// `f.g` exits when `g` exits
......@@ -129,8 +123,6 @@ CAF_TEST(lifetime_2a) {
auto h = f * g;
self->monitor(h);
anon_send(g, message{});
wait_until_is_terminated();
anon_send_exit(f, exit_reason::kill);
}
// `f.g` exits when `f` exits
......@@ -140,8 +132,6 @@ CAF_TEST(lifetime_2b) {
auto h = f * g;
self->monitor(h);
anon_send(f, message{});
wait_until_is_terminated();
anon_send_exit(g, exit_reason::kill);
}
CAF_TEST(request_response_promise) {
......@@ -158,8 +148,6 @@ CAF_TEST(request_response_promise) {
CAF_CHECK_EQUAL(err.code(), static_cast<uint8_t>(sec::request_receiver_down));
}
);
anon_send_exit(f, exit_reason::kill);
anon_send_exit(g, exit_reason::kill);
}
// single composition of distinct actors
......@@ -172,8 +160,6 @@ CAF_TEST(dot_composition_1) {
CAF_CHECK_EQUAL(res, (42 * 2.0) * (42 * 4.0));
}
);
anon_send_exit(first, exit_reason::kill);
anon_send_exit(second, exit_reason::kill);
}
// multiple self composition
......@@ -189,7 +175,6 @@ CAF_TEST(dot_composition_2) {
CAF_CHECK(false);
}
);
anon_send_exit(dbl_actor, exit_reason::kill);
}
CAF_TEST_FIXTURE_SCOPE_END()
......@@ -101,5 +101,4 @@ CAF_TEST(test_serial_reply) {
}
);
CAF_REQUIRE(self->mailbox().count() == 0);
self->send_exit(master, exit_reason::user_shutdown);
}
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2015 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#include "caf/config.hpp"
#define CAF_SUITE shutdown
#include "caf/test/unit_test.hpp"
#include "caf/all.hpp"
using namespace caf;
namespace {
behavior testee() {
return {
[] {
// nop
}
};
}
} // namespace <anonymous>
CAF_TEST(repeated_shutdown) {
actor_system system;
for (auto i = 0; i < 10; ++i) {
CAF_MESSAGE("run #" << i);
auto g = system.groups().anonymous();
for (auto j = 0; j < 10; ++j)
system.spawn_in_group(g, testee);
anon_send(g, "hello actors");
anon_send(g, exit_msg{invalid_actor_addr, exit_reason::user_shutdown});
system.await_all_actors_done();
}
}
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2015 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#include "caf/config.hpp"
#define CAF_SUITE simple_reply_response
#include "caf/test/unit_test.hpp"
#include "caf/all.hpp"
using namespace caf;
CAF_TEST(simple_reply_response) {
actor_system system;
auto s = system.spawn([](event_based_actor* self) -> behavior {
return (
[=](ok_atom x) -> atom_value {
self->quit();
return x;
}
);
});
scoped_actor self{system};
self->send(s, ok_atom::value);
self->receive(
[](ok_atom) {
// nop
}
);
}
......@@ -133,8 +133,8 @@ CAF_TEST(typed_splicing) {
CAF_CHECK_EQUAL(z, (23.0 * 42.0));
}
);
anon_send_exit(x, exit_reason::kill);
anon_send_exit(y, exit_reason::kill);
// x and y go out of scope, leaving only the references
// in x_and_y, which will also go out of scope
}
CAF_TEST_FIXTURE_SCOPE_END()
......@@ -98,7 +98,6 @@ struct fixture {
CAF_CHECK_EQUAL(x, 20);
}
);
anon_send_exit(aut, exit_reason::kill);
}
template <class State>
......
......@@ -131,10 +131,6 @@ struct fixture {
// nop
}
~fixture() {
self->send_exit(foo, exit_reason::kill);
}
actor_system system;
scoped_actor self;
foo_actor foo;
......@@ -146,6 +142,7 @@ CAF_TEST_FIXTURE_SCOPE(typed_spawn_tests, fixture)
CAF_TEST(typed_response_promise) {
typed_response_promise<int> resp;
CAF_MESSAGE("trigger 'invalid response promise' error");
resp.deliver(1); // delivers on an invalid promise has no effect
self->request(foo, infinite, get_atom::value, 42).receive(
[](int x) {
......
......@@ -127,45 +127,6 @@ void client(event_based_actor* self, actor parent, server_type serv) {
);
}
void test_typed_spawn(server_type ts) {
actor_system system;
scoped_actor self{system};
self->send(ts, my_request{1, 2});
self->receive(
[](bool value) {
CAF_CHECK_EQUAL(value, false);
}
);
self->send(ts, my_request{42, 42});
self->receive(
[](bool value) {
CAF_CHECK_EQUAL(value, true);
}
);
self->request(ts, infinite, my_request{10, 20}).receive(
[](bool value) {
CAF_CHECK_EQUAL(value, false);
}
);
self->request(ts, infinite, my_request{0, 0}).receive(
[](bool value) {
CAF_CHECK_EQUAL(value, true);
}
);
self->spawn<monitored>(client, self, ts);
self->receive(
[](passed_atom) {
CAF_MESSAGE("received `passed_atom`");
}
);
self->receive(
[](const down_msg& dmsg) {
CAF_CHECK_EQUAL(dmsg.reason, exit_reason::normal);
}
);
self->send_exit(ts, exit_reason::user_shutdown);
}
/******************************************************************************
* test skipping of messages intentionally + using become() *
******************************************************************************/
......@@ -308,12 +269,6 @@ behavior foo(event_based_actor* self) {
[=](int i, int_actor server) {
self->delegate(server, i);
self->quit();
/*
return self->request(server, i).then([=](int result) -> int {
self->quit(exit_reason::normal);
return result;
});
*/
}
};
}
......@@ -346,11 +301,51 @@ behavior foo2(event_based_actor* self) {
struct fixture {
actor_system system;
scoped_actor self;
fixture() : system(actor_system_config()
.add_message_type<get_state_msg>("get_state_msg")) {
.add_message_type<get_state_msg>("get_state_msg")),
self(system) {
// nop
}
void test_typed_spawn(server_type ts) {
self->send(ts, my_request{1, 2});
self->receive(
[](bool value) {
CAF_CHECK_EQUAL(value, false);
}
);
self->send(ts, my_request{42, 42});
self->receive(
[](bool value) {
CAF_CHECK_EQUAL(value, true);
}
);
self->request(ts, infinite, my_request{10, 20}).receive(
[](bool value) {
CAF_CHECK_EQUAL(value, false);
}
);
self->request(ts, infinite, my_request{0, 0}).receive(
[](bool value) {
CAF_CHECK_EQUAL(value, true);
}
);
CAF_CHECK_EQUAL(system.registry().running(), 2u);
self->spawn<monitored>(client, self, ts);
self->receive(
[](passed_atom) {
CAF_MESSAGE("received `passed_atom`");
}
);
self->receive(
[](const down_msg& dm) {
CAF_CHECK(dm.reason == exit_reason::normal);
}
);
CAF_CHECK_EQUAL(system.registry().running(), 2u);
}
};
} // namespace <anonymous>
......@@ -364,23 +359,20 @@ CAF_TEST_FIXTURE_SCOPE(typed_spawn_tests, fixture)
CAF_TEST(typed_spawns) {
// run test series with typed_server(1|2)
test_typed_spawn(system.spawn(typed_server1));
system.await_all_actors_done();
self->await_all_other_actors_done();
CAF_MESSAGE("finished test series with `typed_server1`");
test_typed_spawn(system.spawn(typed_server2));
system.await_all_actors_done();
self->await_all_other_actors_done();
CAF_MESSAGE("finished test series with `typed_server2`");
scoped_actor self{system};
test_typed_spawn(self->spawn<typed_server3>("hi there", self));
self->receive(
[](const string& str) {
CAF_REQUIRE(str == "hi there");
CAF_REQUIRE_EQUAL(str, "hi there");
}
);
}
CAF_TEST(event_testee_series) {
// run test series with event_testee
scoped_actor self{system};
auto et = self->spawn<event_testee>();
string result;
self->send(et, 1);
......@@ -411,15 +403,11 @@ CAF_TEST(event_testee_series) {
throw runtime_error("event_testee does not reply");
}
);
self->send_exit(et, exit_reason::user_shutdown);
self->await_all_other_actors_done();
CAF_CHECK_EQUAL(result, "wait4int");
}
CAF_TEST(string_delegator_chain) {
// run test series with string reverter
scoped_actor self{system};
// actor-under-test
auto aut = self->spawn<monitored>(string_delegator,
system.spawn(string_reverter),
true);
......@@ -430,7 +418,6 @@ CAF_TEST(string_delegator_chain) {
CAF_CHECK_EQUAL(answer, "!dlroW olleH");
}
);
anon_send_exit(aut, exit_reason::user_shutdown);
}
CAF_TEST(maybe_string_delegator_chain) {
......@@ -453,12 +440,8 @@ CAF_TEST(maybe_string_delegator_chain) {
self->request(aut, infinite, "abcd").receive(
[](ok_atom, const string& str) {
CAF_CHECK_EQUAL(str, "dcba");
},
[](const error&) {
throw std::logic_error("unexpected error!");
}
);
anon_send_exit(aut, exit_reason::user_shutdown);
}
CAF_TEST(sending_typed_actors) {
......@@ -470,7 +453,6 @@ CAF_TEST(sending_typed_actors) {
CAF_CHECK_EQUAL(i, 100);
}
);
self->send_exit(aut, exit_reason::user_shutdown);
}
CAF_TEST(sending_typed_actors_and_down_msg) {
......@@ -503,7 +485,6 @@ CAF_TEST(check_signature) {
}
};
};
scoped_actor self{system};
self->spawn<monitored>(bar_action);
self->receive(
[](const down_msg& dm) {
......
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