// Copyright 2015 The Chromium 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 "base/mac/call_with_eh_frame.h" #import #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace mac { namespace { class CallWithEHFrameTest : public testing::Test { protected: void ThrowException() { @throw [NSException exceptionWithName:@"TestException" reason:@"Testing exceptions" userInfo:nil]; } }; // Catching from within the EHFrame is allowed. TEST_F(CallWithEHFrameTest, CatchExceptionHigher) { bool __block saw_exception = false; base::mac::CallWithEHFrame(^{ @try { ThrowException(); } @catch (NSException* exception) { saw_exception = true; } }); EXPECT_TRUE(saw_exception); } // Trying to catch an exception outside the EHFrame is blocked. TEST_F(CallWithEHFrameTest, CatchExceptionLower) { auto catch_exception_lower = ^{ bool saw_exception = false; @try { base::mac::CallWithEHFrame(^{ ThrowException(); }); } @catch (NSException* exception) { saw_exception = true; } ASSERT_FALSE(saw_exception); }; EXPECT_DEATH(catch_exception_lower(), ""); } } // namespace } // namespace mac } // namespace base