blob: 9c1499bf579a4818e4ba612abdcd6fad2ca9a7d8 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
#include <memory>
#include <lib/callback/set_when_called.h>
#include "gtest/gtest.h"
#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
namespace coroutine {
namespace {
TEST(CoroutineManager, CallbackIsCalled) {
CoroutineServiceImpl coroutine_service;
CoroutineManager manager(&coroutine_service);
bool called = false;
CoroutineHandler* handler = nullptr;
manager.StartCoroutine(callback::SetWhenCalled(&called),
[&handler](CoroutineHandler* current_handler,
fit::function<void()> callback) {
handler = current_handler;
EXPECT_EQ(ContinuationStatus::OK, handler->Yield());
callback();
});
ASSERT_TRUE(handler);
EXPECT_FALSE(called);
handler->Resume(ContinuationStatus::OK);
EXPECT_TRUE(called);
}
TEST(CoroutineManager, InterruptCoroutineOnDestruction) {
CoroutineServiceImpl coroutine_service;
std::unique_ptr<CoroutineManager> manager =
std::make_unique<CoroutineManager>(&coroutine_service);
bool called = false;
CoroutineHandler* handler = nullptr;
manager->StartCoroutine(callback::SetWhenCalled(&called),
[&handler](CoroutineHandler* current_handler,
fit::function<void()> callback) {
handler = current_handler;
EXPECT_EQ(ContinuationStatus::INTERRUPTED,
handler->Yield());
callback();
});
ASSERT_TRUE(handler);
EXPECT_FALSE(called);
manager.reset();
EXPECT_TRUE(called);
}
TEST(CoroutineManager, NoCallback) {
CoroutineServiceImpl coroutine_service;
CoroutineManager manager(&coroutine_service);
CoroutineHandler* handler = nullptr;
manager.StartCoroutine([&handler](CoroutineHandler* current_handler) {
handler = current_handler;
EXPECT_EQ(ContinuationStatus::OK, handler->Yield());
});
ASSERT_TRUE(handler);
handler->Resume(ContinuationStatus::OK);
}
} // namespace
} // namespace coroutine