Mmajiangfengsyscall_xts_update
85ed3390创建于 2025年6月7日历史提交
/*
 * Copyright (C) 2024 HiHope Open Source Organization.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#include <unistd.h>
#include <gtest/gtest.h>
#include <sys/fsuid.h>
#include <sys/personality.h>
#include <sys/stat.h>
#include <sys/types.h>


using namespace testing::ext;
using namespace std;

static const int MAX_GROUPS = 1024;
const unsigned long RETRIEVE_PERSONALITY = 0xffffffff;
const unsigned long DEFAULT_PERSONALITY = 0;

class UserApiTest : public testing::Test {
public:
    static void SetUpTestCase();
    static void TearDownTestCase();
    void SetUp();
    void TearDown();
private:
};
void UserApiTest::SetUp()
{
}
void UserApiTest::TearDown()
{
}
void UserApiTest::SetUpTestCase()
{
}
void UserApiTest::TearDownTestCase()
{
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0100
 * @tc.name   : SetpGidSetGroupIDSuccess_0001
 * @tc.desc   : SetpGid Set group ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetpGidSetGroupIDSuccess_0001, Function | MediumTest | Level1)
{
    int ret;
    gid_t gid = getgid();
    EXPECT_TRUE(gid >= 0);

    ret = setpgid(gid, gid);
    EXPECT_EQ(ret, 0);

    ret = setpgid(0, gid);
    EXPECT_EQ(ret, 0);

    ret = setpgid(gid, 0);
    EXPECT_EQ(ret, 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0200
 * @tc.name   : SetpGidSetGroupIDFail_0002
 * @tc.desc   : SetpGid Set group ID fail.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, SetpGidSetGroupIDFail_0002, Function | MediumTest | Level2)
{
    gid_t invalidGid = -1;
    errno = 0;
    int ret = setpgid(0, invalidGid);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EINVAL);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0300
 * @tc.name   : GetgroupsGetGroupIDListSuccess_0003
 * @tc.desc   : Getgroups get list of supplementary group IDs success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, GetgroupsGetGroupIDListSuccess_0003, Function | MediumTest | Level1)
{
    int numGroups;
    gid_t groups[MAX_GROUPS];

    numGroups = getgroups(MAX_GROUPS, groups);
    EXPECT_TRUE(numGroups >= 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0400
 * @tc.name   : GetgroupsGetGroupIDInNullFail_0004
 * @tc.desc   : Getgroups get list of supplementary group IDs in nullptr fail, errno EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, GetgroupsGetGroupIDInNullFail_0004, Function | MediumTest | Level2)
{
    errno = 0;
    int numGroups = getgroups(MAX_GROUPS, nullptr);
    EXPECT_EQ(numGroups, -1);
    EXPECT_EQ(errno, EFAULT);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0500
 * @tc.name   : GetpgidAcquireSpecifyProcessGroupIDSuccess_0005
 * @tc.desc   : Getpgid acquire specify process group ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, GetpgidAcquireSpecifyProcessGroupIDSuccess_0005, Function | MediumTest | Level1)
{
    pid_t pid = getpid();
    pid_t pgid = getpgid(pid);
    EXPECT_TRUE(pgid >= 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0600
 * @tc.name   : GetpgidAcquireInvalidProcessGroupIDFail_0006
 * @tc.desc   : Getpgid acquire group ID of invalid process ID fail, errno ESRCH.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, GetpgidAcquireInvalidProcessGroupIDFail_0006, Function | MediumTest | Level2)
{
    int invalidPID = -1;
    errno = 0;
    pid_t pgid = getpgid(invalidPID);
    EXPECT_EQ(pgid, -1);
    EXPECT_EQ(errno, ESRCH);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0700
 * @tc.name   : GetresuidGetReadEffectiveSavedUIDSuccess_0007
 * @tc.desc   : Getresuid get real uid effective uid and saved uid success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, GetresuidGetReadEffectiveSavedUIDSuccess_0007, Function | MediumTest | Level1)
{
    int ret;
    uid_t getRUid, getEUid, savedUid;
    uid_t realUid = getuid();
    uid_t effectiveUid = geteuid();
    ret = getresuid(&getRUid, &getEUid, &savedUid);
    EXPECT_EQ(ret, 0);
    EXPECT_EQ(realUid, getRUid);
    EXPECT_EQ(effectiveUid, getEUid);
    EXPECT_TRUE(savedUid >= 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0800
 * @tc.name   : GetresuidGetReadEffectiveSavedUIDInNullptrFail_0008
 * @tc.desc   : Getresuid get real uid effective uid and saved uid in nullptr fail.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, GetresuidGetReadEffectiveSavedUIDInNullptrFail_0008, Function | MediumTest | Level2)
{
    int ret;
    uid_t realUid, effectiveUid, savedUid;

    errno = 0;
    ret = getresuid(nullptr, &effectiveUid, &savedUid);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EFAULT);
    errno = 0;
    ret = getresuid(&realUid, nullptr, &savedUid);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EFAULT);
    errno = 0;
    ret = getresuid(&realUid, &effectiveUid, nullptr);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EFAULT);
}


/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_0900
 * @tc.name   : GetuidAcquireUIDSuccess_0009
 * @tc.desc   : Getuid acquire user ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, GetuidAcquireUIDSuccess_0009, Function | MediumTest | Level1)
{
    int ret;
    uid_t uid = getuid();
    EXPECT_TRUE(uid >= 0);

    uid_t setUid = uid + 1;
    ret = setuid(setUid);
    EXPECT_EQ(ret, 0);

    uid_t newUid = getuid();
    EXPECT_EQ(newUid, setUid);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1000
 * @tc.name   : PersonalitySetExecutionDomainSuccess_0010
 * @tc.desc   : Personality set the process execution domain success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, PersonalitySetExecutionDomainSuccess_0010, Function | MediumTest | Level1)
{
    int ret = personality(PER_LINUX32);
    EXPECT_EQ(ret, 0);
    unsigned long currentPersonality = static_cast<unsigned long>(personality(RETRIEVE_PERSONALITY));
    EXPECT_EQ(currentPersonality, PER_LINUX32);

    ret = personality(DEFAULT_PERSONALITY);
    EXPECT_GE(ret, 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1100
 * @tc.name   : SetfsgidCurrentSuccess_0011
 * @tc.desc   : Setfsgid set current gid.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetfsgidCurrentSuccess_0011, Function | MediumTest | Level1)
{
    int ret;
    ret = setfsgid(0);
    EXPECT_GE(ret, 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1200
 * @tc.name   : SetfsgidInvalidFsgidFailed_0012
 * @tc.desc   : Setfsgid set user ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, SetfsgidInvalidFsgidFailed_0012, Function | MediumTest | Level2)
{
    int ret;
    ret = setfsgid(-1);
    EXPECT_GE(ret, -1);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1300
 * @tc.name   : SetfsuidSetFSUserIDSuccess_0013
 * @tc.desc   : Setfsuid set user ID used for file system checks success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetfsuidSetFSUserIDSuccess_0013, Function | MediumTest | Level1)
{
    int ret;
    uid_t effectiveUid = geteuid();
    EXPECT_TRUE(effectiveUid >= 0);

    uid_t fsUid = effectiveUid + 1;
    ret = setfsuid(fsUid);
    EXPECT_GE(ret, 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1400
 * @tc.name   : SetgidSetGroupIDSuccess_0014
 * @tc.desc   : Setgid Set group ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetgidSetGroupIDSuccess_0014, Function | MediumTest | Level1)
{
    int ret;
    gid_t gid = getgid();
    EXPECT_TRUE(gid >= 0);

    gid_t setGid = gid + 1;
    ret = setgid(setGid);
    EXPECT_EQ(ret, 0);

    gid_t newGid = getgid();
    EXPECT_EQ(newGid, setGid);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1500
 * @tc.name   : SetgidSetGroupIDFail_0015
 * @tc.desc   : Setgid Set group ID fail.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, SetgidSetGroupIDFail_0015, Function | MediumTest | Level2)
{
    gid_t invalidGid = -1;
    errno = 0;
    int ret = setgid(invalidGid);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EINVAL);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1600
 * @tc.name   : SetgroupsSetGroupIDListSuccess_0016
 * @tc.desc   : Setgroups set list of supplementary group IDs success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetgroupsSetGroupIDListSuccess_0016, Function | MediumTest | Level1)
{
    int numGroups;
    int ret;
    const int groupLength = 3;
    gid_t groups[groupLength] = { 1001, 1002, 1003 };
    gid_t groupsCheck[MAX_GROUPS];

    ret = setgroups(groupLength, groups);
    EXPECT_EQ(ret, 0);
    numGroups = getgroups(MAX_GROUPS, groupsCheck);
    EXPECT_EQ(numGroups, groupLength);
    for (int i = 0; i < numGroups; i++) {
        EXPECT_EQ(groups[i], groupsCheck[i]);
    }
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1700
 * @tc.name   : SetgroupsSetGroupIDNullptrFail_0017
 * @tc.desc   : Setgroups set list of supplementary group IDs in nullptr fail, errno EFAULT.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, SetgroupsSetGroupIDNullptrFail_0017, Function | MediumTest | Level2)
{
    errno = 0;
    int ret = setgroups(MAX_GROUPS, nullptr);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EFAULT);

    errno = 0;
    ret = getgroups(MAX_GROUPS, nullptr);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EFAULT);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1800
 * @tc.name   : SetregidSetRealEffectiveGIDSuccess_0018
 * @tc.desc   : Setregid Set real and effective group ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetregidSetRealEffectiveGIDSuccess_0018, Function | MediumTest | Level1)
{
    int ret;
    gid_t realGid = getgid();
    EXPECT_TRUE(realGid >= 0);
    gid_t effectiveGid = getegid();
    EXPECT_TRUE(effectiveGid >= 0);

    gid_t setRealGid = realGid + 1;
    gid_t setEffectiveGid = effectiveGid + 1;
    ret = setregid(setRealGid, setEffectiveGid);
    EXPECT_EQ(ret, 0);

    gid_t newRealGid = getgid();
    EXPECT_EQ(newRealGid, setRealGid);
    gid_t newEffectiveGid = getegid();
    EXPECT_EQ(newEffectiveGid, setEffectiveGid);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_1900
 * @tc.name   : SetresgidSetRealEffectiveSavedGIDSuccess_0019
 * @tc.desc   : Setresgid Set real effective and saved group ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetresgidSetRealEffectiveSavedGIDSuccess_0019, Function | MediumTest | Level1)
{
    int ret;
    pid_t pid = getpid();
    gid_t realGid = getgid();
    EXPECT_TRUE(realGid >= 0);
    gid_t effectiveGid = getegid();
    EXPECT_TRUE(effectiveGid >= 0);
    gid_t savedGid = getsid(pid);
    EXPECT_TRUE(savedGid >= 0);

    gid_t setRealGid = realGid + 1;
    gid_t setEffectiveGid = effectiveGid + 1;
    gid_t notModifySavedGid = -1;
    ret = setresgid(setRealGid, setEffectiveGid, notModifySavedGid);
    EXPECT_EQ(ret, 0);

    gid_t newRealGid = getgid();
    EXPECT_EQ(newRealGid, setRealGid);
    gid_t newEffectiveGid = getegid();
    EXPECT_EQ(newEffectiveGid, setEffectiveGid);
    gid_t newSavedGid = getsid(pid);
    EXPECT_EQ(newSavedGid, savedGid);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_2000
 * @tc.name   : SetresuidSuccess_0020
 * @tc.desc   : Setresuid set current uid.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetresuidSuccess_0020, Function | MediumTest | Level1)
{
    int ret;
    ret = setresuid(0, 0, 0);
    EXPECT_EQ(ret, 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_2100
 * @tc.name   : SetreuidSuccess_0021
 * @tc.desc   : Setresuid Set current uid.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetreuidSuccess_0021, Function | MediumTest | Level1)
{
    int ret;
    ret = setreuid(0, 0);
    EXPECT_EQ(ret, 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_2200
 * @tc.name   : SetuidSetUserIDSuccess_0022
 * @tc.desc   : Setuid set user ID success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 1
 */
