OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
13 // limitations under the License. | 13 // limitations under the License. |
14 | 14 |
15 #include "util/mach/mach_extensions.h" | 15 #include "util/mach/mach_extensions.h" |
16 | 16 |
17 #include "base/mac/scoped_mach_port.h" | 17 #include "base/mac/scoped_mach_port.h" |
18 #include "gtest/gtest.h" | 18 #include "gtest/gtest.h" |
19 #include "test/mac/mach_errors.h" | 19 #include "test/mac/mach_errors.h" |
| 20 #include "util/mac/mac_util.h" |
20 | 21 |
21 namespace crashpad { | 22 namespace crashpad { |
22 namespace test { | 23 namespace test { |
23 namespace { | 24 namespace { |
24 | 25 |
25 TEST(MachExtensions, MachThreadSelf) { | 26 TEST(MachExtensions, MachThreadSelf) { |
26 base::mac::ScopedMachSendRight thread_self(mach_thread_self()); | 27 base::mac::ScopedMachSendRight thread_self(mach_thread_self()); |
27 EXPECT_EQ(thread_self, MachThreadSelf()); | 28 EXPECT_EQ(thread_self, MachThreadSelf()); |
28 } | 29 } |
29 | 30 |
(...skipping 23 matching lines...) Expand all Loading... |
53 base::mac::ScopedMachSendRight port(NewMachPort(MACH_PORT_RIGHT_DEAD_NAME)); | 54 base::mac::ScopedMachSendRight port(NewMachPort(MACH_PORT_RIGHT_DEAD_NAME)); |
54 ASSERT_NE(kMachPortNull, port); | 55 ASSERT_NE(kMachPortNull, port); |
55 | 56 |
56 mach_port_type_t type; | 57 mach_port_type_t type; |
57 kern_return_t kr = mach_port_type(mach_task_self(), port, &type); | 58 kern_return_t kr = mach_port_type(mach_task_self(), port, &type); |
58 ASSERT_EQ(KERN_SUCCESS, kr) << MachErrorMessage(kr, "mach_port_get_type"); | 59 ASSERT_EQ(KERN_SUCCESS, kr) << MachErrorMessage(kr, "mach_port_get_type"); |
59 | 60 |
60 EXPECT_EQ(MACH_PORT_TYPE_DEAD_NAME, type); | 61 EXPECT_EQ(MACH_PORT_TYPE_DEAD_NAME, type); |
61 } | 62 } |
62 | 63 |
| 64 const exception_mask_t kExcMaskBasic = |
| 65 EXC_MASK_BAD_ACCESS | |
| 66 EXC_MASK_BAD_INSTRUCTION | |
| 67 EXC_MASK_ARITHMETIC | |
| 68 EXC_MASK_EMULATION | |
| 69 EXC_MASK_SOFTWARE | |
| 70 EXC_MASK_BREAKPOINT | |
| 71 EXC_MASK_SYSCALL | |
| 72 EXC_MASK_MACH_SYSCALL | |
| 73 EXC_MASK_RPC_ALERT; |
| 74 |
| 75 TEST(MachExtensions, ExcMaskAll) { |
| 76 const exception_mask_t exc_mask_all = ExcMaskAll(); |
| 77 EXPECT_EQ(kExcMaskBasic, exc_mask_all & kExcMaskBasic); |
| 78 |
| 79 EXPECT_FALSE(exc_mask_all & EXC_MASK_CRASH); |
| 80 EXPECT_FALSE(exc_mask_all & EXC_MASK_CORPSE_NOTIFY); |
| 81 |
| 82 const int mac_os_x_minor_version = MacOSXMinorVersion(); |
| 83 if (mac_os_x_minor_version >= 8) { |
| 84 EXPECT_TRUE(exc_mask_all & EXC_MASK_RESOURCE); |
| 85 } else { |
| 86 EXPECT_FALSE(exc_mask_all & EXC_MASK_RESOURCE); |
| 87 } |
| 88 |
| 89 if (mac_os_x_minor_version >= 9) { |
| 90 EXPECT_TRUE(exc_mask_all & EXC_MASK_GUARD); |
| 91 } else { |
| 92 EXPECT_FALSE(exc_mask_all & EXC_MASK_GUARD); |
| 93 } |
| 94 |
| 95 // Bit 0 should not be set. |
| 96 EXPECT_FALSE(ExcMaskAll() & 1); |
| 97 |
| 98 // Every bit set in ExcMaskAll() must also be set in ExcMaskValid(). |
| 99 EXPECT_EQ(ExcMaskAll(), ExcMaskAll() & ExcMaskValid()); |
| 100 } |
| 101 |
| 102 TEST(MachExtensions, ExcMaskValid) { |
| 103 const exception_mask_t exc_mask_valid = ExcMaskValid(); |
| 104 EXPECT_EQ(kExcMaskBasic, exc_mask_valid & kExcMaskBasic); |
| 105 |
| 106 EXPECT_TRUE(exc_mask_valid & EXC_MASK_CRASH); |
| 107 |
| 108 const int mac_os_x_minor_version = MacOSXMinorVersion(); |
| 109 if (mac_os_x_minor_version >= 8) { |
| 110 EXPECT_TRUE(exc_mask_valid & EXC_MASK_RESOURCE); |
| 111 } else { |
| 112 EXPECT_FALSE(exc_mask_valid & EXC_MASK_RESOURCE); |
| 113 } |
| 114 |
| 115 if (mac_os_x_minor_version >= 9) { |
| 116 EXPECT_TRUE(exc_mask_valid & EXC_MASK_GUARD); |
| 117 } else { |
| 118 EXPECT_FALSE(exc_mask_valid & EXC_MASK_GUARD); |
| 119 } |
| 120 |
| 121 if (mac_os_x_minor_version >= 11) { |
| 122 EXPECT_TRUE(exc_mask_valid & EXC_MASK_CORPSE_NOTIFY); |
| 123 } else { |
| 124 EXPECT_FALSE(exc_mask_valid & EXC_MASK_CORPSE_NOTIFY); |
| 125 } |
| 126 |
| 127 // Bit 0 should not be set. |
| 128 EXPECT_FALSE(ExcMaskValid() & 1); |
| 129 |
| 130 // There must be bits set in ExcMaskValid() that are not set in ExcMaskAll(). |
| 131 EXPECT_TRUE(ExcMaskValid() & ~ExcMaskAll()); |
| 132 } |
| 133 |
63 } // namespace | 134 } // namespace |
64 } // namespace test | 135 } // namespace test |
65 } // namespace crashpad | 136 } // namespace crashpad |
OLD | NEW |