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 <gtest/gtest.h>
17 #include <gmock/gmock.h>
18 
19 #define protected public
20 #include "ability_command.h"
21 #undef protected
22 #include "mock_ability_manager_stub.h"
23 #define private public
24 #include "ability_manager_client.h"
25 #undef private
26 #include "ability_manager_interface.h"
27 #include "itest_observer.h"
28 
29 using namespace testing::ext;
30 using namespace OHOS;
31 using namespace OHOS::AAFwk;
32 using testing::_;
33 using testing::Invoke;
34 using testing::Return;
35 
36 namespace {
37 const std::string STRING_BUNDLE_NAME = "bundle";
38 } // namespace
39 
40 class AaCommandTestTest : public ::testing::Test {
41 public:
42     static void SetUpTestCase();
43     static void TearDownTestCase();
44     void SetUp() override;
45     void TearDown() override;
46 
47     void MakeMockObjects() const;
48 
49     std::string cmd_ = "test";
50 };
51 
SetUpTestCase()52 void AaCommandTestTest::SetUpTestCase()
53 {}
54 
TearDownTestCase()55 void AaCommandTestTest::TearDownTestCase()
56 {}
57 
SetUp()58 void AaCommandTestTest::SetUp()
59 {
60     // reset optind to 0
61     optind = 0;
62 
63     // make mock objects
64     MakeMockObjects();
65 }
66 
TearDown()67 void AaCommandTestTest::TearDown()
68 {}
69 
MakeMockObjects() const70 void AaCommandTestTest::MakeMockObjects() const
71 {
72     // mock a stub
73     auto managerStubPtr = sptr<IAbilityManager>(new MockAbilityManagerStub());
74 
75     // set the mock stub
76     auto managerClientPtr = AbilityManagerClient::GetInstance();
77     managerClientPtr->proxy_ = managerStubPtr;
78 }
79 
80 /**
81  * @tc.number: Aa_Command_Test_0100
82  * @tc.name: ExecCommand
83  * @tc.desc: Verify the "aa test -b xxx -s unittest 1" command.
84  */
HWTEST_F(AaCommandTestTest, Aa_Command_Test_0100, Function | MediumTest | Level1)85 HWTEST_F(AaCommandTestTest, Aa_Command_Test_0100, Function | MediumTest | Level1)
86 {
87     char* argv[] = {
88         (char*)TOOL_NAME.c_str(),
89         (char*)cmd_.c_str(),
90         (char*)"-b",
91         (char*)"xxx",
92         (char*)"-s",
93         (char*)"unittest",
94         (char*)"1",
95         (char*)"",
96     };
97     int argc = sizeof(argv) / sizeof(argv[0]) - 1;
98     AbilityManagerShellCommand cmd(argc, argv);
99 
100     auto managerClientPtr = AbilityManagerClient::GetInstance();
101     auto mockAbilityManagerStub = sptr<MockAbilityManagerStub>(new MockAbilityManagerStub());
102     ASSERT_NE(mockAbilityManagerStub, nullptr);
103     EXPECT_CALL(*mockAbilityManagerStub, StartUserTest(_, _))
104         .Times(1)
105         .WillOnce(Return(-1));
106     managerClientPtr->proxy_ = static_cast<IAbilityManager*>(mockAbilityManagerStub);
107 
108     EXPECT_EQ(cmd.ExecCommand(), STRING_START_USER_TEST_NG + "\n");
109     managerClientPtr->proxy_  = nullptr;
110 }
111 
112 /**
113  * @tc.number: Aa_Command_Test_0200
114  * @tc.name: ExecCommand
115  * @tc.desc: Verify the "aa test -b xxx -s unittest 1 -D" command.
116  */
HWTEST_F(AaCommandTestTest, Aa_Command_Test_0200, Function | MediumTest | Level1)117 HWTEST_F(AaCommandTestTest, Aa_Command_Test_0200, Function | MediumTest | Level1)
118 {
119     char* argv[] = {
120         (char*)TOOL_NAME.c_str(),
121         (char*)cmd_.c_str(),
122         (char*)"-b",
123         (char*)"xxx",
124         (char*)"-s",
125         (char*)"unittest",
126         (char*)"1",
127         (char*)"-D",
128         (char*)"",
129     };
130     int argc = sizeof(argv) / sizeof(argv[0]) - 1;
131     AbilityManagerShellCommand cmd(argc, argv);
132 
133     auto managerClientPtr = AbilityManagerClient::GetInstance();
134     auto mockAbilityManagerStub = sptr<MockAbilityManagerStub>(new MockAbilityManagerStub());
135     ASSERT_NE(mockAbilityManagerStub, nullptr);
136     EXPECT_CALL(*mockAbilityManagerStub, StartUserTest(_, _))
137         .Times(1)
138         .WillOnce(Return(-1));
139     managerClientPtr->proxy_ = static_cast<IAbilityManager*>(mockAbilityManagerStub);
140 
141     EXPECT_EQ(cmd.ExecCommand(), STRING_START_USER_TEST_NG + "\n");
142     managerClientPtr->proxy_  = nullptr;
143     testing::Mock::AllowLeak(mockAbilityManagerStub);
144 }
145 
146 /**
147  * @tc.number: Aa_Command_Test_0300
148  * @tc.name: ExecCommand
149  * @tc.desc: Verify the "aa test -b bundle -s unittest 1 -w 1" command.
150  */
HWTEST_F(AaCommandTestTest, Aa_Command_Test_0300, Function | MediumTest | Level1)151 HWTEST_F(AaCommandTestTest, Aa_Command_Test_0300, Function | MediumTest | Level1)
152 {
153     char* argv[] = {
154         (char*)TOOL_NAME.c_str(),
155         (char*)cmd_.c_str(),
156         (char*)"-b",
157         (char*)STRING_BUNDLE_NAME.c_str(),
158         (char*)"-s",
159         (char*)"unittest",
160         (char*)"1",
161         (char*)"-w",
162         (char*)"1",
163         (char*)"",
164     };
165     int argc = sizeof(argv) / sizeof(argv[0]) - 1;
166     AbilityManagerShellCommand cmd(argc, argv);
167 
168     auto managerClientPtr = AbilityManagerClient::GetInstance();
169     auto mockAbilityManagerStub = sptr<MockAbilityManagerStub>(new MockAbilityManagerStub());
170     ASSERT_NE(mockAbilityManagerStub, nullptr);
171     EXPECT_CALL(*mockAbilityManagerStub, StartUserTest(_, _))
172         .Times(1)
173         .WillOnce(Return(0));
174     managerClientPtr->proxy_ = static_cast<IAbilityManager*>(mockAbilityManagerStub);
175 
176     EXPECT_EQ(cmd.ExecCommand(), "Timeout: user test is not completed within the specified time.\n");
177     managerClientPtr->proxy_  = nullptr;
178     testing::Mock::AllowLeak(mockAbilityManagerStub);
179 }
180 
181 /**
182  * @tc.number: Aa_Command_Test_0400
183  * @tc.name: ExecCommand
184  * @tc.desc: Verify the "aa test -b bundle -s unittest 1 -w 0" command.
185  */
HWTEST_F(AaCommandTestTest, Aa_Command_Test_0400, Function | MediumTest | Level1)186 HWTEST_F(AaCommandTestTest, Aa_Command_Test_0400, Function | MediumTest | Level1)
187 {
188     char* argv[] = {
189         (char*)TOOL_NAME.c_str(),
190         (char*)cmd_.c_str(),
191         (char*)"-b",
192         (char*)STRING_BUNDLE_NAME.c_str(),
193         (char*)"-s",
194         (char*)"unittest",
195         (char*)"1",
196         (char*)"-w",
197         (char*)"0",
198         (char*)"",
199     };
200     int argc = sizeof(argv) / sizeof(argv[0]) - 1;
201     AbilityManagerShellCommand cmd(argc, argv);
202 
203     auto mockHandler = [](const Want& want, const sptr<IRemoteObject>& observer) -> int {
204         sptr<ITestObserver> testObserver = iface_cast<ITestObserver>(observer);
205         if (!testObserver) {
206             return -1;
207         }
208         testObserver->TestFinished("success", 0);
209         return 0;
210     };
211     auto managerClientPtr = AbilityManagerClient::GetInstance();
212     auto mockAbilityManagerStub = sptr<MockAbilityManagerStub>(new MockAbilityManagerStub());
213     ASSERT_NE(mockAbilityManagerStub, nullptr);
214     EXPECT_CALL(*mockAbilityManagerStub, StartUserTest(_, _))
215         .Times(1)
216         .WillOnce(Invoke(mockHandler));
217     managerClientPtr->proxy_ = static_cast<IAbilityManager*>(mockAbilityManagerStub);
218 
219     EXPECT_EQ(cmd.ExecCommand(), STRING_USER_TEST_FINISHED + "\n");
220     managerClientPtr->proxy_  = nullptr;
221     testing::Mock::AllowLeak(mockAbilityManagerStub);
222 }