1/* 2 * Copyright (C) 2024 HiHope Open Source Organization. 3 * Licensed under the Apache License, Version 2.0 (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 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <cerrno> 17#include <fcntl.h> 18#include <unistd.h> 19#include <gtest/gtest.h> 20#include <linux/capability.h> 21#include <sys/capability.h> 22#include <sys/mman.h> 23#include <sys/types.h> 24 25using namespace testing::ext; 26using namespace std; 27 28static const int INVALID_VERSION = 0; 29static const int INVALID_PID = -1; 30static const int UNUSED_PID = 15464648; 31static pid_t g_pid; 32 33class CapGetApiTest : public testing::Test { 34public: 35 static void SetUpTestCase(); 36 static void TearDownTestCase(); 37 void SetUp(); 38 void TearDown(); 39private: 40}; 41 42void CapGetApiTest::SetUp() 43{ 44 g_pid = getpid(); 45} 46 47void CapGetApiTest::TearDown() 48{ 49} 50 51void CapGetApiTest::SetUpTestCase() 52{ 53} 54 55void CapGetApiTest::TearDownTestCase() 56{ 57} 58 59/* 60 * @tc.number : SUB_KERNEL_SYSCALL_CAPGET_0100 61 * @tc.name : CapGetVersionSuccess_0001 62 * @tc.desc : capget version 1 2 3 and data success. 63 * @tc.size : MediumTest 64 * @tc.type : Function 65 * @tc.level : Level 1 66 */ 67HWTEST_F(CapGetApiTest, CapGetVersionSuccess_0001, Function | MediumTest | Level1) 68{ 69 struct __user_cap_header_struct hdr; 70 struct __user_cap_data_struct data[2]; 71 hdr.pid = g_pid; 72 73 hdr.version = _LINUX_CAPABILITY_VERSION_1; 74 int ret = capget(&hdr, data); 75 EXPECT_TRUE(ret >= 0); 76 77 hdr.version = _LINUX_CAPABILITY_VERSION_2; 78 ret = capget(&hdr, data); 79 EXPECT_TRUE(ret >= 0); 80 81 hdr.version = _LINUX_CAPABILITY_VERSION_3; 82 ret = capget(&hdr, data); 83 EXPECT_TRUE(ret >= 0); 84 85 hdr.version = _LINUX_CAPABILITY_VERSION_2; 86 ret = capget(&hdr, nullptr); 87 EXPECT_TRUE(ret >= 0); 88} 89 90/* 91 * @tc.number : SUB_KERNEL_SYSCALL_CAPGET_0200 92 * @tc.name : CapGetInvalidVersionFailed_0002 93 * @tc.desc : capget invalid version return -1 errno EINVAL. 94 * @tc.size : MediumTest 95 * @tc.type : Function 96 * @tc.level : Level 2 97 */ 98HWTEST_F(CapGetApiTest, CapGetInvalidVersionFailed_0002, Function | MediumTest | Level2) 99{ 100 struct __user_cap_header_struct hdr; 101 struct __user_cap_data_struct data[2]; 102 hdr.pid = g_pid; 103 104 hdr.version = INVALID_VERSION; 105 errno = 0; 106 int ret = capget(&hdr, data); 107 EXPECT_EQ(ret, -1); 108 EXPECT_EQ(errno, EINVAL); 109} 110 111/* 112 * @tc.number : SUB_KERNEL_SYSCALL_CAPGET_0300 113 * @tc.name : CapGetInvalidPidFailed_0003 114 * @tc.desc : capget invalid g_pid return -1 errno EINVAL. 115 * @tc.size : MediumTest 116 * @tc.type : Function 117 * @tc.level : Level 2 118 */ 119HWTEST_F(CapGetApiTest, CapGetInvalidPidFailed_0003, Function | MediumTest | Level2) 120{ 121 struct __user_cap_header_struct hdr; 122 struct __user_cap_data_struct data[2]; 123 hdr.pid = INVALID_PID; 124 hdr.version = _LINUX_CAPABILITY_VERSION_2; 125 126 errno = 0; 127 int ret = capget(&hdr, data); 128 EXPECT_EQ(ret, -1); 129 EXPECT_EQ(errno, EINVAL); 130} 131 132/* 133 * @tc.number : SUB_KERNEL_SYSCALL_CAPGET_0400 134 * @tc.name : CapGetUnUsedPidFailed_0004 135 * @tc.desc : capget unused g_pid return -1 errno ESRCH. 136 * @tc.size : MediumTest 137 * @tc.type : Function 138 * @tc.level : Level 2 139 */ 140HWTEST_F(CapGetApiTest, CapGetUnUsedPidFailed_0004, Function | MediumTest | Level2) 141{ 142 struct __user_cap_header_struct hdr; 143 struct __user_cap_data_struct data[2]; 144 hdr.pid = UNUSED_PID; 145 hdr.version = _LINUX_CAPABILITY_VERSION_2; 146 147 errno = 0; 148 int ret = capget(&hdr, data); 149 EXPECT_EQ(ret, -1); 150 EXPECT_EQ(errno, ESRCH); 151} 152 153/* 154 * @tc.number : SUB_KERNEL_SYSCALL_CAPGET_0500 155 * @tc.name : CapGetInvalidAddressFailed_0005 156 * @tc.desc : capget invalid address return -1 errno EFAULT. 157 * @tc.size : MediumTest 158 * @tc.type : Function 159 * @tc.level : Level 2 160 */ 161HWTEST_F(CapGetApiTest, CapGetInvalidAddressFailed_0005, Function | MediumTest | Level2) 162{ 163 struct __user_cap_data_struct data[2]; 164 165 errno = 0; 166 int ret = capget(nullptr, data); 167 EXPECT_EQ(ret, -1); 168 EXPECT_EQ(errno, EFAULT); 169}