HWTEST_F(UserApiTest, SetuidSetUserIDSuccess_0022, Function | MediumTest | Level1)
{
    int ret;
    uid_t uid = getuid();
    EXPECT_TRUE(uid >= 0);

    uid_t setUid = uid + 1;
    ret = setuid(setUid);
    EXPECT_EQ(ret, 0);

    uid_t newUid = getuid();
    EXPECT_EQ(newUid, setUid);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_2300
 * @tc.name   : SetgidSetInvalidUIDFail_0023
 * @tc.desc   : Setgid set invalid user ID fail.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, SetgidSetInvalidUIDFail_0023, Function | MediumTest | Level2)
{
    uid_t invalidUid = -1;
    errno = 0;
    int ret = setuid(invalidUid);
    EXPECT_EQ(ret, -1);
    EXPECT_EQ(errno, EINVAL);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_2400
 * @tc.name   : SetsidSucc_0024
 * @tc.desc   : Setsid set sid success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, SetsidSucc_0024, Function | MediumTest | Level2)
{
    pid_t pid;
    int ret;
    pid = fork();

    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }

    ret = setsid();
    EXPECT_TRUE(ret > 0);
}

/*
 * @tc.number : SUB_KERNEL_SYSCALL_USER_2500
 * @tc.name   : Getresgid_0001
 * @tc.desc   : Getresgid success.
 * @tc.size   : MediumTest
 * @tc.type   : Function
 * @tc.level  : Level 2
 */
HWTEST_F(UserApiTest, Getresgid_0001, Function | MediumTest | Level2)
{
    gid_t rgid, egid, sgid;
    int ret = getresgid(&rgid, &egid, &sgid);
    EXPECT_EQ(ret, 0);
}