16 #include "tensorflow_serving/util/retrier.h"
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
20 #include "absl/status/status.h"
21 #include "xla/tsl/lib/core/status_test_util.h"
22 #include "tensorflow/core/lib/core/errors.h"
23 #include "tensorflow/core/lib/core/status.h"
24 #include "tensorflow/core/platform/errors.h"
26 namespace tensorflow {
30 using ::testing::HasSubstr;
32 TEST(RetrierTest, RetryFinallySucceeds) {
34 auto retried_fn = [&]() {
36 if (call_count == 7) {
37 return absl::OkStatus();
39 return errors::Unknown(
"Error");
42 TF_EXPECT_OK(Retry(
"RetryFinallySucceeds", 10 ,
44 EXPECT_EQ(7, call_count);
47 TEST(RetrierTest, RetryFinallyFails) {
49 auto retried_fn = [&]() {
51 return errors::Unknown(
"Error");
54 const auto status = Retry(
"RetryFinallyFails", 10 ,
56 EXPECT_THAT(status.message(), HasSubstr(
"Error"));
57 EXPECT_EQ(11, call_count);
60 TEST(RetrierTest, RetryCancelled) {
62 auto retried_fn = [&]() {
64 return errors::Unknown(
"Error");
66 const auto status = Retry(
67 "RetryCancelled", 10 , 0 ,
68 retried_fn, [](absl::Status status) {
return false; } );
69 EXPECT_THAT(status.message(), HasSubstr(
"Error"));
70 EXPECT_EQ(1, call_count);
73 TEST(RetrierTest, RetryCancelledOnUnimplementedError) {
75 auto retried_fn = [&]() {
77 if (call_count == 5) {
78 return errors::Unimplemented(
"Unimplemented");
80 return errors::DeadlineExceeded(
"DeadlineExceeded");
84 Retry(
"RetryCancelledOnUnimplementedError", 10 ,
85 0 , retried_fn, [](absl::Status status) {
86 return status.code() != absl::StatusCode::kUnimplemented;
88 EXPECT_EQ(5, call_count);
89 EXPECT_THAT(status.message(), HasSubstr(
"Unimplemented"));