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