1/*
2 * Copyright (C) 2021-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
17#include <memory>
18#include <string>
19
20#include "gtest/gtest.h"
21
22#define private public
23#define protected public
24#include "define_register.h"
25#include "hdc_connect.h"
26#include "hdc_jdwp.h"
27#undef private
28#undef protected
29
30using namespace testing;
31using namespace testing::ext;
32
33namespace Hdc {
34extern std::unique_ptr<ConnectManagement> g_connectManagement;
35class RegisterTest : public testing::Test {};
36
37/**
38 * @tc.name: CastToRegisterTest001
39 * @tc.desc: Test cast to register.
40 * @tc.type: FUNC
41 */
42HWTEST_F(RegisterTest, CastToRegisterTest001, TestSize.Level1)
43{
44    /**
45     * @tc.steps: step1. stop connect before start.
46     * @tc.expected: step1. g_connectManagement is null.
47     */
48    StopConnect();
49    EXPECT_EQ(g_connectManagement, nullptr);
50}
51
52/**
53 * @tc.name: CastToRegisterTest002
54 * @tc.desc: Test cast to register.
55 * @tc.type: FUNC
56 */
57HWTEST_F(RegisterTest, CastToRegisterTest002, TestSize.Level1)
58{
59    /**
60     * @tc.steps: step1. start connect.
61     * @tc.expected: step1. g_connectManagement is not null and the pktName is right.
62     */
63    StartConnect("", "test_pkt_name", true, nullptr);
64    ASSERT_NE(g_connectManagement, nullptr);
65    EXPECT_EQ(g_connectManagement->GetPkgName(), "test_pkt_name");
66
67    /**
68     * @tc.steps: step2. sleep 3 second.
69     */
70    sleep(3);
71
72    /**
73     # @tc.steps: step3. stop connect.
74     * @tc.expected: step3. g_connectManagement is not null
75     */
76    StopConnect();
77    ASSERT_NE(g_connectManagement, nullptr);
78}
79
80/**
81 * @tc.name: CastToRegisterTest003
82 * @tc.desc: Test cast to register.
83 * @tc.type: FUNC
84 */
85HWTEST_F(RegisterTest, CastToRegisterTest003, TestSize.Level1)
86{
87    /**
88     * @tc.steps: step1. start connect.
89     * @tc.expected: step1. g_connectManagement is not null and the pktName is right.
90     */
91    StartConnect("", "test_pkt_name", true, nullptr);
92    ASSERT_NE(g_connectManagement, nullptr);
93    EXPECT_EQ(g_connectManagement->GetPkgName(), "test_pkt_name");
94
95    /**
96     * @tc.steps: step2. sleep 3 second.
97     */
98    sleep(3);
99
100    /**
101     # @tc.steps: step3. start connect again
102     * @tc.expected: step3. start fail and g_connectManagement is not null and the pktName is same with first start.
103     */
104    StartConnect("", "test_pkt_name_2", true, nullptr);
105    ASSERT_NE(g_connectManagement, nullptr);
106    EXPECT_EQ(g_connectManagement->GetPkgName(), "test_pkt_name");
107}
108
109HdcJdwpSimulator* g_hdcJdwpSimulator = nullptr;
110bool g_threadRunning = false;
111void* HdcConnectRunTest(void* pkgContent)
112{
113    g_threadRunning = true;
114    std::string pkgName = static_cast<ConnectManagement*>(pkgContent)->GetPkgName();
115    std::string processName = static_cast<ConnectManagement*>(pkgContent)->GetProcessName();
116    bool isDebug = static_cast<ConnectManagement*>(pkgContent)->GetDebug();
117    g_hdcJdwpSimulator = new (std::nothrow) HdcJdwpSimulator(processName, pkgName, isDebug, nullptr);
118    if (!g_hdcJdwpSimulator->Connect()) {
119        HILOG_FATAL(LOG_CORE, "Connect fail.");
120        g_threadRunning = false;
121        return nullptr;
122    }
123    g_threadRunning = false;
124    return nullptr;
125}
126
127/**
128 * @tc.name: CastToRegisterTest005
129 * @tc.desc: Test cast to HdcJdwpSimulator.
130 * @tc.type: FUNC
131 */
132HWTEST_F(RegisterTest, CastToRegisterTest005, TestSize.Level1)
133{
134    /**
135     * @tc.steps: step1. new a ConnectManagement and start the connect thread
136     * @tc.expected: step1. connect ok, the thread is runed.
137     */
138    pthread_t tid;
139    g_connectManagement = std::make_unique<ConnectManagement>();
140    g_connectManagement->SetPkgName("test_pkt_name");
141    ASSERT_EQ(
142        pthread_create(&tid, nullptr, &HdcConnectRunTest, static_cast<void*>(g_connectManagement.get())),
143        0) << "pthread_create fail!";
144    sleep(3);
145    EXPECT_TRUE(g_threadRunning);
146
147    /**
148     * @tc.steps: step2. Call  disconnect and delete the  HdcJdwpSimulator
149     * @tc.expected: step2. Disconnect ok, the thread is stopped.
150     */
151    g_hdcJdwpSimulator->Disconnect();
152    sleep(3);
153    delete g_hdcJdwpSimulator;
154    g_hdcJdwpSimulator = nullptr;
155    EXPECT_FALSE(g_threadRunning);
156}
157
158bool g_isCtxPointNull = false;
159void* ConnectJpidTest(void* pkgName)
160{
161    g_threadRunning = true;
162
163    std::string name = (char*)pkgName;
164    g_hdcJdwpSimulator = new (std::nothrow) HdcJdwpSimulator(name, name, true, nullptr);
165    if (!g_hdcJdwpSimulator->Connect()) {
166        HILOG_FATAL(LOG_CORE, "Connect fail.");
167    }
168    g_threadRunning = false;
169    return nullptr;
170}
171
172/**
173 * @tc.name: CastToRegisterTest006
174 * @tc.desc: Test cast to Connect.
175 * @tc.type: FUNC
176 */
177HWTEST_F(RegisterTest, CastToRegisterTest007, TestSize.Level1)
178{
179    /**
180     * @tc.steps: step1. new a ConnectManagement and start the connect thread
181     * @tc.expected: step1. connect ok, the thread is runed.
182     */
183    pthread_t tid;
184    g_hdcJdwpSimulator = nullptr;
185    g_threadRunning = false;
186    string pkgName = "test_pkt_name";
187    ASSERT_EQ(pthread_create(&tid, nullptr, &ConnectJpidTest, (void*)pkgName.c_str()), 0);
188    sleep(3);
189    EXPECT_TRUE(g_threadRunning);
190
191    /**
192     * @tc.steps: step2. Call  disconnect and delete the  HdcJdwpSimulator
193     * @tc.expected: step2. Disconnect ok, the thread is stopped.
194     */
195    g_hdcJdwpSimulator->Disconnect();
196    delete g_hdcJdwpSimulator;
197    g_hdcJdwpSimulator = nullptr;
198    sleep(2);
199
200    /**
201     * @tc.steps: step3. new a HdcJdwpSimulator and start the connect thread
202     * @tc.expected: step3. connect failed
203     */
204    pthread_t tid2;
205    g_hdcJdwpSimulator = nullptr;
206    g_threadRunning = false;
207    g_isCtxPointNull = true;
208    ASSERT_EQ(pthread_create(&tid2, nullptr, &ConnectJpidTest, (void*)pkgName.c_str()), 0);
209    sleep(3);
210
211    g_hdcJdwpSimulator->Disconnect();
212    delete g_hdcJdwpSimulator;
213    g_hdcJdwpSimulator = nullptr;
214}
215} // namespace Hdc
216