16 #include "tensorflow_serving/util/unique_ptr_with_deps.h"
22 #include <gtest/gtest.h>
24 namespace tensorflow {
30 struct MakeUniqueResult {
31 using scalar = std::unique_ptr<T>;
37 template <
typename T,
typename... Args>
38 typename MakeUniqueResult<T>::scalar MakeUnique(Args&&... args) {
39 return std::unique_ptr<T>(
40 new T(std::forward<Args>(args)...));
45 Dep(
const string& name, std::vector<string>* log) : name_(name), log_(log) {}
46 ~Dep() { log_->push_back(
"Deleting " + name_); }
47 void f() { log_->push_back(name_ +
".f() called"); }
51 std::vector<string>* log_;
58 Obj(
const string& name, std::vector<string>* log) : name_(name), log_(log) {}
59 ~Obj() { log_->push_back(
"Deleting " + name_); }
60 void f()
const { log_->push_back(
"Obj::f() called on " + name_); }
64 std::vector<string>* log_;
67 UniquePtrWithDeps<Obj> BuildObjWithDeps(std::vector<string>* log) {
68 UniquePtrWithDeps<Obj> obj;
69 auto dep1 = obj.AddDependency(MakeUnique<Dep>(
"dep1", log));
70 auto dep2 = obj.AddDependency(MakeUnique<Dep>(
"dep2", log));
71 auto dep3 = obj.AddDependency(MakeUnique<Dep>(
"dep3", log));
75 obj.SetOwned(MakeUnique<Obj>(
"obj", log));
79 TEST(UniquePtrWithDepsTest, DependenciesDestroyedAfterMainObject) {
80 std::vector<string> log;
82 auto obj = BuildObjWithDeps(&log);
85 EXPECT_EQ(std::vector<string>({
"dep1.f() called",
88 "Obj::f() called on obj",
96 UniquePtrWithDeps<Obj> BuildObjWithDepAddedLater(std::vector<string>* log) {
97 UniquePtrWithDeps<Obj> obj;
98 obj.SetOwned(MakeUnique<Obj>(
"obj", log));
99 auto dep = obj.AddDependency(MakeUnique<Dep>(
"dep", log));
104 TEST(UniquePtrWithDepsTest, DependencyAddedAfterSetOwned) {
105 std::vector<string> log;
107 auto obj = BuildObjWithDepAddedLater(&log);
110 EXPECT_EQ(std::vector<string>({
"dep.f() called",
111 "Obj::f() called on obj",
117 UniquePtrWithDeps<Obj> BuildObjWithDepsMultipleSetOwned(
118 std::vector<string>* log) {
119 UniquePtrWithDeps<Obj> obj;
120 auto dep1 = obj.AddDependency(MakeUnique<Dep>(
"dep1", log));
121 obj.SetOwned(MakeUnique<Obj>(
"obj1", log));
122 auto dep2 = obj.AddDependency(MakeUnique<Dep>(
"dep2", log));
123 auto dep3 = obj.AddDependency(MakeUnique<Dep>(
"dep3", log));
127 obj.SetOwned(MakeUnique<Obj>(
"obj2", log));
131 TEST(UniquePtrWithDepsTest, MultipleSetOwnedCalls) {
132 std::vector<string> log;
134 auto obj = BuildObjWithDepsMultipleSetOwned(&log);
137 EXPECT_EQ(std::vector<string>({
"dep1.f() called",
140 "Obj::f() called on obj2",