|  | // 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 <Foundation/Foundation.h> | 
|  |  | 
|  | #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 |