| // 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 <thread> | |
| #include "flutter/fml/synchronization/semaphore.h" | |
| #include "flutter/fml/thread.h" | |
| #include "flutter/fml/time/time_point.h" | |
| #include "gtest/gtest.h" | |
| TEST(SemaphoreTest, SimpleValidity) { | |
| fml::Semaphore sem(100); | |
| ASSERT_TRUE(sem.IsValid()); | |
| } | |
| TEST(SemaphoreTest, WaitOnZero) { | |
| fml::Semaphore sem(0); | |
| ASSERT_FALSE(sem.TryWait()); | |
| } | |
| TEST(SemaphoreTest, WaitOnZeroSignalThenWait) { | |
| fml::Semaphore sem(0); | |
| ASSERT_FALSE(sem.TryWait()); | |
| std::thread thread([&sem]() { sem.Signal(); }); | |
| thread.join(); | |
| ASSERT_TRUE(sem.TryWait()); | |
| ASSERT_FALSE(sem.TryWait()); | |
| } | |
| TEST(SemaphoreTest, IndefiniteWait) { | |
| auto start = fml::TimePoint::Now(); | |
| constexpr double wait_in_seconds = 0.25; | |
| fml::Semaphore sem(0); | |
| ASSERT_TRUE(sem.IsValid()); | |
| fml::Thread signaller("signaller_thread"); | |
| signaller.GetTaskRunner()->PostTaskForTime( | |
| [&sem]() { sem.Signal(); }, | |
| start + fml::TimeDelta::FromSecondsF(wait_in_seconds)); | |
| ASSERT_TRUE(sem.Wait()); | |
| auto delta = fml::TimePoint::Now() - start; | |
| ASSERT_GE(delta.ToSecondsF(), wait_in_seconds); | |
| signaller.Join(); | |
| } |