| // Copyright 2013 The Flutter 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 "flutter/fml/synchronization/sync_switch.h" |
| |
| #include <thread> |
| |
| #include "gtest/gtest.h" |
| |
| using fml::SyncSwitch; |
| |
| TEST(SyncSwitchTest, Basic) { |
| SyncSwitch sync_switch; |
| bool switch_value = false; |
| sync_switch.Execute(SyncSwitch::Handlers() |
| .SetIfTrue([&] { switch_value = true; }) |
| .SetIfFalse([&] { switch_value = false; })); |
| EXPECT_FALSE(switch_value); |
| sync_switch.SetSwitch(true); |
| sync_switch.Execute(SyncSwitch::Handlers() |
| .SetIfTrue([&] { switch_value = true; }) |
| .SetIfFalse([&] { switch_value = false; })); |
| EXPECT_TRUE(switch_value); |
| } |
| |
| TEST(SyncSwitchTest, NoopIfUndefined) { |
| SyncSwitch sync_switch; |
| bool switch_value = false; |
| sync_switch.Execute(SyncSwitch::Handlers()); |
| EXPECT_FALSE(switch_value); |
| } |
| |
| TEST(SyncSwitchTest, SharedLock) { |
| SyncSwitch sync_switch; |
| sync_switch.SetSwitch(true); |
| bool switch_value1 = false; |
| bool switch_value2 = false; |
| |
| std::thread thread1([&] { |
| sync_switch.Execute( |
| SyncSwitch::Handlers() |
| .SetIfTrue([&] { |
| switch_value1 = true; |
| |
| std::thread thread2([&]() { |
| sync_switch.Execute( |
| SyncSwitch::Handlers() |
| .SetIfTrue([&] { switch_value2 = true; }) |
| .SetIfFalse([&] { switch_value2 = false; })); |
| }); |
| thread2.join(); |
| }) |
| .SetIfFalse([&] { switch_value1 = false; })); |
| }); |
| thread1.join(); |
| EXPECT_TRUE(switch_value1); |
| EXPECT_TRUE(switch_value2); |
| } |