#include #include "framework/manager.h" #include "framework/service.h" #include "framework/dag.h" #include "framework/dag_view.h" #include "test_tool.h" #include "test_op.h" #include "test_message_op.h" namespace baidu { namespace paddle_serving { namespace unittest { using baidu::paddle_serving::predictor::Manager; using baidu::paddle_serving::predictor::InferService; using baidu::paddle_serving::predictor::ParallelInferService; using baidu::paddle_serving::predictor::FLAGS_use_parallel_infer_service; using baidu::paddle_serving::predictor::InferServiceManager; using baidu::paddle_serving::predictor::Bus; using baidu::paddle_serving::predictor::Dag; using baidu::paddle_serving::predictor::Channel; using baidu::paddle_serving::predictor::Dag; using baidu::paddle_serving::predictor::DagView; using baidu::paddle_serving::predictor::ViewStage; using baidu::paddle_serving::predictor::ViewNode; using pds::ut::OpMessageData; TEST_F(TestOP, test_init) { Bus* bus = new Bus(); ASSERT_NE(bus, NULL); Dag* dag = NULL; ABOP op; std::string op_name = "TestOp"; std::string op_type = "TestOp"; EXPECT_EQ(0, op.init(bus, dag, (uint32_t)999, op_name, op_type, NULL)); EXPECT_FALSE(op.has_calc()); EXPECT_EQ(999, op.id()); EXPECT_STREQ("TestOp", op.name()); EXPECT_STREQ("{\"a\": 3, \"b\": 4}", op.debug_string().c_str()); EXPECT_NE(op._timer, NULL); EXPECT_EQ(bus, op._bus); AB* ab = op.mutable_data(); EXPECT_EQ(3, ab->a); EXPECT_FLOAT_EQ(4.0, ab->b); Channel* chn = op.mutable_channel(); EXPECT_EQ(chn->id(), 999); EXPECT_STREQ(chn->op().c_str(), "TestOp"); EXPECT_EQ(ab, chn->param()); EXPECT_EQ(NULL, chn->message()); EXPECT_EQ(0, bus->size()); Channel* chn2 = bus->channel_by_name("TestOp"); EXPECT_EQ(NULL, chn2); } TEST_F(TestOP, test_depend_argment) { Bus bus; Dag dag; AutoTempFile file( "[@Node]\n\ name: node1\n\ type: ABOP\n\ [@Node]\n\ name: node2\n\ type: ABOP\n\ [.@Depend]\n\ name: node1\n\ mode: RO\n\ [@Node]\n\ name: node3\n\ type: ABOP\n\ [.@Depend]\n\ name: node1\n\ mode: RO\n\ [@Node]\n\ name: node4\n\ type: ABOP\n\ [.@Depend]\n\ name: node2\n\ mode: RW\n\ [.@Depend]\n\ name: node3\n\ mode: RO"); std::string dag_name = "DagTest"; EXPECT_EQ(0, dag.init("./", file.name(), dag_name)); ABOP op; std::string op_name = "node4"; std::string op_type = "ABOP"; EXPECT_EQ(0, op.init(&bus, &dag, (uint32_t)888, op_name, op_type, NULL)); EXPECT_FALSE(op.is_readable("node1")); EXPECT_FALSE(op.is_mutable("node1")); EXPECT_TRUE(op.is_readable("node2")); EXPECT_TRUE(op.is_mutable("node2")); EXPECT_TRUE(op.is_readable("node3")); EXPECT_FALSE(op.is_mutable("node3")); // process() is not called, channel has not been // committed to bus yet! EXPECT_TRUE(NULL == op.get_depend_channel("node1")); EXPECT_TRUE(NULL == op.get_depend_channel("node2")); EXPECT_TRUE(NULL == op.get_depend_channel("node3")); EXPECT_TRUE(NULL == op.mutable_depend_channel("node1")); EXPECT_TRUE(NULL == op.mutable_depend_channel("node2")); EXPECT_TRUE(NULL == op.mutable_depend_channel("node3")); } TEST_F(TestOP, test_inference) { Bus bus; Dag dag; AutoTempFile file( "[@Node]\n\ name: node1\n\ type: ABOP\n\ [@Node]\n\ name: node2\n\ type: ABOP\n\ [.@Depend]\n\ name: node1\n\ mode: RO\n\ [@Node]\n\ name: node3\n\ type: ABOP\n\ [.@Depend]\n\ name: node1\n\ mode: RO\n\ [@Node]\n\ name: node4\n\ type: ABOP\n\ [.@Depend]\n\ name: node2\n\ mode: RW\n\ [.@Depend]\n\ name: node3\n\ mode: RO"); std::string dag_name = "DagTest"; EXPECT_EQ(0, dag.init("./", file.name(), dag_name)); ABOP op1; std::string op1_name = "node1"; std::string op_type = "ABOP"; EXPECT_EQ(0, op1.init(&bus, &dag, (uint32_t)888, op1_name, op_type, NULL)); ABOP op2; std::string op2_name = "node2"; EXPECT_EQ(0, op2.init(&bus, &dag, (uint32_t)888, op2_name, op_type, NULL)); MsgOP op3; std::string op3_name = "node3"; EXPECT_EQ(0, op3.init(&bus, &dag, (uint32_t)888, op3_name, op_type, NULL)); ABOP op4; std::string op4_name = "node4"; EXPECT_EQ(0, op4.init(&bus, &dag, (uint32_t)888, op4_name, op_type, NULL)); EXPECT_TRUE(op2.is_readable("node1")); EXPECT_FALSE(op2.is_mutable("node1")); EXPECT_FALSE(op2.is_readable("node3")); EXPECT_FALSE(op2.is_mutable("node3")); EXPECT_FALSE(op2.is_readable("node4")); EXPECT_FALSE(op2.is_mutable("node4")); EXPECT_TRUE(op3.is_readable("node1")); EXPECT_FALSE(op3.is_mutable("node1")); EXPECT_FALSE(op3.is_readable("node2")); EXPECT_FALSE(op3.is_mutable("node2")); EXPECT_FALSE(op3.is_readable("node4")); EXPECT_FALSE(op3.is_mutable("node4")); EXPECT_FALSE(op4.is_readable("node1")); EXPECT_FALSE(op4.is_mutable("node1")); EXPECT_TRUE(op4.is_readable("node2")); EXPECT_TRUE(op4.is_mutable("node2")); EXPECT_TRUE(op4.is_readable("node3")); EXPECT_FALSE(op4.is_mutable("node3")); EXPECT_EQ(0, op1.process(false)); EXPECT_EQ(0, op2.process(false)); EXPECT_EQ(0, op3.process(false)); EXPECT_EQ(0, op4.process(true)); EXPECT_TRUE(NULL == op4.get_depend_channel("node1")); EXPECT_FALSE(NULL == op4.get_depend_channel("node2")); EXPECT_FALSE(NULL == op4.get_depend_channel("node3")); EXPECT_TRUE(NULL == op4.mutable_depend_channel("node1")); EXPECT_FALSE(NULL == op4.mutable_depend_channel("node2")); EXPECT_TRUE(NULL == op4.mutable_depend_channel("node3")); const AB* dop1 = op4.get_depend_argument("node1"); const AB* dop21 = op4.get_depend_argument("node2"); const google::protobuf::Message* dop22 = op4.get_depend_channel("node2")->message(); const google::protobuf::Message* dop23 = op4.get_depend_argument("node2"); const OpMessageData* dop31 = op4.get_depend_argument("node3"); const google::protobuf::Message* dop32 = op4.get_depend_channel("node3")->message(); const google::protobuf::Message* dop33 = op4.get_depend_argument("node3"); EXPECT_EQ(NULL, dop1); EXPECT_NE(NULL, dop21); EXPECT_EQ(NULL, dop22); EXPECT_EQ(NULL, dop23); EXPECT_NE(NULL, dop31); EXPECT_NE(NULL, dop32); EXPECT_EQ(NULL, dop33); EXPECT_EQ(dop31, dop32); const OpMessageData* dop322 = dynamic_cast(dop32); EXPECT_EQ(1, dop21->a); EXPECT_FLOAT_EQ(2.2, dop21->b); EXPECT_EQ(11, dop31->a()); EXPECT_FLOAT_EQ(22.2, dop31->b()); EXPECT_EQ(11, dop322->a()); EXPECT_FLOAT_EQ(22.2, dop322->b()); } TEST_F(TestOP, test_op_with_channel_and_conf) { Dag dag; std::string op_name = "test_op"; std::string name_in_conf = "test_name_in_conf"; base::TempFile dag_conf; dag_conf.save_format( "[@Node]\n" "name: %s\n" "type: OpWithConf\n" "name_in_conf: %s\n", op_name.c_str(), name_in_conf.c_str()); std::string dag_name = "DagTest"; ASSERT_EQ(0, dag.init("./", dag_conf.fname(), dag_name)); DagView view; view.init(&dag, "service_name"); ASSERT_EQ(0, view.execute(NULL)); const std::vector& view_stage_vec = view._view; uint32_t stage_size = view_stage_vec.size(); for (uint32_t si = 0; si < stage_size; si++) { ViewStage* vstage = view_stage_vec[si]; uint32_t node_size = vstage->nodes.size(); for (uint32_t ni = 0; ni < node_size; ni++) { ViewNode* vnode = vstage->nodes[ni]; OpWithConf* op = dynamic_cast(vnode->op); ASSERT_NE(NULL, op); EXPECT_STREQ(op->name(), op_name.c_str()); EXPECT_STREQ( op->get_self_config()->name_in_conf.c_str(), name_in_conf.c_str()); EXPECT_STREQ( op->mutable_data()->name_for_output.c_str(), name_in_conf.c_str()); } } } } } }