| // 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(); | 
 | } |