1 /*
2  * Copyright (c) 2022 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 "accesstoken_kit.h"
17 #define private public
18 #include "account_iam_callback_service.h"
19 #undef private
20 #include "account_iam_client.h"
21 #include "account_iam_client_test_callback.h"
22 #include "account_log_wrapper.h"
23 #include "test_common.h"
24 #include "token_setproc.h"
25 
26 namespace OHOS {
27 namespace AccountTest {
28 namespace {
29     const int32_t TEST_USER_ID = 200;
30     const int32_t WAIT_TIME = 20;
31 }
32 
33 using namespace testing;
34 using namespace testing::ext;
35 using namespace OHOS::AccountSA;
36 using namespace OHOS::Security::AccessToken;
37 
38 #ifdef HAS_PIN_AUTH_PART
39 class MockIInputer : public OHOS::AccountSA::IInputer {
40 public:
~MockIInputer()41     virtual ~MockIInputer() {}
OnGetData(int32_t authSubType,std::vector<uint8_t> challenge,std::shared_ptr<IInputerData> inputerData)42     void OnGetData(int32_t authSubType, std::vector<uint8_t> challenge,
43         std::shared_ptr<IInputerData> inputerData) override
44     {
45         return;
46     }
47 };
48 #endif
49 
50 class AccountIAMCallbackServiceTest : public testing::Test {
51 public:
52     static void SetUpTestCase(void);
53     static void TearDownTestCase(void);
54     void SetUp(void) override;
55     void TearDown(void) override;
56 };
57 
SetUpTestCase(void)58 void AccountIAMCallbackServiceTest::SetUpTestCase(void)
59 {
60     AccessTokenID tokenId = AccessTokenKit::GetHapTokenID(100, "com.ohos.settings", 0);
61     SetSelfTokenID(tokenId);
62 }
63 
TearDownTestCase(void)64 void AccountIAMCallbackServiceTest::TearDownTestCase(void)
65 {}
66 
SetUp(void)67 void AccountIAMCallbackServiceTest::SetUp(void) __attribute__((no_sanitize("cfi")))
68 {
69     testing::UnitTest *test = testing::UnitTest::GetInstance();
70     ASSERT_NE(test, nullptr);
71     const testing::TestInfo *testinfo = test->current_test_info();
72     ASSERT_NE(testinfo, nullptr);
73     string testCaseName = string(testinfo->name());
74     ACCOUNT_LOGI("[SetUp] %{public}s start", testCaseName.c_str());
75 }
76 
TearDown(void)77 void AccountIAMCallbackServiceTest::TearDown(void)
78 {}
79 
80 /**
81  * @tc.name: IDMCallbackService_OnAcquireInfo_0100
82  * @tc.desc: OnAcquireInfo with nullptr.
83  * @tc.type: FUNC
84  * @tc.require:
85  */
86 HWTEST_F(AccountIAMCallbackServiceTest, IDMCallbackService_OnAcquireInfo_0100, TestSize.Level0)
87 {
88     sptr<IDMCallbackService> wrapper = new (std::nothrow) IDMCallbackService(TEST_USER_ID, nullptr);
89     EXPECT_TRUE(wrapper->callback_ == nullptr);
90     Attributes extraInfo;
91     wrapper->OnAcquireInfo(0, 0, extraInfo);
92 }
93 
94 /**
95  * @tc.name: IDMCallbackService_OnAcquireInfo_0200
96  * @tc.desc: OnAcquireInfo with not nullptr.
97  * @tc.type: FUNC
98  * @tc.require:
99  */
100 HWTEST_F(AccountIAMCallbackServiceTest, IDMCallbackService_OnAcquireInfo_0200, TestSize.Level0)
101 {
102     auto callback = std::make_shared<MockIDMCallback>();
103     EXPECT_NE(callback, nullptr);
104     EXPECT_CALL(*callback, OnAcquireInfo(_, _, _)).Times(Exactly(1));
105     auto testCallback = std::make_shared<TestIDMCallback>(callback);
106     sptr<IDMCallbackService> wrapper = new (std::nothrow) IDMCallbackService(TEST_USER_ID, testCallback);
107     EXPECT_TRUE(wrapper->callback_ != nullptr);
108     Attributes extraInfo;
109     wrapper->OnAcquireInfo(0, 0, extraInfo);
110     std::unique_lock<std::mutex> lock(testCallback->mutex);
111     testCallback->cv.wait_for(
__anond8c27aaa0202() 112         lock, std::chrono::seconds(WAIT_TIME), [lockCallback = testCallback]() { return lockCallback->isReady; });
113 }
114 
115 /**
116  * @tc.name: IDMCallbackService_OnResult_0100
117  * @tc.desc: OnResult test.
118  * @tc.type: FUNC
119  * @tc.require:
120  */
121 HWTEST_F(AccountIAMCallbackServiceTest, IDMCallbackService_OnResult_0100, TestSize.Level0)
122 {
123     auto callback = std::make_shared<MockIDMCallback>();
124     EXPECT_NE(callback, nullptr);
125     EXPECT_CALL(*callback, OnResult(0, _)).Times(Exactly(1));
126     auto testCallback = std::make_shared<TestIDMCallback>(callback);
127     sptr<IDMCallbackService> wrapper = new (std::nothrow) IDMCallbackService(TEST_USER_ID, testCallback);
128     ASSERT_NE(wrapper, nullptr);
129     Attributes extraInfo;
130     wrapper->OnResult(0, extraInfo);
131     {
132         std::unique_lock<std::mutex> lock(testCallback->mutex);
133         testCallback->cv.wait_for(
__anond8c27aaa0302() 134             lock, std::chrono::seconds(WAIT_TIME), [lockCallback = testCallback]() { return lockCallback->isReady; });
135     }
136     EXPECT_CALL(*callback, OnResult(1, _)).Times(Exactly(1));
137     testCallback->isReady = false;
138     wrapper->OnResult(1, extraInfo);
139     {
140         std::unique_lock<std::mutex> lock(testCallback->mutex);
141         testCallback->cv.wait_for(
__anond8c27aaa0402() 142             lock, std::chrono::seconds(WAIT_TIME), [lockCallback = testCallback]() { return lockCallback->isReady; });
143     }
144     wrapper->callback_ = nullptr;
145     wrapper->OnResult(0, extraInfo);
146 }
147 
148 /**
149  * @tc.name: GetCredInfoCallbackService_OnCredentialInfo_0100
150  * @tc.desc: OnCredentialInfo with nullptr.
151  * @tc.type: FUNC
152  * @tc.require:
153  */
154 HWTEST_F(AccountIAMCallbackServiceTest, GetCredInfoCallbackService_OnCredentialInfo_0100, TestSize.Level0)
155 {
156     sptr<GetCredInfoCallbackService> wrapper = new (std::nothrow) GetCredInfoCallbackService(nullptr);
157     EXPECT_TRUE(wrapper->callback_ == nullptr);
158     std::vector<CredentialInfo> infoList;
159     wrapper->OnCredentialInfo(infoList);
160 }
161 
162 /**
163  * @tc.name: GetSetPropCallbackService_OnResult_0100
164  * @tc.desc: OnResult with nullptr.
165  * @tc.type: FUNC
166  * @tc.require:
167  */
168 HWTEST_F(AccountIAMCallbackServiceTest, GetSetPropCallbackService_OnResult_0100, TestSize.Level0)
169 {
170     sptr<GetSetPropCallbackService> wrapper = new (std::nothrow) GetSetPropCallbackService(nullptr);
171     EXPECT_TRUE(wrapper->callback_ == nullptr);
172     Attributes extraInfo;
173     wrapper->OnResult(0, extraInfo);
174 }
175 
176 /**
177  * @tc.name: DomainAuthCallbackAdapter_OnResult_0100
178  * @tc.desc: test OnResult.
179  * @tc.type: FUNC
180  * @tc.require:
181  */
182 HWTEST_F(AccountIAMCallbackServiceTest, DomainAuthCallbackAdapter_OnResult_0100, TestSize.Level0)
183 {
184     std::shared_ptr<DomainAuthCallbackAdapter> domainAuthCallbackAdapter =
185         std::make_shared<DomainAuthCallbackAdapter>(nullptr);
186     Parcel emptyParcel;
187     domainAuthCallbackAdapter->OnResult(0, emptyParcel);
188     std::string cmd = "hilog -x | grep 'AccountIAMFwk'";
189     std::string cmdRes = RunCommand(cmd);
190     ASSERT_TRUE(cmdRes.find("callback is nullptr") != std::string::npos);
191 }
192 
193 #ifdef HAS_PIN_AUTH_PART
194 /**
195  * @tc.name: DomainCredentialRecipient_OnSetData_0100
196  * @tc.desc: test OnSetData.
197  * @tc.type: FUNC
198  * @tc.require:
199  */
200 HWTEST_F(AccountIAMCallbackServiceTest, DomainCredentialRecipient_OnSetData_0100, TestSize.Level0)
201 {
202     auto domainCredentialRecipient = new (std::nothrow) DomainCredentialRecipient(100, nullptr);
203     std::vector<uint8_t> data = {1, 2, 3, 4};
204     domainCredentialRecipient->OnSetData(0, data);
205     EXPECT_EQ(domainCredentialRecipient->idmCallback_, nullptr);
206 }
207 #endif
208 }  // namespace AccountTest
209 }  // namespace OHOS