1 /*
2 * Copyright (c) 2025 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 <message_option.h>
18 #include <message_parcel.h>
19
20 #include "iremote_object_mocker.h"
21 #include "screen_session_manager_client/include/screen_session_manager_client.h"
22 #include "session_manager/include/scene_session_manager.h"
23 #include "session_manager/include/zidl/scene_session_manager_interface.h"
24 #include "session/container/include/window_event_channel.h"
25 #include "window_manager_agent.h"
26 #include "zidl/scene_session_manager_stub.h"
27 #include "zidl/window_manager_agent_interface.h"
28 #include "pattern_detach_callback.h"
29 #include "test/mock/mock_session_stage.h"
30 #include "mock/mock_message_parcel.h"
31 #include "test/mock/mock_scene_session_manager_stub.h"
32 #include "ui_effect_controller_client.h"
33 #include "ui_effect_controller.h"
34
35 using namespace testing;
36 using namespace testing::ext;
37 namespace OHOS {
38 namespace Rosen {
39 class SceneSessionManagerStubTest2 : public testing::Test {
40 public:
41 static void SetUpTestCase();
42 static void TearDownTestCase();
43 void SetUp() override;
44 void TearDown() override;
45 sptr<SceneSessionManagerStub> stub_;
46 private:
47 static constexpr uint32_t WAIT_SYNC_IN_NS = 200000;
48 };
49
SetUpTestCase()50 void SceneSessionManagerStubTest2::SetUpTestCase()
51 {
52 }
53
TearDownTestCase()54 void SceneSessionManagerStubTest2::TearDownTestCase()
55 {
56 }
57
SetUp()58 void SceneSessionManagerStubTest2::SetUp()
59 {
60 stub_ = sptr<SceneSessionManager>::MakeSptr();
61 }
62
TearDown()63 void SceneSessionManagerStubTest2::TearDown()
64 {
65 usleep(WAIT_SYNC_IN_NS);
66 }
67
68 namespace {
69
70 /**
71 * @tc.name: HandleIsFreeMultiWindow
72 * @tc.desc: test HandleIsFreeMultiWindow
73 * @tc.type: FUNC
74 */
75 HWTEST_F(SceneSessionManagerStubTest2, HandleIsFreeMultiWindow, TestSize.Level1)
76 {
77 MessageParcel data;
78 MessageParcel reply;
79
80 // writeInt32 failed
81 MockMessageParcel::ClearAllErrorFlag();
82 MockMessageParcel::SetWriteInt32ErrorFlag(true);
83 int res = stub_->HandleIsFreeMultiWindow(data, reply);
84 EXPECT_EQ(res, ERR_INVALID_DATA);
85 MockMessageParcel::ClearAllErrorFlag();
86
87 // writeBool failed
88 MockMessageParcel::SetWriteBoolErrorFlag(true);
89 res = stub_->HandleIsFreeMultiWindow(data, reply);
90 EXPECT_EQ(res, ERR_INVALID_DATA);
91
92 // interface success
93 MockMessageParcel::ClearAllErrorFlag();
94 res = stub_->HandleIsFreeMultiWindow(data, reply);
95 EXPECT_EQ(res, ERR_NONE);
96 }
97
98 /**
99 * @tc.name: HandleRecoverWindowPropertyChangeFlag01
100 * @tc.desc: test HandleRecoverWindowPropertyChangeFlag
101 * @tc.type: FUNC
102 */
103 HWTEST_F(SceneSessionManagerStubTest2, HandleRecoverWindowPropertyChangeFlag01, TestSize.Level1)
104 {
105 MessageParcel data;
106 MessageParcel reply;
107
108 auto res = stub_->HandleRecoverWindowPropertyChangeFlag(data, reply);
109 EXPECT_EQ(res, ERR_TRANSACTION_FAILED);
110
111 data.WriteUint32(0);
112 res = stub_->HandleRecoverWindowPropertyChangeFlag(data, reply);
113 EXPECT_EQ(res, ERR_TRANSACTION_FAILED);
114
115 MockMessageParcel::ClearAllErrorFlag();
116 MockMessageParcel::SetWriteInt32ErrorFlag(true);
117 res = stub_->HandleRecoverWindowPropertyChangeFlag(data, reply);
118 EXPECT_EQ(res, ERR_TRANSACTION_FAILED);
119 MockMessageParcel::ClearAllErrorFlag();
120 }
121
122 /**
123 * @tc.name: HandleCreateUIEffectController
124 * @tc.desc: test HandleCreateUIEffectController
125 * @tc.type: FUNC
126 */
127 HWTEST_F(SceneSessionManagerStubTest2, HandleCreateUIEffectController, Function | SmallTest | Level2)
128 {
129 MockMessageParcel::ClearAllErrorFlag();
130 MessageParcel data;
131 MessageParcel reply;
132 MessageOption option;
133 uint32_t code = static_cast<uint32_t>(
134 ISceneSessionManager::SceneSessionManagerMessage::TRANS_ID_CREATE_UI_EFFECT_CONTROLLER);
135 sptr<IUIEffectControllerClient> client = sptr<UIEffectControllerClient>::MakeSptr();
136 stub_->OnRemoteRequest(code, data, reply, option);
137 EXPECT_EQ(stub_->HandleCreateUIEffectController(data, reply), ERR_INVALID_DATA);
138 data.WriteRemoteObject(client->AsObject());
139 stub_->HandleCreateUIEffectController(data, reply);
140 sptr<MockSceneSessionManagerStub> stubMock = sptr<MockSceneSessionManagerStub>::MakeSptr();
141 EXPECT_CALL(*stubMock, CreateUIEffectController(_, _, _)).WillOnce(Return(static_cast<WMError>(-1)));
142 data.RewindRead(0);
143 EXPECT_EQ(stubMock->HandleCreateUIEffectController(data, reply), ERR_INVALID_DATA);
144 EXPECT_CALL(*stubMock, CreateUIEffectController(_, _, _)).WillOnce(DoAll(Return(WMError::WM_ERROR_NOT_SYSTEM_APP)));
145 data.RewindRead(0);
146 EXPECT_EQ(stubMock->HandleCreateUIEffectController(data, reply), ERR_NONE);
147 EXPECT_CALL(*stubMock, CreateUIEffectController(_, _, _)).WillOnce(DoAll(SetArgReferee<2>(-1),
148 Return(WMError::WM_OK)));
149 data.RewindRead(0);
150 EXPECT_EQ(stubMock->HandleCreateUIEffectController(data, reply), ERR_INVALID_DATA);
151 EXPECT_CALL(*stubMock, CreateUIEffectController(_, _, _)).WillOnce(DoAll(SetArgReferee<1>(nullptr),
152 SetArgReferee<2>(0), Return(WMError::WM_OK)));
153 data.RewindRead(0);
154 EXPECT_EQ(stubMock->HandleCreateUIEffectController(data, reply), ERR_INVALID_DATA);
155 sptr<UIEffectController> server = sptr<UIEffectController>::MakeSptr(0, nullptr, nullptr);
156 EXPECT_CALL(*stubMock, CreateUIEffectController(_, _, _)).WillOnce(DoAll(SetArgReferee<1>(server),
157 SetArgReferee<2>(0), Return(WMError::WM_OK)));
158 data.RewindRead(0);
159 EXPECT_EQ(stubMock->HandleCreateUIEffectController(data, reply), ERR_NONE);
160 }
161 } // namespace
162 } // namespace Rosen
163 } // namespace OHOS
164
165