1cc290419Sopenharmony_ci/*
2cc290419Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3cc290419Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4cc290419Sopenharmony_ci * you may not use this file except in compliance with the License.
5cc290419Sopenharmony_ci * You may obtain a copy of the License at
6cc290419Sopenharmony_ci *
7cc290419Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8cc290419Sopenharmony_ci *
9cc290419Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10cc290419Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11cc290419Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cc290419Sopenharmony_ci * See the License for the specific language governing permissions and
13cc290419Sopenharmony_ci * limitations under the License.
14cc290419Sopenharmony_ci *
15cc290419Sopenharmony_ci */
16cc290419Sopenharmony_ci
17cc290419Sopenharmony_ci#include <memory>
18cc290419Sopenharmony_ci#include <string>
19cc290419Sopenharmony_ci
20cc290419Sopenharmony_ci#include "gtest/gtest.h"
21cc290419Sopenharmony_ci
22cc290419Sopenharmony_ci#define private public
23cc290419Sopenharmony_ci#define protected public
24cc290419Sopenharmony_ci#include "define_register.h"
25cc290419Sopenharmony_ci#include "hdc_connect.h"
26cc290419Sopenharmony_ci#include "hdc_jdwp.h"
27cc290419Sopenharmony_ci#undef private
28cc290419Sopenharmony_ci#undef protected
29cc290419Sopenharmony_ci
30cc290419Sopenharmony_ciusing namespace testing;
31cc290419Sopenharmony_ciusing namespace testing::ext;
32cc290419Sopenharmony_ci
33cc290419Sopenharmony_cinamespace Hdc {
34cc290419Sopenharmony_ciextern std::unique_ptr<ConnectManagement> g_connectManagement;
35cc290419Sopenharmony_ciclass RegisterTest : public testing::Test {};
36cc290419Sopenharmony_ci
37cc290419Sopenharmony_ci/**
38cc290419Sopenharmony_ci * @tc.name: CastToRegisterTest001
39cc290419Sopenharmony_ci * @tc.desc: Test cast to register.
40cc290419Sopenharmony_ci * @tc.type: FUNC
41cc290419Sopenharmony_ci */
42cc290419Sopenharmony_ciHWTEST_F(RegisterTest, CastToRegisterTest001, TestSize.Level1)
43cc290419Sopenharmony_ci{
44cc290419Sopenharmony_ci    /**
45cc290419Sopenharmony_ci     * @tc.steps: step1. stop connect before start.
46cc290419Sopenharmony_ci     * @tc.expected: step1. g_connectManagement is null.
47cc290419Sopenharmony_ci     */
48cc290419Sopenharmony_ci    StopConnect();
49cc290419Sopenharmony_ci    EXPECT_EQ(g_connectManagement, nullptr);
50cc290419Sopenharmony_ci}
51cc290419Sopenharmony_ci
52cc290419Sopenharmony_ci/**
53cc290419Sopenharmony_ci * @tc.name: CastToRegisterTest002
54cc290419Sopenharmony_ci * @tc.desc: Test cast to register.
55cc290419Sopenharmony_ci * @tc.type: FUNC
56cc290419Sopenharmony_ci */
57cc290419Sopenharmony_ciHWTEST_F(RegisterTest, CastToRegisterTest002, TestSize.Level1)
58cc290419Sopenharmony_ci{
59cc290419Sopenharmony_ci    /**
60cc290419Sopenharmony_ci     * @tc.steps: step1. start connect.
61cc290419Sopenharmony_ci     * @tc.expected: step1. g_connectManagement is not null and the pktName is right.
62cc290419Sopenharmony_ci     */
63cc290419Sopenharmony_ci    StartConnect("", "test_pkt_name", true, nullptr);
64cc290419Sopenharmony_ci    ASSERT_NE(g_connectManagement, nullptr);
65cc290419Sopenharmony_ci    EXPECT_EQ(g_connectManagement->GetPkgName(), "test_pkt_name");
66cc290419Sopenharmony_ci
67cc290419Sopenharmony_ci    /**
68cc290419Sopenharmony_ci     * @tc.steps: step2. sleep 3 second.
69cc290419Sopenharmony_ci     */
70cc290419Sopenharmony_ci    sleep(3);
71cc290419Sopenharmony_ci
72cc290419Sopenharmony_ci    /**
73cc290419Sopenharmony_ci     # @tc.steps: step3. stop connect.
74cc290419Sopenharmony_ci     * @tc.expected: step3. g_connectManagement is not null
75cc290419Sopenharmony_ci     */
76cc290419Sopenharmony_ci    StopConnect();
77cc290419Sopenharmony_ci    ASSERT_NE(g_connectManagement, nullptr);
78cc290419Sopenharmony_ci}
79cc290419Sopenharmony_ci
80cc290419Sopenharmony_ci/**
81cc290419Sopenharmony_ci * @tc.name: CastToRegisterTest003
82cc290419Sopenharmony_ci * @tc.desc: Test cast to register.
83cc290419Sopenharmony_ci * @tc.type: FUNC
84cc290419Sopenharmony_ci */
85cc290419Sopenharmony_ciHWTEST_F(RegisterTest, CastToRegisterTest003, TestSize.Level1)
86cc290419Sopenharmony_ci{
87cc290419Sopenharmony_ci    /**
88cc290419Sopenharmony_ci     * @tc.steps: step1. start connect.
89cc290419Sopenharmony_ci     * @tc.expected: step1. g_connectManagement is not null and the pktName is right.
90cc290419Sopenharmony_ci     */
91cc290419Sopenharmony_ci    StartConnect("", "test_pkt_name", true, nullptr);
92cc290419Sopenharmony_ci    ASSERT_NE(g_connectManagement, nullptr);
93cc290419Sopenharmony_ci    EXPECT_EQ(g_connectManagement->GetPkgName(), "test_pkt_name");
94cc290419Sopenharmony_ci
95cc290419Sopenharmony_ci    /**
96cc290419Sopenharmony_ci     * @tc.steps: step2. sleep 3 second.
97cc290419Sopenharmony_ci     */
98cc290419Sopenharmony_ci    sleep(3);
99cc290419Sopenharmony_ci
100cc290419Sopenharmony_ci    /**
101cc290419Sopenharmony_ci     # @tc.steps: step3. start connect again
102cc290419Sopenharmony_ci     * @tc.expected: step3. start fail and g_connectManagement is not null and the pktName is same with first start.
103cc290419Sopenharmony_ci     */
104cc290419Sopenharmony_ci    StartConnect("", "test_pkt_name_2", true, nullptr);
105cc290419Sopenharmony_ci    ASSERT_NE(g_connectManagement, nullptr);
106cc290419Sopenharmony_ci    EXPECT_EQ(g_connectManagement->GetPkgName(), "test_pkt_name");
107cc290419Sopenharmony_ci}
108cc290419Sopenharmony_ci
109cc290419Sopenharmony_ciHdcJdwpSimulator* g_hdcJdwpSimulator = nullptr;
110cc290419Sopenharmony_cibool g_threadRunning = false;
111cc290419Sopenharmony_civoid* HdcConnectRunTest(void* pkgContent)
112cc290419Sopenharmony_ci{
113cc290419Sopenharmony_ci    g_threadRunning = true;
114cc290419Sopenharmony_ci    std::string pkgName = static_cast<ConnectManagement*>(pkgContent)->GetPkgName();
115cc290419Sopenharmony_ci    std::string processName = static_cast<ConnectManagement*>(pkgContent)->GetProcessName();
116cc290419Sopenharmony_ci    bool isDebug = static_cast<ConnectManagement*>(pkgContent)->GetDebug();
117cc290419Sopenharmony_ci    g_hdcJdwpSimulator = new (std::nothrow) HdcJdwpSimulator(processName, pkgName, isDebug, nullptr);
118cc290419Sopenharmony_ci    if (!g_hdcJdwpSimulator->Connect()) {
119cc290419Sopenharmony_ci        HILOG_FATAL(LOG_CORE, "Connect fail.");
120cc290419Sopenharmony_ci        g_threadRunning = false;
121cc290419Sopenharmony_ci        return nullptr;
122cc290419Sopenharmony_ci    }
123cc290419Sopenharmony_ci    g_threadRunning = false;
124cc290419Sopenharmony_ci    return nullptr;
125cc290419Sopenharmony_ci}
126cc290419Sopenharmony_ci
127cc290419Sopenharmony_ci/**
128cc290419Sopenharmony_ci * @tc.name: CastToRegisterTest005
129cc290419Sopenharmony_ci * @tc.desc: Test cast to HdcJdwpSimulator.
130cc290419Sopenharmony_ci * @tc.type: FUNC
131cc290419Sopenharmony_ci */
132cc290419Sopenharmony_ciHWTEST_F(RegisterTest, CastToRegisterTest005, TestSize.Level1)
133cc290419Sopenharmony_ci{
134cc290419Sopenharmony_ci    /**
135cc290419Sopenharmony_ci     * @tc.steps: step1. new a ConnectManagement and start the connect thread
136cc290419Sopenharmony_ci     * @tc.expected: step1. connect ok, the thread is runed.
137cc290419Sopenharmony_ci     */
138cc290419Sopenharmony_ci    pthread_t tid;
139cc290419Sopenharmony_ci    g_connectManagement = std::make_unique<ConnectManagement>();
140cc290419Sopenharmony_ci    g_connectManagement->SetPkgName("test_pkt_name");
141cc290419Sopenharmony_ci    ASSERT_EQ(
142cc290419Sopenharmony_ci        pthread_create(&tid, nullptr, &HdcConnectRunTest, static_cast<void*>(g_connectManagement.get())),
143cc290419Sopenharmony_ci        0) << "pthread_create fail!";
144cc290419Sopenharmony_ci    sleep(3);
145cc290419Sopenharmony_ci    EXPECT_TRUE(g_threadRunning);
146cc290419Sopenharmony_ci
147cc290419Sopenharmony_ci    /**
148cc290419Sopenharmony_ci     * @tc.steps: step2. Call  disconnect and delete the  HdcJdwpSimulator
149cc290419Sopenharmony_ci     * @tc.expected: step2. Disconnect ok, the thread is stopped.
150cc290419Sopenharmony_ci     */
151cc290419Sopenharmony_ci    g_hdcJdwpSimulator->Disconnect();
152cc290419Sopenharmony_ci    sleep(3);
153cc290419Sopenharmony_ci    delete g_hdcJdwpSimulator;
154cc290419Sopenharmony_ci    g_hdcJdwpSimulator = nullptr;
155cc290419Sopenharmony_ci    EXPECT_FALSE(g_threadRunning);
156cc290419Sopenharmony_ci}
157cc290419Sopenharmony_ci
158cc290419Sopenharmony_cibool g_isCtxPointNull = false;
159cc290419Sopenharmony_civoid* ConnectJpidTest(void* pkgName)
160cc290419Sopenharmony_ci{
161cc290419Sopenharmony_ci    g_threadRunning = true;
162cc290419Sopenharmony_ci
163cc290419Sopenharmony_ci    std::string name = (char*)pkgName;
164cc290419Sopenharmony_ci    g_hdcJdwpSimulator = new (std::nothrow) HdcJdwpSimulator(name, name, true, nullptr);
165cc290419Sopenharmony_ci    if (!g_hdcJdwpSimulator->Connect()) {
166cc290419Sopenharmony_ci        HILOG_FATAL(LOG_CORE, "Connect fail.");
167cc290419Sopenharmony_ci    }
168cc290419Sopenharmony_ci    g_threadRunning = false;
169cc290419Sopenharmony_ci    return nullptr;
170cc290419Sopenharmony_ci}
171cc290419Sopenharmony_ci
172cc290419Sopenharmony_ci/**
173cc290419Sopenharmony_ci * @tc.name: CastToRegisterTest006
174cc290419Sopenharmony_ci * @tc.desc: Test cast to Connect.
175cc290419Sopenharmony_ci * @tc.type: FUNC
176cc290419Sopenharmony_ci */
177cc290419Sopenharmony_ciHWTEST_F(RegisterTest, CastToRegisterTest007, TestSize.Level1)
178cc290419Sopenharmony_ci{
179cc290419Sopenharmony_ci    /**
180cc290419Sopenharmony_ci     * @tc.steps: step1. new a ConnectManagement and start the connect thread
181cc290419Sopenharmony_ci     * @tc.expected: step1. connect ok, the thread is runed.
182cc290419Sopenharmony_ci     */
183cc290419Sopenharmony_ci    pthread_t tid;
184cc290419Sopenharmony_ci    g_hdcJdwpSimulator = nullptr;
185cc290419Sopenharmony_ci    g_threadRunning = false;
186cc290419Sopenharmony_ci    string pkgName = "test_pkt_name";
187cc290419Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, &ConnectJpidTest, (void*)pkgName.c_str()), 0);
188cc290419Sopenharmony_ci    sleep(3);
189cc290419Sopenharmony_ci    EXPECT_TRUE(g_threadRunning);
190cc290419Sopenharmony_ci
191cc290419Sopenharmony_ci    /**
192cc290419Sopenharmony_ci     * @tc.steps: step2. Call  disconnect and delete the  HdcJdwpSimulator
193cc290419Sopenharmony_ci     * @tc.expected: step2. Disconnect ok, the thread is stopped.
194cc290419Sopenharmony_ci     */
195cc290419Sopenharmony_ci    g_hdcJdwpSimulator->Disconnect();
196cc290419Sopenharmony_ci    delete g_hdcJdwpSimulator;
197cc290419Sopenharmony_ci    g_hdcJdwpSimulator = nullptr;
198cc290419Sopenharmony_ci    sleep(2);
199cc290419Sopenharmony_ci
200cc290419Sopenharmony_ci    /**
201cc290419Sopenharmony_ci     * @tc.steps: step3. new a HdcJdwpSimulator and start the connect thread
202cc290419Sopenharmony_ci     * @tc.expected: step3. connect failed
203cc290419Sopenharmony_ci     */
204cc290419Sopenharmony_ci    pthread_t tid2;
205cc290419Sopenharmony_ci    g_hdcJdwpSimulator = nullptr;
206cc290419Sopenharmony_ci    g_threadRunning = false;
207cc290419Sopenharmony_ci    g_isCtxPointNull = true;
208cc290419Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid2, nullptr, &ConnectJpidTest, (void*)pkgName.c_str()), 0);
209cc290419Sopenharmony_ci    sleep(3);
210cc290419Sopenharmony_ci
211cc290419Sopenharmony_ci    g_hdcJdwpSimulator->Disconnect();
212cc290419Sopenharmony_ci    delete g_hdcJdwpSimulator;
213cc290419Sopenharmony_ci    g_hdcJdwpSimulator = nullptr;
214cc290419Sopenharmony_ci}
215cc290419Sopenharmony_ci} // namespace Hdc
216