diff options
Diffstat (limited to 'test/actor/actor_ref.test.cpp')
-rw-r--r-- | test/actor/actor_ref.test.cpp | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/test/actor/actor_ref.test.cpp b/test/actor/actor_ref.test.cpp index 78721c965e..20aa1c35c1 100644 --- a/test/actor/actor_ref.test.cpp +++ b/test/actor/actor_ref.test.cpp @@ -3,12 +3,9 @@ #include <mbgl/test/util.hpp> -#include <chrono> -#include <functional> #include <future> using namespace mbgl; -using namespace std::chrono_literals; TEST(ActorRef, CanOutliveActor) { // An ActorRef can outlive its actor. Doing does not extend the actor's lifetime. @@ -40,3 +37,80 @@ TEST(ActorRef, CanOutliveActor) { EXPECT_TRUE(died); test.invoke(&Test::receive); } + +TEST(ActorRef, Ask) { + // Ask returns a Future eventually returning the result + + struct Test { + + Test(ActorRef<Test>) {} + + int gimme() { + return 20; + } + + int echo(int i) { + return i; + } + }; + + ThreadPool pool { 1 }; + Actor<Test> actor(pool); + ActorRef<Test> ref = actor.self(); + + EXPECT_EQ(20, ref.ask(&Test::gimme).get()); + EXPECT_EQ(30, ref.ask(&Test::echo, 30).get()); +} + +TEST(ActorRef, AskVoid) { + // Ask waits for void methods + + struct Test { + bool& executed; + + Test(bool& executed_) : executed(executed_) { + } + + void doIt() { + executed = true; + } + }; + + ThreadPool pool { 1 }; + bool executed = false; + Actor<Test> actor(pool, executed); + ActorRef<Test> ref = actor.self(); + + ref.ask(&Test::doIt).get(); + EXPECT_TRUE(executed); +} + +TEST(ActorRef, AskOnDestroyedActor) { + // Tests behavior when calling ask() after the + // Actor has gone away. Should set a exception_ptr. + + struct Test { + bool& died; + + Test(ActorRef<Test>, bool& died_) : died(died_) {} + + ~Test() { + died = true; + } + + int receive() { + return 1; + } + }; + bool died = false; + + ThreadPool pool { 1 }; + auto actor = std::make_unique<Actor<Test>>(pool, died); + ActorRef<Test> ref = actor->self(); + + actor.reset(); + EXPECT_TRUE(died); + + auto result = ref.ask(&Test::receive); + EXPECT_ANY_THROW(result.get()); +} |