1 /*
2  * Copyright (c) 2024 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 <gtest/gtest.h>
17 #include <chrono>
18 #include <future>
19 #include <limits>
20 
21 #include "pattern_detach_callback.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 class PatternDetachCallbackTest : public testing::Test {
29 public:
30     static void SetUpTestCase();
31     static void TearDownTestCase();
32     void SetUp() override;
33     void TearDown() override;
34     sptr<PatternDetachCallback> patternDetachCallback_;
35 };
36 
SetUpTestCase()37 void PatternDetachCallbackTest::SetUpTestCase()
38 {
39 }
40 
TearDownTestCase()41 void PatternDetachCallbackTest::TearDownTestCase()
42 {
43 }
44 
SetUp()45 void PatternDetachCallbackTest::SetUp()
46 {
47     patternDetachCallback_ = new (std::nothrow) PatternDetachCallback();
48 }
49 
TearDown()50 void PatternDetachCallbackTest::TearDown()
51 {
52 }
53 
54 namespace {
55 /**
56  * @tc.name: GetResult01
57  * @tc.desc: GetResult Test
58  * @tc.type: FUNC
59  */
60 HWTEST_F(PatternDetachCallbackTest, GetResult01, Function | SmallTest | Level2)
61 {
62     int32_t maxWaitTime = 300;
63     auto startTime = std::chrono::duration_cast<std::chrono::milliseconds>(
64         std::chrono::system_clock::now().time_since_epoch()).count();
65     patternDetachCallback_->GetResult(maxWaitTime);
66     auto endTime = std::chrono::duration_cast<std::chrono::milliseconds>(
67         std::chrono::system_clock::now().time_since_epoch()).count();
68     auto waitTime = endTime - startTime;
69     GTEST_LOG_(INFO) << "GetResult waitTime:" << waitTime;
70     ASSERT_TRUE(waitTime >= maxWaitTime);
71 }
72 
73 /**
74  * @tc.name: GetResult02
75  * @tc.desc: GetResult Test
76  * @tc.type: FUNC
77  */
78 HWTEST_F(PatternDetachCallbackTest, GetResult02, Function | SmallTest | Level2)
79 {
80     int32_t maxWaitTime = 300;
81     int32_t sleepTime = 200;
__anond4858c420202() 82     std::future<void> future = std::async(std::launch::async, [this, sleepTime]() -> void {
83         std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
84         patternDetachCallback_->OnPatternDetach(0);
85     });
86     auto startTime = std::chrono::duration_cast<std::chrono::milliseconds>(
87         std::chrono::system_clock::now().time_since_epoch()).count();
88     patternDetachCallback_->GetResult(maxWaitTime);
89     auto endTime = std::chrono::duration_cast<std::chrono::milliseconds>(
90         std::chrono::system_clock::now().time_since_epoch()).count();
91     auto waitTime = endTime - startTime;
92     GTEST_LOG_(INFO) << "GetResultAndOnPatternDetach waitTime:" << waitTime;
93     ASSERT_TRUE(waitTime >= sleepTime && waitTime < maxWaitTime);
94 }
95 
96 /**
97  * @tc.name: GetResult03
98  * @tc.desc: GetResult Test
99  * @tc.type: FUNC
100  */
101 HWTEST_F(PatternDetachCallbackTest, GetResult03, Function | SmallTest | Level2)
102 {
103     int32_t maxWaitTime = 300;
104     int32_t sleepTime = 400;
__anond4858c420302() 105     std::future<void> future = std::async(std::launch::async, [this, sleepTime]() -> void {
106         std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
107         patternDetachCallback_->OnPatternDetach(0);
108     });
109     auto startTime = std::chrono::duration_cast<std::chrono::milliseconds>(
110         std::chrono::system_clock::now().time_since_epoch()).count();
111     patternDetachCallback_->GetResult(maxWaitTime);
112     auto endTime = std::chrono::duration_cast<std::chrono::milliseconds>(
113         std::chrono::system_clock::now().time_since_epoch()).count();
114     auto waitTime = endTime - startTime;
115     GTEST_LOG_(INFO) << "GetResultAndOnPatternDetach waitTime:" << waitTime;
116     ASSERT_TRUE(waitTime >= maxWaitTime && waitTime < sleepTime);
117 
118     int resultValue = 0;
__anond4858c420402() 119     std::function<void()> func = [this, &resultValue]() {
120         patternDetachCallback_->GetResult(std::numeric_limits<int>::max());
121         resultValue = 1;
122     };
123     func();
124     ASSERT_EQ(resultValue, 1);
125 }
126 
127 /**
128  * @tc.name: OnRemoteRequest01
129  * @tc.desc: OnRemoteRequest Test
130  * @tc.type: FUNC
131  */
132 HWTEST_F(PatternDetachCallbackTest, OnRemoteRequest01, Function | SmallTest | Level2)
133 {
134     MessageParcel data;
135     MessageParcel reply;
136     MessageOption option;
137     data.WriteInterfaceToken(u"error.GetDescriptor");
138 
139     uint32_t code = static_cast<uint32_t>(
140         IPatternDetachCallback::PatternDetachCallbackMessage::TRANS_ID_PATTERN_ON_DETACH);
141     int res = patternDetachCallback_->OnRemoteRequest(code, data, reply, option);
142     EXPECT_EQ(res, ERR_TRANSACTION_FAILED);
143 }
144 
145 }
146 } // namespace Rosen
147 } // namespace OHOS