123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #include <gtest/gtest.h>
- #include <memory>
- #include <utility>
- #include <vector>
- #include "cnis/infer_server.h"
- #include "core/engine.h"
- #include "core/request_ctrl.h"
- #include "test_base.h"
- namespace infer_server {
- namespace {
- auto empty_response_func = [](Status, PackagePtr) {};
- auto empty_notifier_func = [](const RequestControl*) {};
- std::vector<std::shared_ptr<Processor>> PrepareProcessors(int device_id) {
- std::vector<std::shared_ptr<Processor>> processors;
- for (size_t idx = 0; idx < 3; ++idx) {
- processors.emplace_back(TestProcessor::Create());
- processors[idx]->Init();
- }
- return processors;
- }
- TEST(InferServerCore, EngineIdle) {
- int device_id = 0;
- auto processors = PrepareProcessors(device_id);
- ASSERT_EQ(processors.size(), 3u);
-
- {
- PriorityThreadPool tp([device_id]() -> bool { return SetCurrentDevice(device_id); });
- std::unique_ptr<Engine> engine(new Engine(processors, [](Engine* idle) {}, &tp));
- ASSERT_TRUE(engine);
- EXPECT_NE(engine->Fork().get(), engine.get());
- std::unique_ptr<RequestControl> ctrl(
- new RequestControl(empty_response_func, empty_notifier_func, "", 0, 3));
- ASSERT_TRUE(ctrl);
-
- size_t idx = 0;
- for (; idx < 2; ++idx) {
- auto input = Package::Create(1);
- input->data[0]->ctrl = ctrl.get();
- input->data[0]->index = idx;
- ASSERT_NO_THROW(engine->Run(std::move(input)));
- }
-
- ASSERT_TRUE(engine->IsIdle());
- auto input = Package::Create(1);
- input->data[0]->ctrl = ctrl.get();
- input->data[0]->index = idx;
- ASSERT_NO_THROW(engine->Run(std::move(input)));
-
- ASSERT_FALSE(engine->IsIdle());
-
- tp.Resize(3);
- while (!ctrl->IsProcessFinished()) {}
- }
- }
- TEST(InferServerCore, EngineProcess) {
- int device_id = 0;
- auto processors = PrepareProcessors(device_id);
- ASSERT_EQ(processors.size(), 3u);
- {
- PriorityThreadPool tp([device_id]() -> bool { return SetCurrentDevice(device_id); }, 3);
- std::promise<void> done_flag;
- std::unique_ptr<Engine> engine(new Engine(processors, [&done_flag](Engine* idle) { done_flag.set_value(); }, &tp));
- ASSERT_TRUE(engine);
- std::unique_ptr<RequestControl> ctrl(
- new RequestControl(empty_response_func, empty_notifier_func, "", 1, 1));
- ASSERT_TRUE(ctrl);
- auto input = Package::Create(1);
- input->data[0]->ctrl = ctrl.get();
- input->data[0]->index = 0;
- ASSERT_NO_THROW(engine->Run(std::move(input)));
- auto done_ret = done_flag.get_future().wait_for(std::chrono::seconds(1));
- ASSERT_EQ(std::future_status::ready, done_ret);
- }
- }
- }
- }
|