16 #include "tensorflow_serving/util/fast_read_dynamic_ptr.h"
22 #include <gtest/gtest.h>
23 #include "tensorflow/core/platform/env.h"
25 namespace tensorflow {
30 class FastReadDynamicPtrTest :
public ::testing::Test {};
32 using FastReadDynamicPtrTypes = ::testing::Types<
33 FastReadDynamicPtr<int>,
34 FastReadDynamicPtr<int, internal_read_ptr_holder::ShardedReadPtrs<int>>,
35 FastReadDynamicPtr<int, internal_read_ptr_holder::SingleReadPtr<int>>>;
37 TYPED_TEST_SUITE(FastReadDynamicPtrTest, FastReadDynamicPtrTypes);
39 TYPED_TEST(FastReadDynamicPtrTest, SingleThreaded) {
40 TypeParam fast_read_int;
44 std::shared_ptr<const int> pointer = fast_read_int.get();
45 EXPECT_EQ(pointer,
nullptr);
49 std::unique_ptr<int> i(
new int(1));
50 fast_read_int.Update(std::move(i));
51 EXPECT_EQ(
nullptr, i);
54 std::shared_ptr<const int> pointer = fast_read_int.get();
55 EXPECT_EQ(*pointer, 1);
59 TYPED_TEST(FastReadDynamicPtrTest, MultiThreaded) {
60 const int kNumThreads = 4;
62 TypeParam fast_read_int;
65 std::unique_ptr<int> tmp(
new int(0));
66 EXPECT_EQ(
nullptr, fast_read_int.Update(std::move(tmp)));
69 std::vector<std::unique_ptr<Thread>> threads;
70 for (
int thread_index = 0; thread_index < kNumThreads; ++thread_index) {
72 threads.emplace_back(Env::Default()->StartThread(
73 {},
"Increment", [thread_index, &fast_read_int]() {
74 const int kMaxValue = 1000;
80 std::shared_ptr<const int> pointer = fast_read_int.get();
84 EXPECT_GE(value, last_value);
85 if (value == kMaxValue) {
88 if (value % kNumThreads == thread_index) {
89 std::unique_ptr<int> tmp(
new int(value + 1));
90 fast_read_int.Update(std::move(tmp));
97 TYPED_TEST(FastReadDynamicPtrTest, WaitsForReadPtrsBeforeDestruction) {
98 const int expected = 12;
99 std::unique_ptr<TypeParam> fast_read_int(
new TypeParam);
100 fast_read_int->Update(std::unique_ptr<int>(
new int(expected)));
102 std::unique_ptr<Thread> thread(Env::Default()->StartThread({},
"Holder", [&] {
103 auto p = fast_read_int->get();
104 ASSERT_NE(p,
nullptr);
105 EXPECT_EQ(expected, *p);
111 Env::Default()->SleepForMicroseconds(1e7);
112 EXPECT_EQ(expected, *p);
114 got.WaitForNotification();
116 fast_read_int =
nullptr;