/*
* Copyright (c) 2021-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "sample_hdi.h"
#define HDF_LOG_TAG service_manager_test_cpp
namespace OHOS {
using namespace testing::ext;
using OHOS::IRemoteObject;
using OHOS::sptr;
using OHOS::HDI::Base::SharedMemQueue;
using OHOS::HDI::Base::SharedMemQueueMeta;
using OHOS::HDI::Base::SmqType;
using OHOS::HDI::DeviceManager::V1_0::IDeviceManager;
using OHOS::HDI::ServiceManager::V1_0::IServiceManager;
using OHOS::HDI::ServiceManager::V1_0::IServStatListener;
using OHOS::HDI::ServiceManager::V1_0::ServiceStatus;
using OHOS::HDI::ServiceManager::V1_0::ServStatListenerStub;
using OHOS::HDI::DeviceManager::V1_0::HdiDevHostInfo;
using OHOS::HDI::ServiceManager::V1_0::HdiServiceInfo;
static constexpr const char *TEST_SERVICE_NAME = "sample_driver_service";
static constexpr const char *TEST1_SERVICE_NAME = "sample1_driver_service";
static constexpr const char16_t *TEST_SERVICE_INTERFACE_DESC = u"hdf.test.sampele_service";
static constexpr const char *TEST_SERVICE_INTERFACE_DESC_N = "hdf.test.sampele_service";
static constexpr const char *TEST_SERVICE_INTERFACE_DESC_INVALID = "___";
static constexpr const char *TEST_SERVICE_INTERFACE_DESC_VOID = "";
static constexpr const char *TEST_SERVICE_INTERFACE_DESC_NULL = nullptr;
static constexpr int PAYLOAD_NUM = 1234;
static constexpr int SMQ_TEST_QUEUE_SIZE = 10;
static constexpr int SMQ_TEST_WAIT_TIME = 100;
static constexpr int WAIT_LOAD_UNLOAD_TIME = 300;
static constexpr int DEVICE_SERVICE_MANAGER_SA_ID = 5100;
static constexpr int INVALID_CODE = 100;
static constexpr int ERROR_CODE_WITH_INVALID_CODE = 305;
class HdfServiceMangerHdiTest : public testing::Test {
public:
static void SetUpTestCase()
{
(void)TEST_SERVICE_NAME;
(void)TEST1_SERVICE_NAME;
(void)PAYLOAD_NUM;
(void)WAIT_LOAD_UNLOAD_TIME;
(void)TEST_SERVICE_INTERFACE_DESC;
(void)TEST_SERVICE_INTERFACE_DESC_N;
(void)SMQ_TEST_QUEUE_SIZE;
(void)SMQ_TEST_WAIT_TIME;
#ifdef SAMPLE_SHIELD
auto devmgr = IDeviceManager::Get();
if (devmgr != nullptr) {
HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
devmgr->LoadDevice(TEST_SERVICE_NAME);
}
#endif
}
static void TearDownTestCase()
{
#ifdef SAMPLE_SHIELD
auto devmgr = IDeviceManager::Get();
if (devmgr != nullptr) {
HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
devmgr->UnloadDevice(TEST_SERVICE_NAME);
}
#endif
}
void TestServiceListenerStop(const sptr& devmgr, const sptr& servmgr);
void TestSampleService(sptr& sampleService, const sptr& devmgr,
const sptr& servmgr);
void SetUp() {};
void TearDown() {};
};
class IPCObjectStubTest : public OHOS::IPCObjectStub {
public:
explicit IPCObjectStubTest() : OHOS::IPCObjectStub(u"") {};
virtual ~IPCObjectStubTest() = default;
int OnRemoteRequest(
uint32_t code, OHOS::MessageParcel &data, OHOS::MessageParcel &reply, OHOS::MessageOption &option) override
{
HDF_LOGI("IPCObjectStubTest::OnRemoteRequest called, code = %{public}d", code);
payload = data.ReadInt32();
return HDF_SUCCESS;
}
static int32_t payload;
};
int32_t IPCObjectStubTest::payload = 0;
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0100
* @tc.name: ServMgrTest001
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0100, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
}
#ifdef SAMPLE_SHIELD
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0200
* @tc.name: ServMgrTest002
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0200, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
data.WriteCString("sample_service test call");
OHOS::MessageOption option;
int status = sampleService->SendRequest(SAMPLE_SERVICE_PING, data, reply, option);
ASSERT_EQ(status, 0);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0300
* @tc.name: ServMgrTest003
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0300, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
sptr callback = new IPCObjectStubTest();
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
int32_t payload = PAYLOAD_NUM;
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
data.WriteInt32(payload);
data.WriteRemoteObject(callback);
OHOS::MessageOption option;
int status = sampleService->SendRequest(SAMPLE_SERVICE_CALLBACK, data, reply, option);
ASSERT_EQ(status, 0);
ASSERT_EQ(IPCObjectStubTest::payload, payload);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0400
* @tc.name: ServMgrTest004
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0400, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
data.WriteInt32(PAYLOAD_NUM);
data.WriteInt32(PAYLOAD_NUM);
OHOS::MessageOption option;
int status = sampleService->SendRequest(SAMPLE_SERVICE_SUM, data, reply, option);
ASSERT_EQ(status, 0);
int32_t result = reply.ReadInt32();
int32_t expRes = PAYLOAD_NUM + PAYLOAD_NUM;
ASSERT_EQ(result, expRes);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0500
* @tc.name: ServMgrTest006
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0500, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
constexpr int buffersize = 10;
uint8_t dataBuffer[buffersize];
for (int i = 0; i < buffersize; i++) {
dataBuffer[i] = i;
}
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
ret = data.WriteUnpadBuffer(dataBuffer, sizeof(dataBuffer));
ASSERT_TRUE(ret);
OHOS::MessageOption option;
int status = sampleService->SendRequest(SAMPLE_BUFFER_TRANS, data, reply, option);
ASSERT_EQ(status, 0);
const uint8_t *retBuffer = reply.ReadUnpadBuffer(buffersize);
ASSERT_TRUE(retBuffer != nullptr);
for (int i = 0; i < buffersize; i++) {
ASSERT_EQ(retBuffer[i], i);
}
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0600
* @tc.name: Test device manager Load/UnLoad device and driver dynamic register device
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0600, Function | MediumTest | Level1)
{
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
devmgr->UnloadDevice(TEST_SERVICE_NAME);
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService == nullptr);
int ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
const char *newServName = "sample_driver_service2";
ret = data.WriteCString(newServName);
ASSERT_TRUE(ret);
int status = sampleService->SendRequest(SAMPLE_REGISTER_DEVICE, data, reply, option);
ASSERT_EQ(status, HDF_SUCCESS);
auto sampleService2 = servmgr->GetService(newServName);
ASSERT_TRUE(sampleService != nullptr);
data.FlushBuffer();
reply.FlushBuffer();
ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
data.WriteInt32(PAYLOAD_NUM);
data.WriteInt32(PAYLOAD_NUM);
status = sampleService2->SendRequest(SAMPLE_SERVICE_SUM, data, reply, option);
ASSERT_EQ(status, 0);
int32_t result = reply.ReadInt32();
int32_t expRes = PAYLOAD_NUM + PAYLOAD_NUM;
ASSERT_EQ(result, expRes);
sampleService2 = nullptr;
data.FlushBuffer();
reply.FlushBuffer();
ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
data.WriteCString(newServName);
status = sampleService->SendRequest(SAMPLE_UNREGISTER_DEVICE, data, reply, option);
ASSERT_EQ(status, HDF_SUCCESS);
sampleService2 = servmgr->GetService(newServName);
ASSERT_TRUE(sampleService2 == nullptr);
ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService == nullptr);
}
#endif
class ServStatListener : public OHOS::HDI::ServiceManager::V1_0::ServStatListenerStub {
public:
using StatusCallback = std::function;
explicit ServStatListener(StatusCallback callback) : callback_(std::move(callback)) {}
~ServStatListener() = default;
void OnReceive(const ServiceStatus &status) override
{
callback_(status);
}
private:
StatusCallback callback_;
};
#ifdef SAMPLE_SHIELD
/*
* Test service start status listener
*/
void HdfServiceMangerHdiTest::TestServiceListenerStop(const sptr& devmgr,
const sptr& servmgr)
{
std::string servInfo;
uint16_t devClass;
uint16_t servStatus;
bool callbacked = false;
::OHOS::sptr listener
= new ServStatListener(ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback");
if (status.serviceName == std::string(TEST_SERVICE_NAME)) {
servInfo = status.info;
devClass = status.deviceClass;
servStatus = status.status;
callbacked = true;
}
}));
int status = servmgr->RegisterServiceStatusListener(listener, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(status, HDF_SUCCESS);
int ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
constexpr int WAIT_COUNT = 300;
int count = WAIT_COUNT;
while (!callbacked && count > 0) {
OsalMSleep(1);
count--;
}
ASSERT_TRUE(callbacked);
ASSERT_EQ(devClass, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(servInfo, std::string(TEST_SERVICE_NAME));
ASSERT_EQ(servStatus, OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START);
callbacked = false;
ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
count = WAIT_COUNT;
while (!callbacked && count > 0) {
OsalMSleep(1);
count--;
}
ASSERT_TRUE(callbacked);
ASSERT_EQ(devClass, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(servInfo, std::string(TEST_SERVICE_NAME));
ASSERT_EQ(servStatus, OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_STOP);
status = servmgr->UnregisterServiceStatusListener(listener);
ASSERT_EQ(status, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_Pnp_0100
* @tc.name: Test service status listener update service info
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_Pnp_0100, Function | MediumTest | Level1)
{
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
devmgr->UnloadDevice(TEST_SERVICE_NAME);
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService == nullptr);
TestServiceListenerStop(devmgr, servmgr);
}
/*
* Test service status listener update service info
*/
void HdfServiceMangerHdiTest::TestSampleService(sptr& sampleService,
const sptr& devmgr, const sptr& servmgr)
{
std::string servInfo;
uint16_t devClass;
uint16_t servStatus;
bool callbacked = false;
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
if (status.serviceName == std::string(TEST_SERVICE_NAME) &&
status.status == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_CHANGE) {
HDF_LOGI("sample service status callback");
servInfo = status.info;
devClass = status.deviceClass;
servStatus = status.status;
callbacked = true;
}
}));
int status = servmgr->RegisterServiceStatusListener(listener, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(status, HDF_SUCCESS);
constexpr int FIRST_WAIT = 20;
OsalMSleep(FIRST_WAIT); // skip callback on register
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
bool res = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(res, true);
std::string info = "foo";
data.WriteCString(info.data());
callbacked = false;
status = sampleService->SendRequest(SAMPLE_UPDATE_SERVIE, data, reply, option);
ASSERT_EQ(status, HDF_SUCCESS);
constexpr int WAIT_COUNT = 300;
int count = WAIT_COUNT;
while (!callbacked && count > 0) {
OsalMSleep(1);
count--;
}
ASSERT_TRUE(callbacked);
ASSERT_EQ(devClass, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(servInfo, info);
int ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
status = servmgr->UnregisterServiceStatusListener(listener);
ASSERT_EQ(status, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_Pnp_0500
* @tc.name: Test service loadDevice
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_Pnp_0500, Function | MediumTest | Level1)
{
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
devmgr->UnloadDevice(TEST_SERVICE_NAME);
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService == nullptr);
int ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
TestSampleService(sampleService, devmgr, servmgr);
}
/**
* @tc.number: SUB_Driver_Manager_Pnp_0200
* @tc.name: Test service status listener unregister
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_Pnp_0200, Function | MediumTest | Level1)
{
constexpr int SLEEP_TIME = 10;
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
devmgr->UnloadDevice(TEST_SERVICE_NAME);
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService == nullptr);
std::string servInfo;
uint16_t devClass;
uint16_t servStatus;
bool callbacked = false;
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback");
if (status.serviceName == std::string(TEST_SERVICE_NAME) &&
status.status == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) {
servInfo = status.info;
devClass = status.deviceClass;
servStatus = status.status;
callbacked = true;
}
}));
int status = servmgr->RegisterServiceStatusListener(listener, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(status, HDF_SUCCESS);
int ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
constexpr int WAIT_COUNT = 300;
int count = WAIT_COUNT;
while (!callbacked && count > 0) {
OsalMSleep(1);
count--;
}
ASSERT_TRUE(callbacked);
ASSERT_EQ(devClass, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(servInfo, std::string(TEST_SERVICE_NAME));
ASSERT_EQ(servStatus, OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START);
sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
status = servmgr->UnregisterServiceStatusListener(listener);
ASSERT_EQ(status, HDF_SUCCESS);
callbacked = false;
ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
OsalMSleep(SLEEP_TIME);
ASSERT_FALSE(callbacked);
ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_Memory_0100
* @tc.name: smq test normal read/write
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_Memory_0100, Function | MediumTest | Level1)
{
HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__);
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
std::unique_ptr> smq =
std::make_unique>(SMQ_TEST_QUEUE_SIZE, SmqType::SYNCED_SMQ);
ASSERT_TRUE(smq->IsGood());
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
ret = smq->GetMeta()->Marshalling(data);
ASSERT_TRUE(ret);
data.WriteUint32(1);
int status = sampleService->SendRequest(SAMPLE_TRANS_SMQ, data, reply, option);
ASSERT_EQ(status, 0);
constexpr int SEND_TIMES = 20;
for (size_t i = 0; i < SEND_TIMES; i++) {
SampleSmqElement t = {0};
t.data32 = i;
t.data64 = i + 1;
HDF_LOGI("%{public}s:write smq message %{public}zu", __func__, i);
auto status = smq->Write(&t, 1, OHOS::MillisecToNanosec(SMQ_TEST_WAIT_TIME));
ASSERT_EQ(status, 0);
}
}
/**
* @tc.number: SUB_Driver_Manager_Memory_0200
* @tc.name: smq test with overflow wait
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_Memory_0200, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
std::unique_ptr> smq =
std::make_unique>(SMQ_TEST_QUEUE_SIZE, SmqType::SYNCED_SMQ);
ASSERT_TRUE(smq->IsGood());
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
constexpr uint32_t ELEMENT_SIZE = 2;
ret = smq->GetMeta()->Marshalling(data);
ASSERT_TRUE(ret);
data.WriteUint32(ELEMENT_SIZE);
int status = sampleService->SendRequest(SAMPLE_TRANS_SMQ, data, reply, option);
ASSERT_EQ(status, 0);
constexpr int SEND_TIMES = 20;
for (int i = 0; i < SEND_TIMES; i++) {
SampleSmqElement t[ELEMENT_SIZE] = {};
t[0].data32 = i;
t[0].data64 = i + 1;
t[1].data32 = i + 1;
t[1].data64 = i + 1;
HDF_LOGI("%{public}s:write smq message %{public}d", __func__, i);
auto status = smq->Write(&t[0], ELEMENT_SIZE, OHOS::MillisecToNanosec(SMQ_TEST_WAIT_TIME));
ASSERT_EQ(status, 0);
}
}
/**
* @tc.number: SUB_Driver_Manager_Memory_0300
* @tc.name: smq test UNSYNC_SMQ
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_Memory_0300, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
std::unique_ptr> smq =
std::make_unique>(SMQ_TEST_QUEUE_SIZE, SmqType::UNSYNC_SMQ);
ASSERT_TRUE(smq->IsGood());
bool ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
constexpr uint32_t ELEMENT_SIZE = 2;
ret = smq->GetMeta()->Marshalling(data);
ASSERT_TRUE(ret);
data.WriteUint32(ELEMENT_SIZE);
auto status = sampleService->SendRequest(SAMPLE_TRANS_SMQ, data, reply, option);
ASSERT_EQ(status, 0);
SampleSmqElement t[ELEMENT_SIZE] = {};
status = smq->Write(&t[0], ELEMENT_SIZE);
EXPECT_NE(status, 0);
constexpr int SEND_TIMES = 20;
for (int i = 0; i < SEND_TIMES; i++) {
t[0].data32 = i;
t[0].data64 = i + 1;
t[1].data32 = i + 1;
t[1].data64 = i + 1;
HDF_LOGI("%{public}s:write smq message %{public}d", __func__, i);
status = smq->WriteNonBlocking(&t[0], ELEMENT_SIZE);
ASSERT_EQ(status, 0);
}
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0700
* @tc.name: Test service status listener get serviec callback on register
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0700, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_NE(sampleService, nullptr);
bool callbacked = false;
bool sampleServiceStarted = false;
uint16_t servStatus = 0;
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
callbacked = true;
if (status.serviceName == std::string(TEST_SERVICE_NAME)) {
sampleServiceStarted = true;
servStatus = status.status;
}
}));
int status = servmgr->RegisterServiceStatusListener(listener, DEVICE_CLASS_DEFAULT);
ASSERT_EQ(status, HDF_SUCCESS);
constexpr int WAIT_COUNT = 100;
int count = WAIT_COUNT;
while (!sampleServiceStarted && count > 0) {
OsalMSleep(1);
count--;
}
ASSERT_TRUE(callbacked);
ASSERT_TRUE(sampleServiceStarted);
ASSERT_EQ(servStatus, OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START);
status = servmgr->UnregisterServiceStatusListener(listener);
ASSERT_EQ(status, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_InterfaceQuery_0100
* @tc.name: Test get service set by interfacedesc
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_InterfaceQuery_0100, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
std::vector serviceNames;
int ret = servmgr->ListServiceByInterfaceDesc(serviceNames, TEST_SERVICE_INTERFACE_DESC_N);
ASSERT_TRUE(ret == HDF_SUCCESS);
ASSERT_FALSE(serviceNames.empty());
ASSERT_TRUE(serviceNames.front().compare(TEST_SERVICE_NAME) == 0);
}
#endif
/**
* @tc.number: SUB_Driver_Manager_InterfaceQuery_0200
* @tc.name: Test get service set by interfacedesc
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_InterfaceQuery_0200, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
std::vector serviceNames;
int ret = servmgr->ListServiceByInterfaceDesc(serviceNames, TEST_SERVICE_INTERFACE_DESC_INVALID);
ASSERT_TRUE(ret == HDF_SUCCESS);
ASSERT_TRUE(serviceNames.empty());
}
/**
* @tc.number: SUB_Driver_Manager_InterfaceQuery_0300
* @tc.name: Test get service set by interfacedesc
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_InterfaceQuery_0300, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
std::vector serviceNames;
int ret = servmgr->ListServiceByInterfaceDesc(serviceNames, TEST_SERVICE_INTERFACE_DESC_VOID);
ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM);
ASSERT_TRUE(serviceNames.empty());
}
/**
* @tc.number: SUB_Driver_Manager_InterfaceQuery_0400
* @tc.name: Test get service set by interfacedesc
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_InterfaceQuery_0400, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
std::vector serviceNames;
int ret = servmgr->ListServiceByInterfaceDesc(serviceNames, TEST_SERVICE_INTERFACE_DESC_NULL);
ASSERT_TRUE(ret == HDF_ERR_INVALID_PARAM);
ASSERT_TRUE(serviceNames.empty());
}
#ifdef SAMPLE_SHIELD
/**
* @tc.number: SUB_Driver_Manager_InterfaceQuery_0500
* @tc.name: Test get service set by interfacedesc
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_InterfaceQuery_0500, Function | MediumTest | Level1)
{
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
int ret = devmgr->LoadDevice(TEST1_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
OsalMSleep(WAIT_LOAD_UNLOAD_TIME);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
ASSERT_TRUE(sampleService != nullptr);
auto sample1Service = servmgr->GetService(TEST1_SERVICE_NAME);
ASSERT_TRUE(sample1Service != nullptr);
std::vector serviceNames;
ret = servmgr->ListServiceByInterfaceDesc(serviceNames, TEST_SERVICE_INTERFACE_DESC_N);
ASSERT_TRUE(ret == HDF_SUCCESS);
constexpr int sampleServiceCount = 2;
ASSERT_TRUE(serviceNames.size() == sampleServiceCount);
ASSERT_TRUE(serviceNames[0].compare(TEST_SERVICE_NAME) == 0);
ASSERT_TRUE(serviceNames[1].compare(TEST1_SERVICE_NAME) == 0);
ret = devmgr->UnloadDevice(TEST1_SERVICE_NAME);
ASSERT_EQ(ret, HDF_SUCCESS);
}
#endif
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0800
* @tc.name: ListAllServiceTest
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0800, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
std::vector serviceInfos;
int ret = servmgr->ListAllService(serviceInfos);
ASSERT_TRUE(ret == HDF_SUCCESS);
ASSERT_TRUE(serviceInfos.size() != 0);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_0900
* @tc.name: ListAllServiceTest
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_0900, Function | MediumTest | Level1)
{
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
std::vector deviceInfos;
int ret = devmgr->ListAllDevice(deviceInfos);
ASSERT_TRUE(ret == HDF_SUCCESS);
ASSERT_TRUE(deviceInfos.size() != 0);
}
#ifdef SAMPLE_SHIELD
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1000
* @tc.name: EndSampleHostTest
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1000, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
int ret = devmgr->LoadDevice(TEST1_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
auto sample1Service = servmgr->GetService(TEST1_SERVICE_NAME);
constexpr int waitCount = 1000;
constexpr int msleepTime = 10;
constexpr int waitHostStart = 100;
uint32_t cnt = 0;
while (sample1Service == nullptr && cnt < waitCount) {
OsalMSleep(msleepTime);
sample1Service = servmgr->GetService(TEST1_SERVICE_NAME);
cnt++;
}
ASSERT_TRUE(sample1Service != nullptr);
ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
cnt = 0;
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
while (sampleService == nullptr && cnt < waitCount) {
OsalMSleep(msleepTime);
sampleService = servmgr->GetService(TEST_SERVICE_NAME);
cnt++;
}
ASSERT_TRUE(sampleService != nullptr);
ret = devmgr->UnloadDevice(TEST1_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
sample1Service = servmgr->GetService(TEST1_SERVICE_NAME);
OsalMSleep(msleepTime);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
ret = sampleService->SendRequest(SAMPLE_END_HOST, data, reply, option);
ASSERT_TRUE(ret == HDF_SUCCESS);
OsalMSleep(waitHostStart);
ret = devmgr->UnloadDevice(TEST1_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
OsalMSleep(msleepTime);
ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1100
* @tc.name: InjectPmTest
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1100, Function | MediumTest | Level1)
{
auto servmgr = IServiceManager::Get();
ASSERT_TRUE(servmgr != nullptr);
auto devmgr = IDeviceManager::Get();
ASSERT_TRUE(devmgr != nullptr);
int ret = devmgr->LoadDevice(TEST1_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
auto sample1Service = servmgr->GetService(TEST1_SERVICE_NAME);
constexpr int waitCount = 1000;
constexpr int waitHostStart = 100;
constexpr int msleepTime = 10;
uint32_t cnt = 0;
while (sample1Service == nullptr && cnt < waitCount) {
OsalMSleep(msleepTime);
sample1Service = servmgr->GetService(TEST1_SERVICE_NAME);
cnt++;
}
ASSERT_TRUE(sample1Service != nullptr);
ret = devmgr->LoadDevice(TEST_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
auto sampleService = servmgr->GetService(TEST_SERVICE_NAME);
cnt = 0;
while (sampleService == nullptr && cnt < waitCount) {
OsalMSleep(msleepTime);
sampleService = servmgr->GetService(TEST_SERVICE_NAME);
cnt++;
}
ASSERT_TRUE(sampleService != nullptr);
OHOS::MessageParcel data;
OHOS::MessageParcel reply;
OHOS::MessageOption option;
ret = data.WriteInterfaceToken(TEST_SERVICE_INTERFACE_DESC);
ASSERT_EQ(ret, true);
ret = sampleService->SendRequest(SAMPLE_INJECT_PM, data, reply, option);
ASSERT_TRUE(ret == HDF_SUCCESS);
OsalMSleep(msleepTime);
ret = sampleService->SendRequest(SAMPLE_END_HOST, data, reply, option);
ASSERT_TRUE(ret == HDF_SUCCESS);
OsalMSleep(waitHostStart);
ret = devmgr->UnloadDevice(TEST1_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
OsalMSleep(msleepTime);
ret = devmgr->UnloadDevice(TEST_SERVICE_NAME);
ASSERT_TRUE(ret == HDF_SUCCESS);
}
#endif
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1200
* @tc.name: ListenerTest001
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1200, Function | MediumTest | Level1)
{
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
}));
MessageParcel data;
MessageParcel reply;
MessageOption option;
// invalid code
int32_t ret = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_MAX, data, reply, option);
ASSERT_NE(ret, HDF_SUCCESS);
// empty data
ret = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_NOTIFY, data, reply, option);
ASSERT_NE(ret, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1300
* @tc.name: ListenerTest002
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1300, Function | MediumTest | Level1)
{
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
}));
MessageParcel data;
MessageParcel reply;
MessageOption option;
bool ret = data.WriteInterfaceToken(IServStatListener::GetDescriptor());
ASSERT_TRUE(ret);
int32_t reqRet = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_NOTIFY, data, reply, option);
ASSERT_NE(reqRet, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1400
* @tc.name: ListenerTest003
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1400, Function | MediumTest | Level1)
{
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
}));
MessageParcel data;
MessageParcel reply;
MessageOption option;
bool ret = data.WriteInterfaceToken(IServStatListener::GetDescriptor());
ASSERT_TRUE(ret);
ret = data.WriteCString("");
ASSERT_TRUE(ret);
int32_t reqRet = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_NOTIFY, data, reply, option);
ASSERT_NE(reqRet, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1500
* @tc.name: ListenerTest004
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1500, Function | MediumTest | Level1)
{
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
}));
MessageParcel data;
MessageParcel reply;
MessageOption option;
bool ret = data.WriteInterfaceToken(IServStatListener::GetDescriptor());
ASSERT_TRUE(ret);
ret = data.WriteCString("test_service");
ASSERT_TRUE(ret);
int32_t reqRet = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_NOTIFY, data, reply, option);
ASSERT_NE(reqRet, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1600
* @tc.name: ListenerTest005
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1600, Function | MediumTest | Level1)
{
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
}));
MessageParcel data;
MessageParcel reply;
MessageOption option;
bool ret = data.WriteInterfaceToken(IServStatListener::GetDescriptor());
ASSERT_TRUE(ret);
ret = data.WriteCString("test_service");
ASSERT_TRUE(ret);
// write deviceClass
ret = data.WriteUint16(DeviceClass::DEVICE_CLASS_DEFAULT);
ASSERT_TRUE(ret);
int32_t reqRet = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_NOTIFY, data, reply, option);
ASSERT_NE(reqRet, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1700
* @tc.name: ListenerTest006
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1700, Function | MediumTest | Level1)
{
::OHOS::sptr listener
= new ServStatListener(
ServStatListener::StatusCallback([&](const ServiceStatus &status) {
HDF_LOGI("service status callback, service is %{public}s", status.serviceName.data());
}));
MessageParcel data;
MessageParcel reply;
MessageOption option;
bool ret = data.WriteInterfaceToken(IServStatListener::GetDescriptor());
ASSERT_TRUE(ret);
ret = data.WriteCString("test_service");
ASSERT_TRUE(ret);
// write deviceClass
ret = data.WriteUint16(DeviceClass::DEVICE_CLASS_DEFAULT);
ASSERT_TRUE(ret);
// write status
ret = data.WriteUint16(ServiceStatusType::SERVIE_STATUS_START);
ASSERT_TRUE(ret);
int32_t reqRet = listener->OnRemoteRequest(SERVIE_STATUS_LISTENER_NOTIFY, data, reply, option);
ASSERT_EQ(reqRet, HDF_SUCCESS);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1800
* @tc.name: InvalidCodeTest001
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1800, Function | MediumTest | Level1)
{
auto servmgr = OHOS::HDI::ServiceManager::V1_0::IServiceManager::Get();
ASSERT_NE(servmgr, nullptr);
sptr remote = servmgr->GetService("hdf_device_manager");
ASSERT_NE(remote, nullptr);
MessageParcel data;
MessageParcel reply;
MessageOption option;
ASSERT_TRUE(data.WriteInterfaceToken(IDeviceManager::GetDescriptor()));
int ret = remote->SendRequest(INVALID_CODE, data, reply, option);
EXPECT_EQ(ret, ERROR_CODE_WITH_INVALID_CODE);
}
/**
* @tc.number: SUB_Driver_Manager_HdiCC_1900
* @tc.name: InvalidCodeTest002
* @tc.size: Medium
* @tc.level: level 1
*/
HWTEST_F(HdfServiceMangerHdiTest, SUB_Driver_Manager_HdiCC_1900, Function | MediumTest | Level1)
{
auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
ASSERT_NE(saManager, nullptr);
sptr remote = saManager->GetSystemAbility(DEVICE_SERVICE_MANAGER_SA_ID);
ASSERT_NE(remote, nullptr);
MessageParcel data;
MessageParcel reply;
MessageOption option;
ASSERT_TRUE(data.WriteInterfaceToken(OHOS::HDI::ServiceManager::V1_0::IServiceManager::GetDescriptor()));
int ret = remote->SendRequest(INVALID_CODE, data, reply, option);
ASSERT_EQ(ret, ERROR_CODE_WITH_INVALID_CODE);
}
} // namespace OHOS