aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/test/firebase/firestore/util
diff options
context:
space:
mode:
authorGravatar Konstantin Varlamov <var-const@users.noreply.github.com>2018-07-10 17:45:16 -0400
committerGravatar GitHub <noreply@github.com>2018-07-10 17:45:16 -0400
commit6466c35737eff21e9b48c3ce2353d42628f4bb77 (patch)
tree812f47917bbe834a9e0b490c11265930da1639c8 /Firestore/core/test/firebase/firestore/util
parent0f0a1dab2d385895fc15968cfee3df07b53c52b9 (diff)
C++ migration: add a C++ implementation of `FSTExponentialBackoff` (#1465)
This is a pretty close port of `FSTExponentialBackoff`. The changes are pretty minor: * delay is calculated using <chrono> duration types, not plain numbers, which should be a little more type-safe; * split a piece of code into a ClampDelay function, because it's reasonably close to std::clamp; * rephrased the class-level comment to make it clearer that the first attempt always has delay = 0; * added simple tests (other platforms don't have tests for this). Also make sure that canceling a DelayedOperation is always valid.
Diffstat (limited to 'Firestore/core/test/firebase/firestore/util')
-rw-r--r--Firestore/core/test/firebase/firestore/util/executor_test.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/Firestore/core/test/firebase/firestore/util/executor_test.cc b/Firestore/core/test/firebase/firestore/util/executor_test.cc
index 99bddce..e983bfe 100644
--- a/Firestore/core/test/firebase/firestore/util/executor_test.cc
+++ b/Firestore/core/test/firebase/firestore/util/executor_test.cc
@@ -115,6 +115,30 @@ TEST_P(ExecutorTest, DelayedOperationIsValidAfterTheOperationHasRun) {
EXPECT_NO_THROW(delayed_operation.Cancel());
}
+TEST_P(ExecutorTest, CancelingEmptyDelayedOperationIsValid) {
+ DelayedOperation delayed_operation;
+ EXPECT_NO_THROW(delayed_operation.Cancel());
+}
+
+TEST_P(ExecutorTest, DoubleCancelingDelayedOperationIsValid) {
+ std::string steps;
+
+ executor->Execute([&] {
+ DelayedOperation delayed_operation = Schedule(
+ executor.get(), Executor::Milliseconds(1), [&steps] { steps += '1'; });
+ Schedule(executor.get(), Executor::Milliseconds(5), [&] {
+ steps += '2';
+ signal_finished();
+ });
+
+ delayed_operation.Cancel();
+ delayed_operation.Cancel();
+ });
+
+ EXPECT_TRUE(WaitForTestToFinish());
+ EXPECT_EQ(steps, "2");
+}
+
TEST_P(ExecutorTest, IsCurrentExecutor) {
EXPECT_FALSE(executor->IsCurrentExecutor());
EXPECT_NE(executor->Name(), executor->CurrentExecutorName());