16 #include "tensorflow_serving/util/observer.h"
21 #include <gtest/gtest.h>
22 #include "tensorflow/core/kernels/batching_util/periodic_function.h"
23 #include "tensorflow/core/platform/env.h"
25 namespace tensorflow {
29 TEST(ObserverTest, Call) {
31 Observer<> observer([&]() { num_calls++; });
32 observer.Notifier()();
33 EXPECT_EQ(1, num_calls);
36 TEST(ObserverTest, CallWithArg) {
37 Observer<int> observer([&](
int arg) { EXPECT_EQ(1337, arg); });
38 observer.Notifier()(1337);
41 TEST(ObserverTest, Orphan) {
43 std::function<void()> notifier;
45 Observer<> observer([&]() { num_calls++; });
46 notifier = observer.Notifier();
47 EXPECT_EQ(0, num_calls);
49 EXPECT_EQ(1, num_calls);
52 EXPECT_EQ(1, num_calls);
55 TEST(ObserverTest, ObserverList) {
57 Observer<> observer([&]() { num_calls++; });
58 ObserverList<> observers;
59 for (
int i = 0; i < 10; ++i) {
60 observers.Add(observer);
63 EXPECT_EQ(10, num_calls);
66 TEST(ObserverTest, ObserverListWithOrphans) {
68 ObserverList<> observers;
69 for (
int i = 0; i < 10; ++i) {
70 Observer<> observer([&]() { num_calls++; });
71 observers.Add(observer);
76 EXPECT_EQ(0, num_calls);
79 TEST(ObserverTest, Threaded) {
83 std::unique_ptr<Observer<>>(
new Observer<>([&mu, &num_calls]() {
87 auto notifier = observer->Notifier();
90 PeriodicFunction thread(notifier, 1000 );
94 if (num_calls >= 10) {
98 Env::Default()->SleepForMicroseconds(1000 );
103 int num_calls_snapshot;
106 num_calls_snapshot = num_calls;
108 Env::Default()->SleepForMicroseconds(100 * 1000 );
111 EXPECT_EQ(num_calls_snapshot, num_calls);