1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
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 "unit_test.h"
17
18#include <iostream>
19#include <new>
20#include <selinux/selinux.h>
21#include <vector>
22#include "gtest/gtest.h"
23#include "contexts_trie.h"
24#include "selinux_error.h"
25#include "selinux_map.h"
26#include "selinux_share_mem.h"
27#include "cstdlib"
28#include "test_common.h"
29#include "unistd.h"
30
31namespace OHOS {
32namespace Security {
33namespace SelinuxUnitTest {
34using namespace testing::ext;
35using namespace Selinux;
36const static std::string PARAMETER_CONTEXTS_FILE = "/system/etc/selinux/targeted/contexts/parameter_contexts";
37static const char DEFAULT_CONTEXT[] = "u:object_r:default_param:s0";
38
39void SelinuxUnitTest::SetUpTestCase() {}
40
41void SelinuxUnitTest::TearDownTestCase() {}
42
43void SelinuxUnitTest::SetUp() {}
44
45void SelinuxUnitTest::TearDown() {}
46
47static bool GenerateParamHashNode(const std::string &name, ParamHashNode **groupNode)
48{
49    auto tmp = static_cast<ParamHashNode*>(calloc(1, sizeof(ParamHashNode)));
50    if (tmp == nullptr) {
51        return false;
52    }
53    tmp->nameLen = name.size();
54    tmp->name = strdup(name.c_str());
55    if (tmp->name == nullptr) {
56        free(tmp);
57        return false;
58    }
59    tmp->childPtr = nullptr;
60    *groupNode = tmp;
61    return true;
62}
63
64static void FreeParamHashNode(ParamHashNode *groupNode)
65{
66    if (groupNode == nullptr) {
67        return;
68    }
69    if (groupNode->name != nullptr) {
70        free(groupNode->name);
71    }
72    free(groupNode);
73}
74
75/**
76 * @tc.name: HashMapCreate001
77 * @tc.desc: Test 'int32_t HashMapCreate(HashTab **handle)' with invalid params.
78 * @tc.type: FUNC
79 * @tc.require:
80 */
81HWTEST_F(SelinuxUnitTest, HashMapCreate001, TestSize.Level1)
82{
83    ASSERT_EQ(-1, HashMapCreate(nullptr));
84}
85
86/**
87 * @tc.name: HashMapCreate002
88 * @tc.desc: Test 'int32_t HashMapCreate(HashTab **handle)' with valid params.
89 * @tc.type: FUNC
90 * @tc.require:
91 */
92HWTEST_F(SelinuxUnitTest, HashMapCreate002, TestSize.Level1)
93{
94    HashTab *handle = nullptr;
95    EXPECT_EQ(0, HashMapCreate(&handle));
96    HashMapDestroy(handle);
97}
98
99/**
100 * @tc.name: HashMapDestroy001
101 * @tc.desc: Test 'void HashMapDestroy(HashTab *handle)' with handle nullptr.
102 * @tc.type: FUNC
103 * @tc.require:
104 */
105HWTEST_F(SelinuxUnitTest, HashMapDestroy001, TestSize.Level1)
106{
107    HashTab *handle = nullptr;
108    HashMapDestroy(handle);
109    ASSERT_EQ(nullptr, handle);
110}
111
112/**
113 * @tc.name: HashMapDestroy002
114 * @tc.desc: Test 'void HashMapDestroy(HashTab *handle)' with handle valid.
115 * @tc.type: FUNC
116 * @tc.require:
117 */
118HWTEST_F(SelinuxUnitTest, HashMapDestroy002, TestSize.Level1)
119{
120    HashTab *handle = nullptr;
121    ASSERT_TRUE(HashMapCreate(&handle) == 0);
122    ASSERT_TRUE(handle != nullptr);
123
124    for (size_t i = 0; i < 100; i++) {
125        ParamHashNode *groupNode = nullptr;
126        ASSERT_TRUE(GenerateParamHashNode(std::to_string(i), &groupNode));
127        ASSERT_EQ(HashMapAdd(handle, &(groupNode->hashNode)), 0);
128    }
129    HashMapDestroy(handle);
130}
131
132/**
133 * @tc.name: HashMapAdd001
134 * @tc.desc: Test 'int32_t HashMapAdd(HashTab *handle, HashNode *node)' with handle nullptr
135 * @tc.type: FUNC
136 * @tc.require:
137 */
138HWTEST_F(SelinuxUnitTest, HashMapAdd001, TestSize.Level1)
139{
140    ParamHashNode *groupNode = nullptr;
141    ASSERT_TRUE(GenerateParamHashNode("test", &groupNode));
142    EXPECT_EQ(-1, HashMapAdd(nullptr, &(groupNode->hashNode)));
143    FreeParamHashNode(groupNode);
144}
145
146/**
147 * @tc.name: HashMapAdd002
148 * @tc.desc: Test 'int32_t HashMapAdd(HashTab *handle, HashNode *node)' with node nullptr
149 * @tc.type: FUNC
150 * @tc.require:
151 */
152HWTEST_F(SelinuxUnitTest, HashMapAdd002, TestSize.Level1)
153{
154    HashTab *handle = nullptr;
155    ASSERT_EQ(0, HashMapCreate(&handle));
156    ASSERT_EQ(-1, HashMapAdd(handle, nullptr));
157    HashMapDestroy(handle);
158}
159
160/**
161 * @tc.name: HashMapAdd003
162 * @tc.desc: Test 'int32_t HashMapAdd(HashTab *handle, HashNode *node)' with node->next not nullptr
163 * @tc.type: FUNC
164 * @tc.require:
165 */
166HWTEST_F(SelinuxUnitTest, HashMapAdd003, TestSize.Level1)
167{
168    HashTab *handle = nullptr;
169    ASSERT_EQ(0, HashMapCreate(&handle));
170    ParamHashNode *groupNode = nullptr;
171    ASSERT_TRUE(GenerateParamHashNode("test", &groupNode));
172    groupNode->hashNode.next = new (std::nothrow) HashNode;
173    EXPECT_EQ(-1, HashMapAdd(handle, &(groupNode->hashNode)));
174    FreeParamHashNode(groupNode);
175    HashMapDestroy(handle);
176}
177
178/**
179 * @tc.name: HashMapAdd004
180 * @tc.desc: Test 'int32_t HashMapAdd(HashTab *handle, HashNode *node)' with key exist
181 * @tc.type: FUNC
182 * @tc.require:
183 */
184HWTEST_F(SelinuxUnitTest, HashMapAdd004, TestSize.Level1)
185{
186    HashTab *handle = nullptr;
187    ASSERT_EQ(0, HashMapCreate(&handle));
188    ParamHashNode *groupNode1 = nullptr;
189    ASSERT_TRUE(GenerateParamHashNode("test", &groupNode1));
190    ASSERT_EQ(0, HashMapAdd(handle, &(groupNode1->hashNode)));
191    ParamHashNode *groupNode2 = nullptr;
192    ASSERT_TRUE(GenerateParamHashNode("test", &groupNode2));
193    ASSERT_EQ(-1, HashMapAdd(handle, &(groupNode2->hashNode)));
194    FreeParamHashNode(groupNode2);
195    HashMapDestroy(handle);
196}
197
198/**
199 * @tc.name: InitSharedMem001
200 * @tc.desc: Test 'void *InitSharedMem(const char *fileName, uint32_t spaceSize, bool readOnly)' with invalid params.
201 * @tc.type: FUNC
202 * @tc.require:
203 */
204HWTEST_F(SelinuxUnitTest, InitSharedMem001, TestSize.Level1)
205{
206    EXPECT_EQ(nullptr, InitSharedMem("", 0, 0));
207    ASSERT_NE(0, access("/invalid_path", R_OK));
208    EXPECT_EQ(nullptr, InitSharedMem("/invalid_path", 1024 * 80, 1));
209    EXPECT_EQ(nullptr, InitSharedMem("/dev/__parameters__/param_selinux", 0, 0));
210}
211
212/**
213 * @tc.name: ReadSharedMem001
214 * @tc.desc: Test 'char *ReadSharedMem(char *sharedMem, uint32_t length)' with invalid params.
215 * @tc.type: FUNC
216 * @tc.require:
217 */
218HWTEST_F(SelinuxUnitTest, ReadSharedMem001, TestSize.Level1)
219{
220    EXPECT_EQ(nullptr, ReadSharedMem(nullptr, 1));
221    EXPECT_EQ(nullptr, ReadSharedMem("test", 0));
222}
223
224/**
225 * @tc.name: ReadSharedMem002
226 * @tc.desc: Test 'char *ReadSharedMem(char *sharedMem, uint32_t length)' with valid params.
227 * @tc.type: FUNC
228 * @tc.require:
229 */
230HWTEST_F(SelinuxUnitTest, ReadSharedMem002, TestSize.Level1)
231{
232    EXPECT_EQ("test", ReadSharedMem("test", 4));
233}
234} // namespace SelinuxUnitTest
235} // namespace Security
236} // namespace OHOS
237