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