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 <gtest/gtest.h>
17 #include <sys/random.h>
18 
19 using namespace testing::ext;
20 
21 class HatsGetrandomTest : public testing::Test {
22 public:
23     static void SetUpTestCase();
24     static void TearDownTestCase();
25     void SetUp();
26     void TearDown();
27 private:
28 };
SetUp()29 void HatsGetrandomTest::SetUp()
30 {
31 }
TearDown()32 void HatsGetrandomTest::TearDown()
33 {
34 }
SetUpTestCase()35 void HatsGetrandomTest::SetUpTestCase()
36 {
37 }
TearDownTestCase()38 void HatsGetrandomTest::TearDownTestCase()
39 {
40 }
41 
42 /*
43  * @tc.number : SUB_KERNEL_SYSCALL_GETRANDOM_0100
44  * @tc.name   : GetrandomFunctionalityTestSuccess_0001
45  * @tc.desc   : getrandom functionality test success.
46  * @tc.size   : MediumTest
47  * @tc.type   : Function
48  * @tc.level  : Level 1
49  */
HWTEST_F(HatsGetrandomTest, GetrandomFunctionalityTestSuccess_0001, Function | MediumTest | Level1)50 HWTEST_F(HatsGetrandomTest, GetrandomFunctionalityTestSuccess_0001, Function | MediumTest | Level1)
51 {
52     size_t len = 256;
53     char buffer[len];
54     ssize_t ret = getrandom(buffer, len, 0);
55     EXPECT_EQ(ret, static_cast<ssize_t>(len));
56 }
57 
58 /*
59  * @tc.number : SUB_KERNEL_SYSCALL_GETRANDOM_0200
60  * @tc.name   : GetrandomMultipleCallsConsistencySuccess_0002
61  * @tc.desc   : getrandom multiple calls consistency success.
62  * @tc.size   : MediumTest
63  * @tc.type   : Function
64  * @tc.level  : Level 1
65  */
HWTEST_F(HatsGetrandomTest, GetrandomMultipleCallsConsistencySuccess_0002, Function | MediumTest | Level1)66 HWTEST_F(HatsGetrandomTest, GetrandomMultipleCallsConsistencySuccess_0002, Function | MediumTest | Level1)
67 {
68     size_t len = 8;
69     char buffer1[len];
70     char buffer2[len];
71     ssize_t ret = 0;
72     ssize_t ret1 = 0;
73     ssize_t ret2 = 0;
74 
75     ret1 = getrandom(buffer1, len, 0);
76     EXPECT_EQ(ret1, static_cast<ssize_t>(len));
77     ret2 = getrandom(buffer2, len, 0);
78     EXPECT_EQ(ret2, static_cast<ssize_t>(len));
79     ret = memcmp(buffer1, buffer2, len);
80     EXPECT_NE(ret, 0);
81 }
82 
83 /*
84  * @tc.number : SUB_KERNEL_SYSCALL_GETRANDOM_0300
85  * @tc.name   : GetrandomInvalidParametersBuffFail_0003
86  * @tc.desc   : getrandom invalid parameters buffer address fail, return -1, and set errno.
87  * @tc.size   : MediumTest
88  * @tc.type   : Function
89  * @tc.level  : Level 2
90  */
HWTEST_F(HatsGetrandomTest, GetrandomInvalidParametersBuffFail_0003, Function | MediumTest | Level2)91 HWTEST_F(HatsGetrandomTest, GetrandomInvalidParametersBuffFail_0003, Function | MediumTest | Level2)
92 {
93     size_t len = 10;
94 
95     errno = 0;
96     ssize_t ret = getrandom(nullptr, len, 0);
97     EXPECT_EQ(ret, -1);
98     EXPECT_EQ(errno, EFAULT);
99 }
100 
101 /*
102  * @tc.number : SUB_KERNEL_SYSCALL_GETRANDOM_0400
103  * @tc.name   : GetrandomInvalidParametersFlagFail_0004
104  * @tc.desc   : getrandom invalid parameters flag fail, return -1, and set errno.
105  * @tc.size   : MediumTest
106  * @tc.type   : Function
107  * @tc.level  : Level 2
108  */
HWTEST_F(HatsGetrandomTest, GetrandomInvalidParametersFlagFail_0004, Function | MediumTest | Level2)109 HWTEST_F(HatsGetrandomTest, GetrandomInvalidParametersFlagFail_0004, Function | MediumTest | Level2)
110 {
111     size_t len = 32;
112     char buffer[len];
113     ssize_t invalidFlag = -1;
114 
115     errno = 0;
116     ssize_t ret = getrandom(buffer, len, invalidFlag);
117     EXPECT_EQ(ret, -1);
118     EXPECT_EQ(errno, EINVAL);
119 }
120 
121 /*
122  * @tc.number : SUB_KERNEL_SYSCALL_GETRANDOM_0500
123  * @tc.name   : GetrandomGRND_RANDOMFlagSuccess_0005
124  * @tc.desc   : getrandom use GRND_RANDOM flag success.
125  * @tc.size   : MediumTest
126  * @tc.type   : Function
127  * @tc.level  : Level 1
128  */
HWTEST_F(HatsGetrandomTest, GetrandomGRND_RANDOMFlagSuccess_0005, Function | MediumTest | Level1)129 HWTEST_F(HatsGetrandomTest, GetrandomGRND_RANDOMFlagSuccess_0005, Function | MediumTest | Level1)
130 {
131     size_t len = 256;
132     char buffer[len];
133     ssize_t ret = getrandom(buffer, len, GRND_RANDOM | GRND_NONBLOCK);
134     EXPECT_EQ(ret, static_cast<ssize_t>(len));
135 }
136