try_seq_test.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Copyright 2021 gRPC authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "src/core/lib/promise/try_seq.h"
  15. #include <gtest/gtest.h>
  16. namespace grpc_core {
  17. TEST(TrySeqTest, SucceedAndThen) {
  18. EXPECT_EQ(TrySeq([] { return absl::StatusOr<int>(1); },
  19. [](int i) {
  20. return [i]() { return absl::StatusOr<int>(i + 1); };
  21. })(),
  22. Poll<absl::StatusOr<int>>(absl::StatusOr<int>(2)));
  23. }
  24. TEST(TrySeqTest, SucceedDirectlyAndThenDirectly) {
  25. EXPECT_EQ(
  26. TrySeq([] { return 1; }, [](int i) { return [i]() { return i + 1; }; })(),
  27. Poll<absl::StatusOr<int>>(absl::StatusOr<int>(2)));
  28. }
  29. TEST(TrySeqTest, SucceedAndThenChangeType) {
  30. EXPECT_EQ(
  31. TrySeq([] { return absl::StatusOr<int>(42); },
  32. [](int i) {
  33. return [i]() {
  34. return absl::StatusOr<std::string>(std::to_string(i));
  35. };
  36. })(),
  37. Poll<absl::StatusOr<std::string>>(absl::StatusOr<std::string>("42")));
  38. }
  39. TEST(TrySeqTest, FailAndThen) {
  40. EXPECT_EQ(TrySeq([]() { return absl::StatusOr<int>(absl::CancelledError()); },
  41. [](int) {
  42. return []() -> Poll<absl::StatusOr<double>> { abort(); };
  43. })(),
  44. Poll<absl::StatusOr<double>>(
  45. absl::StatusOr<double>(absl::CancelledError())));
  46. }
  47. TEST(TrySeqTest, RawSucceedAndThen) {
  48. EXPECT_EQ(TrySeq([] { return absl::OkStatus(); },
  49. [] { return []() { return absl::OkStatus(); }; })(),
  50. Poll<absl::Status>(absl::OkStatus()));
  51. }
  52. TEST(TrySeqTest, RawFailAndThen) {
  53. EXPECT_EQ(TrySeq([] { return absl::CancelledError(); },
  54. []() { return []() -> Poll<absl::Status> { abort(); }; })(),
  55. Poll<absl::Status>(absl::CancelledError()));
  56. }
  57. TEST(TrySeqTest, RawSucceedAndThenValue) {
  58. EXPECT_EQ(TrySeq([] { return absl::OkStatus(); },
  59. [] { return []() { return absl::StatusOr<int>(42); }; })(),
  60. Poll<absl::StatusOr<int>>(absl::StatusOr<int>(42)));
  61. }
  62. TEST(TrySeqIterTest, Ok) {
  63. std::vector<int> v{1, 2, 3, 4, 5};
  64. EXPECT_EQ(TrySeqIter(v.begin(), v.end(), 0,
  65. [](int elem, int accum) {
  66. return [elem, accum]() -> absl::StatusOr<int> {
  67. return elem + accum;
  68. };
  69. })(),
  70. Poll<absl::StatusOr<int>>(15));
  71. }
  72. TEST(TrySeqIterTest, ErrorAt3) {
  73. std::vector<int> v{1, 2, 3, 4, 5};
  74. EXPECT_EQ(TrySeqIter(v.begin(), v.end(), 0,
  75. [](int elem, int accum) {
  76. return [elem, accum]() -> absl::StatusOr<int> {
  77. if (elem < 3) {
  78. return elem + accum;
  79. }
  80. if (elem == 3) {
  81. return absl::CancelledError();
  82. }
  83. abort(); // unreachable
  84. };
  85. })(),
  86. Poll<absl::StatusOr<int>>(absl::CancelledError()));
  87. }
  88. } // namespace grpc_core
  89. int main(int argc, char** argv) {
  90. ::testing::InitGoogleTest(&argc, argv);
  91. return RUN_ALL_TESTS();
  92. }