| // Copyright 2019 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 <fidl/recursion_detector.h> |
| #include <zxtest/zxtest.h> |
| |
| namespace { |
| |
| // These objects exist solely so that the test code below can get a pointer to their address, |
| // which is passed into RecursionDetector.Enter(). |
| int object; |
| int object2; |
| |
| } // namespace |
| |
| TEST(RecursionDetector, EnterSameObjectTwiceResultsInNoGuard) { |
| RecursionDetector rd; |
| |
| auto guard = rd.Enter(&object); |
| ASSERT_TRUE(guard.has_value()); |
| |
| auto guard2 = rd.Enter(&object2); |
| ASSERT_TRUE(guard2.has_value()); |
| |
| auto no_guard = rd.Enter(&object); |
| ASSERT_FALSE(no_guard.has_value()); |
| } |
| |
| TEST(RecursionDetector, GuardObjectPopsSeenObjectsOnScopeExit) { |
| RecursionDetector rd; |
| |
| auto guard = rd.Enter(&object); |
| ASSERT_TRUE(guard.has_value()); |
| |
| { |
| auto guard2 = rd.Enter(&object2); |
| ASSERT_TRUE(guard2.has_value()); |
| } |
| |
| { |
| auto new_guard2 = rd.Enter(&object2); |
| ASSERT_TRUE(new_guard2.has_value()); |
| } |
| } |