/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* 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 <gtest/gtest.h>
#include "checker/checker_manager.h"
#include "accesstoken_kit.h"
#include "bootstrap.h"
#include "hap_token_info.h"
#include "nativetoken_kit.h"
#include "utils/crypto.h"
using namespace testing::ext;
using namespace OHOS::DistributedData;
using namespace OHOS::Security::AccessToken;
class CheckerManagerTest : public testing::Test {
public:
    static void SetUpTestCase(void) {}
    static void TearDownTestCase(void) {}
    void SetUp();
    void TearDown();
    NativeTokenInfoParams infoInstance{0};
};

void CheckerManagerTest::SetUp(void)
{
    infoInstance.dcapsNum = 0;
    infoInstance.permsNum = 0;
    infoInstance.aclsNum = 0;
    infoInstance.dcaps = nullptr;
    infoInstance.perms = nullptr;
    infoInstance.acls = nullptr;
    infoInstance.processName = "CheckerManagerTest";
    infoInstance.aplStr = "system_core";

    HapInfoParams info = {
        .userID = 100,
        .bundleName = "ohos.test.demo",
        .instIndex = 0,
        .appIDDesc = "ohos.test.demo"
    };
    PermissionDef infoManagerTestPermDef = {
        .permissionName = "ohos.permission.test",
        .bundleName = "ohos.test.demo",
        .grantMode = 1,
        .availableLevel = APL_NORMAL,
        .label = "label",
        .labelId = 1,
        .description = "open the door",
        .descriptionId = 1
    };
    PermissionStateFull infoManagerTestState = {
        .permissionName = "ohos.permission.test",
        .isGeneral = true,
        .resDeviceID = {"local"},
        .grantStatus = {PermissionState::PERMISSION_GRANTED},
        .grantFlags = {1}
    };
    HapPolicyParams policy = {
        .apl = APL_NORMAL,
        .domain = "test.domain",
        .permList = {infoManagerTestPermDef},
        .permStateList = {infoManagerTestState}
    };
    AccessTokenKit::AllocHapToken(info, policy);

    Bootstrap::GetInstance().LoadComponents();
    Bootstrap::GetInstance().LoadDirectory();
    Bootstrap::GetInstance().LoadCheckers();
    Bootstrap::GetInstance().LoadNetworks();
}

void CheckerManagerTest::TearDown()
{
    auto tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
    AccessTokenKit::DeleteToken(tokenId);
}
/**
* @tc.name: checkers
* @tc.desc: checker the bundle name of the system abilities.
* @tc.type: FUNC
* @tc.require:
* @tc.author: Sven Wang
*/
HWTEST_F(CheckerManagerTest, Checkers, TestSize.Level0)
{
    auto *checker = CheckerManager::GetInstance().GetChecker("SystemChecker");
    ASSERT_NE(checker, nullptr);
    checker = CheckerManager::GetInstance().GetChecker("BundleChecker");
    ASSERT_NE(checker, nullptr);
    checker = CheckerManager::GetInstance().GetChecker("OtherChecker");
    ASSERT_EQ(checker, nullptr);
}

/**
* @tc.name: SystemChecker bms
* @tc.desc: checker the bundle name of the system abilities.
* @tc.type: FUNC
* @tc.require:
* @tc.author: Sven Wang
*/
HWTEST_F(CheckerManagerTest, SystemCheckerBMS, TestSize.Level0)
{
    CheckerManager::StoreInfo info;
    info.uid = 1000;
    info.tokenId = GetAccessTokenId(&infoInstance);
    info.bundleName = "bundle_manager_service";
    ASSERT_EQ("bundle_manager_service", CheckerManager::GetInstance().GetAppId(info));
    ASSERT_TRUE(CheckerManager::GetInstance().IsValid(info));
}

/**
* @tc.name: SystemChecker form
* @tc.desc: checker the bundle name of the system abilities.
* @tc.type: FUNC
* @tc.require:
* @tc.author: Sven Wang
*/
HWTEST_F(CheckerManagerTest, SystemCheckerForm, TestSize.Level0)
{
    CheckerManager::StoreInfo info;
    info.uid = 1000;
    info.tokenId = GetAccessTokenId(&infoInstance);
    info.bundleName = "form_storage";
    ASSERT_EQ("form_storage", CheckerManager::GetInstance().GetAppId(info));
    ASSERT_TRUE(CheckerManager::GetInstance().IsValid(info));
}

/**
* @tc.name: SystemChecker ivi
* @tc.desc: checker the bundle name of the system abilities.
* @tc.type: FUNC
* @tc.require:
* @tc.author: Sven Wang
*/
HWTEST_F(CheckerManagerTest, SystemCheckerIVI, TestSize.Level0)
{
    CheckerManager::StoreInfo info;
    info.uid = 1000;
    info.tokenId = GetAccessTokenId(&infoInstance);
    info.bundleName = "ivi_config_manager";
    ASSERT_EQ("ivi_config_manager", CheckerManager::GetInstance().GetAppId(info));
    ASSERT_TRUE(CheckerManager::GetInstance().IsValid(info));
}

/**
* @tc.name: BundleChecker
* @tc.desc: checker the bundle name of the bundle abilities.
* @tc.type: FUNC
* @tc.require:
* @tc.author: Sven Wang
*/
HWTEST_F(CheckerManagerTest, BundleChecker, TestSize.Level0)
{
    CheckerManager::StoreInfo storeInfo;
    storeInfo.uid = 2000000;
    storeInfo.tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
    storeInfo.bundleName = "ohos.test.demo";
    HapTokenInfo tokenInfo;
    AccessTokenKit::GetHapTokenInfo(storeInfo.tokenId, tokenInfo);
    ASSERT_EQ(Crypto::Sha256(tokenInfo.appID), CheckerManager::GetInstance().GetAppId(storeInfo));
    ASSERT_TRUE(CheckerManager::GetInstance().IsValid(storeInfo));
}

/**
* @tc.name: IsDynamic
* @tc.desc: checker data type.
* @tc.type: FUNC
* @tc.require:
* @tc.author:
*/
HWTEST_F(CheckerManagerTest, IsDynamic, TestSize.Level0)
{
    CheckerManager::StoreInfo storeInfo;
    storeInfo.uid = 2000000;
    storeInfo.tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
    storeInfo.bundleName = "ohos.test.demo";
    ASSERT_FALSE(CheckerManager::GetInstance().IsDynamic(storeInfo));
}

/**
* @tc.name: IsStatic
* @tc.desc: checker data type.
* @tc.type: FUNC
* @tc.require:
* @tc.author:
*/
HWTEST_F(CheckerManagerTest, IsStatic, TestSize.Level0)
{
    CheckerManager::StoreInfo storeInfo;
    storeInfo.uid = 2000000;
    storeInfo.tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
    storeInfo.bundleName = "ohos.test.demo";
    ASSERT_FALSE(CheckerManager::GetInstance().IsStatic(storeInfo));
}