| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "peridot/bin/ledger/sync_helper/sync_helper.h" |
| |
| #include "garnet/public/lib/callback/set_when_called.h" |
| #include "gtest/gtest.h" |
| |
| namespace ledger { |
| namespace { |
| |
| TEST(SyncHelper, NoOperation) { |
| SyncHelper sync_helper; |
| bool called = false; |
| sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called)); |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, OneOperation) { |
| SyncHelper sync_helper; |
| auto operation = sync_helper.WrapOperation([] {}); |
| bool called = false; |
| sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called)); |
| EXPECT_FALSE(called); |
| operation(); |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, TwoSyncCallbacks) { |
| SyncHelper sync_helper; |
| auto operation = sync_helper.WrapOperation([] {}); |
| bool called1 = false; |
| bool called2 = false; |
| sync_helper.RegisterSynchronizationCallback( |
| callback::SetWhenCalled(&called1)); |
| sync_helper.RegisterSynchronizationCallback( |
| callback::SetWhenCalled(&called2)); |
| EXPECT_FALSE(called1); |
| EXPECT_FALSE(called2); |
| operation(); |
| EXPECT_TRUE(called1); |
| EXPECT_TRUE(called2); |
| } |
| |
| TEST(SyncHelper, TwoOperation) { |
| SyncHelper sync_helper; |
| auto operation1 = sync_helper.WrapOperation([] {}); |
| auto operation2 = sync_helper.WrapOperation([] {}); |
| bool called = false; |
| sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called)); |
| |
| EXPECT_FALSE(called); |
| operation1(); |
| EXPECT_FALSE(called); |
| operation2(); |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, TwoOperationReversed) { |
| SyncHelper sync_helper; |
| auto operation1 = sync_helper.WrapOperation([] {}); |
| auto operation2 = sync_helper.WrapOperation([] {}); |
| bool called = false; |
| sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called)); |
| |
| EXPECT_FALSE(called); |
| operation2(); |
| EXPECT_FALSE(called); |
| operation1(); |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, TwoOperationTwoCallbacks) { |
| SyncHelper sync_helper; |
| auto operation1 = sync_helper.WrapOperation([] {}); |
| bool called1 = false; |
| sync_helper.RegisterSynchronizationCallback( |
| callback::SetWhenCalled(&called1)); |
| auto operation2 = sync_helper.WrapOperation([] {}); |
| bool called2 = false; |
| sync_helper.RegisterSynchronizationCallback( |
| callback::SetWhenCalled(&called2)); |
| |
| EXPECT_FALSE(called1); |
| EXPECT_FALSE(called2); |
| operation1(); |
| EXPECT_TRUE(called1); |
| EXPECT_FALSE(called2); |
| operation2(); |
| EXPECT_TRUE(called1); |
| EXPECT_TRUE(called2); |
| } |
| |
| TEST(SyncHelper, CallOperationTwice) { |
| SyncHelper sync_helper; |
| int operation_count = 0; |
| auto operation = sync_helper.WrapOperation([&] { ++operation_count; }); |
| int called_count = 0; |
| sync_helper.RegisterSynchronizationCallback([&] { ++called_count; }); |
| |
| EXPECT_EQ(0, operation_count); |
| EXPECT_EQ(0, called_count); |
| operation(); |
| EXPECT_EQ(1, operation_count); |
| EXPECT_EQ(1, called_count); |
| operation(); |
| EXPECT_EQ(2, operation_count); |
| EXPECT_EQ(1, called_count); |
| } |
| |
| TEST(SyncHelper, WrapMutableLambda) { |
| SyncHelper sync_helper; |
| bool called = false; |
| sync_helper.WrapOperation([&called]() mutable { called = true; })(); |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, StoreConstWrappedOperation) { |
| SyncHelper sync_helper; |
| bool called = false; |
| const auto operation = |
| sync_helper.WrapOperation(callback::SetWhenCalled(&called)); |
| EXPECT_FALSE(called); |
| operation(); |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, OnEmptyCallback) { |
| SyncHelper sync_helper; |
| bool on_empty_called; |
| sync_helper.set_on_empty(callback::SetWhenCalled(&on_empty_called)); |
| EXPECT_TRUE(sync_helper.empty()); |
| const auto operation = sync_helper.WrapOperation([] {}); |
| EXPECT_FALSE(on_empty_called); |
| EXPECT_FALSE(sync_helper.empty()); |
| operation(); |
| EXPECT_TRUE(on_empty_called); |
| EXPECT_TRUE(sync_helper.empty()); |
| } |
| |
| TEST(SyncHelper, SyncWithDeletedOperation) { |
| SyncHelper sync_helper; |
| bool called; |
| fit::closure operation = sync_helper.WrapOperation([] {}); |
| sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called)); |
| EXPECT_FALSE(called); |
| operation = nullptr; |
| EXPECT_TRUE(called); |
| } |
| |
| TEST(SyncHelper, OnEmptyWithDeletedOperation) { |
| SyncHelper sync_helper; |
| bool on_empty_called; |
| sync_helper.set_on_empty(callback::SetWhenCalled(&on_empty_called)); |
| fit::closure operation = sync_helper.WrapOperation([] {}); |
| EXPECT_FALSE(on_empty_called); |
| operation = nullptr; |
| EXPECT_TRUE(on_empty_called); |
| } |
| |
| } // namespace |
| } // namespace ledger |