13f4cbf05Sopenharmony_ci/*
23f4cbf05Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
33f4cbf05Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43f4cbf05Sopenharmony_ci * you may not use this file except in compliance with the License.
53f4cbf05Sopenharmony_ci * You may obtain a copy of the License at
63f4cbf05Sopenharmony_ci *
73f4cbf05Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83f4cbf05Sopenharmony_ci *
93f4cbf05Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103f4cbf05Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113f4cbf05Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123f4cbf05Sopenharmony_ci * See the License for the specific language governing permissions and
133f4cbf05Sopenharmony_ci * limitations under the License.
143f4cbf05Sopenharmony_ci */
153f4cbf05Sopenharmony_ci
163f4cbf05Sopenharmony_ci#include <algorithm>
173f4cbf05Sopenharmony_ci#include <fstream>
183f4cbf05Sopenharmony_ci#include <iostream>
193f4cbf05Sopenharmony_ci#include <unistd.h>
203f4cbf05Sopenharmony_ci#include <sys/mman.h>
213f4cbf05Sopenharmony_ci#include <gtest/gtest.h>
223f4cbf05Sopenharmony_ci#include "directory_ex.h"
233f4cbf05Sopenharmony_ci#include "securec.h"
243f4cbf05Sopenharmony_ci#include "hilog/log.h"
253f4cbf05Sopenharmony_ci#include "parcel.h"
263f4cbf05Sopenharmony_ci#include "refbase.h"
273f4cbf05Sopenharmony_ci#include "ashmem.h"
283f4cbf05Sopenharmony_ci
293f4cbf05Sopenharmony_ciusing namespace testing::ext;
303f4cbf05Sopenharmony_ciusing namespace std;
313f4cbf05Sopenharmony_ci
323f4cbf05Sopenharmony_cinamespace OHOS {
333f4cbf05Sopenharmony_cinamespace {
343f4cbf05Sopenharmony_ciconst int MAX_PARCEL_SIZE = 1000;
353f4cbf05Sopenharmony_cichar g_data[MAX_PARCEL_SIZE];
363f4cbf05Sopenharmony_ciconst int32_t MEMORY_SIZE = 1024;
373f4cbf05Sopenharmony_ciconst std::string MEMORY_CONTENT = "HelloWorld2020\0";
383f4cbf05Sopenharmony_ciconst std::string MEMORY_NAME = "Test SharedMemory\0";
393f4cbf05Sopenharmony_cistatic constexpr HiviewDFX::HiLogLabel label = { LOG_CORE, 0xD003D00, "UtilsAshmemTest" };
403f4cbf05Sopenharmony_ci#define UTILS_LOGF(...) (void)OHOS::HiviewDFX::HiLog::Fatal(label, __VA_ARGS__)
413f4cbf05Sopenharmony_ci#define UTILS_LOGE(...) (void)OHOS::HiviewDFX::HiLog::Error(label, __VA_ARGS__)
423f4cbf05Sopenharmony_ci#define UTILS_LOGW(...) (void)OHOS::HiviewDFX::HiLog::Warn(label, __VA_ARGS__)
433f4cbf05Sopenharmony_ci#define UTILS_LOGI(...) (void)OHOS::HiviewDFX::HiLog::Info(label, __VA_ARGS__)
443f4cbf05Sopenharmony_ci#define UTILS_LOGD(...) (void)OHOS::HiviewDFX::HiLog::Debug(label, __VA_ARGS__)
453f4cbf05Sopenharmony_ci
463f4cbf05Sopenharmony_ciclass UtilsAshmemTest : public testing::Test {
473f4cbf05Sopenharmony_cipublic:
483f4cbf05Sopenharmony_ci    static void TearDownTestCase(void);
493f4cbf05Sopenharmony_ci};
503f4cbf05Sopenharmony_ci
513f4cbf05Sopenharmony_civoid UtilsAshmemTest::TearDownTestCase(void)
523f4cbf05Sopenharmony_ci{
533f4cbf05Sopenharmony_ci    for (int i = 0; i < MAX_PARCEL_SIZE; i++) {
543f4cbf05Sopenharmony_ci        g_data[i] = 0;
553f4cbf05Sopenharmony_ci    }
563f4cbf05Sopenharmony_ci}
573f4cbf05Sopenharmony_ci
583f4cbf05Sopenharmony_ci/**
593f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_WriteAndRead_001
603f4cbf05Sopenharmony_ci * @tc.desc: create and map ashmem
613f4cbf05Sopenharmony_ci * @tc.type: FUNC
623f4cbf05Sopenharmony_ci */
633f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_WriteAndRead_001, TestSize.Level0)
643f4cbf05Sopenharmony_ci{
653f4cbf05Sopenharmony_ci    UTILS_LOGI("test_ashmem_WriteAndRead_001");
663f4cbf05Sopenharmony_ci
673f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
683f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
693f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem->GetAshmemSize() == MEMORY_SIZE);
703f4cbf05Sopenharmony_ci
713f4cbf05Sopenharmony_ci    bool ret = ashmem->MapAshmem(PROT_READ | PROT_WRITE);
723f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
733f4cbf05Sopenharmony_ci
743f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
753f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
763f4cbf05Sopenharmony_ci}
773f4cbf05Sopenharmony_ci
783f4cbf05Sopenharmony_ci/**
793f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_WriteAndRead_002
803f4cbf05Sopenharmony_ci * @tc.desc: write to and read from ashmem
813f4cbf05Sopenharmony_ci * @tc.type: FUNC
823f4cbf05Sopenharmony_ci */
833f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_WriteAndRead_002, TestSize.Level0)
843f4cbf05Sopenharmony_ci{
853f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
863f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
873f4cbf05Sopenharmony_ci
883f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
893f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
903f4cbf05Sopenharmony_ci
913f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
923f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
933f4cbf05Sopenharmony_ci
943f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), sizeof(MEMORY_CONTENT));
953f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
963f4cbf05Sopenharmony_ci
973f4cbf05Sopenharmony_ci    auto readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), 0);
983f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData != nullptr);
993f4cbf05Sopenharmony_ci
1003f4cbf05Sopenharmony_ci    const char *readContent = reinterpret_cast<const char *>(readData);
1013f4cbf05Sopenharmony_ci    EXPECT_EQ(memcmp(MEMORY_CONTENT.c_str(), readContent, sizeof(MEMORY_CONTENT)), 0);
1023f4cbf05Sopenharmony_ci
1033f4cbf05Sopenharmony_ci    readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), sizeof(MEMORY_CONTENT));
1043f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData != nullptr);
1053f4cbf05Sopenharmony_ci
1063f4cbf05Sopenharmony_ci    readContent = reinterpret_cast<const char *>(readData);
1073f4cbf05Sopenharmony_ci    EXPECT_EQ(memcmp(MEMORY_CONTENT.c_str(), readContent, sizeof(MEMORY_CONTENT)), 0);
1083f4cbf05Sopenharmony_ci
1093f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
1103f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
1113f4cbf05Sopenharmony_ci}
1123f4cbf05Sopenharmony_ci
1133f4cbf05Sopenharmony_ci/**
1143f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_WriteAndRead_003
1153f4cbf05Sopenharmony_ci * @tc.desc: test read-only ashmem
1163f4cbf05Sopenharmony_ci * @tc.type: FUNC
1173f4cbf05Sopenharmony_ci */
1183f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_WriteAndRead_003, TestSize.Level0)
1193f4cbf05Sopenharmony_ci{
1203f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
1213f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
1223f4cbf05Sopenharmony_ci
1233f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
1243f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1253f4cbf05Sopenharmony_ci
1263f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
1273f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1283f4cbf05Sopenharmony_ci
1293f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
1303f4cbf05Sopenharmony_ci
1313f4cbf05Sopenharmony_ci    ret = ashmem->MapReadOnlyAshmem();
1323f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1333f4cbf05Sopenharmony_ci
1343f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), sizeof(MEMORY_CONTENT));
1353f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
1363f4cbf05Sopenharmony_ci
1373f4cbf05Sopenharmony_ci    auto readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), 0);
1383f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData != nullptr);
1393f4cbf05Sopenharmony_ci
1403f4cbf05Sopenharmony_ci    const char *readContent = reinterpret_cast<const char *>(readData);
1413f4cbf05Sopenharmony_ci    EXPECT_EQ(memcmp(MEMORY_CONTENT.c_str(), readContent, sizeof(MEMORY_CONTENT)), 0);
1423f4cbf05Sopenharmony_ci
1433f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
1443f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
1453f4cbf05Sopenharmony_ci}
1463f4cbf05Sopenharmony_ci
1473f4cbf05Sopenharmony_ci/**
1483f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_WriteAndRead_004
1493f4cbf05Sopenharmony_ci * @tc.desc: set read-only protection and map again
1503f4cbf05Sopenharmony_ci * @tc.type: FUNC
1513f4cbf05Sopenharmony_ci */
1523f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_WriteAndRead_004, TestSize.Level0)
1533f4cbf05Sopenharmony_ci{
1543f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
1553f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
1563f4cbf05Sopenharmony_ci
1573f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
1583f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1593f4cbf05Sopenharmony_ci
1603f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
1613f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1623f4cbf05Sopenharmony_ci
1633f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
1643f4cbf05Sopenharmony_ci
1653f4cbf05Sopenharmony_ci    ret = ashmem->SetProtection(PROT_READ);
1663f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1673f4cbf05Sopenharmony_ci
1683f4cbf05Sopenharmony_ci    ret = ashmem->MapReadAndWriteAshmem();
1693f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
1703f4cbf05Sopenharmony_ci
1713f4cbf05Sopenharmony_ci    ret = ashmem->MapReadOnlyAshmem();
1723f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1733f4cbf05Sopenharmony_ci
1743f4cbf05Sopenharmony_ci    auto readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), 0);
1753f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData != nullptr);
1763f4cbf05Sopenharmony_ci
1773f4cbf05Sopenharmony_ci    const char *readContent = reinterpret_cast<const char *>(readData);
1783f4cbf05Sopenharmony_ci    EXPECT_EQ(memcmp(MEMORY_CONTENT.c_str(), readContent, sizeof(MEMORY_CONTENT)), 0);
1793f4cbf05Sopenharmony_ci
1803f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
1813f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
1823f4cbf05Sopenharmony_ci}
1833f4cbf05Sopenharmony_ci
1843f4cbf05Sopenharmony_ci/**
1853f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_WriteAndRead_005
1863f4cbf05Sopenharmony_ci * @tc.desc: set read-only protection without mapping again
1873f4cbf05Sopenharmony_ci * @tc.type: FUNC
1883f4cbf05Sopenharmony_ci */
1893f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_WriteAndRead_005, TestSize.Level0)
1903f4cbf05Sopenharmony_ci{
1913f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
1923f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
1933f4cbf05Sopenharmony_ci
1943f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
1953f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1963f4cbf05Sopenharmony_ci
1973f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
1983f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
1993f4cbf05Sopenharmony_ci
2003f4cbf05Sopenharmony_ci    ret = ashmem->SetProtection(PROT_READ);
2013f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
2023f4cbf05Sopenharmony_ci
2033f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
2043f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
2053f4cbf05Sopenharmony_ci
2063f4cbf05Sopenharmony_ci    auto readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), 0);
2073f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData != nullptr);
2083f4cbf05Sopenharmony_ci
2093f4cbf05Sopenharmony_ci    const char *readContent = reinterpret_cast<const char *>(readData);
2103f4cbf05Sopenharmony_ci    EXPECT_EQ(memcmp(MEMORY_CONTENT.c_str(), readContent, sizeof(MEMORY_CONTENT)), 0);
2113f4cbf05Sopenharmony_ci
2123f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
2133f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
2143f4cbf05Sopenharmony_ci}
2153f4cbf05Sopenharmony_ci
2163f4cbf05Sopenharmony_ci/**
2173f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_InvalidOperation_001
2183f4cbf05Sopenharmony_ci * @tc.desc: create invalid-size ashmem or set invalid protection type
2193f4cbf05Sopenharmony_ci * @tc.type: FUNC
2203f4cbf05Sopenharmony_ci */
2213f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_InvalidOperation_001, TestSize.Level0)
2223f4cbf05Sopenharmony_ci{
2233f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), -1);
2243f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem == nullptr);
2253f4cbf05Sopenharmony_ci
2263f4cbf05Sopenharmony_ci    ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
2273f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
2283f4cbf05Sopenharmony_ci
2293f4cbf05Sopenharmony_ci    bool ret = ashmem->SetProtection(-1);
2303f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
2313f4cbf05Sopenharmony_ci
2323f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
2333f4cbf05Sopenharmony_ci}
2343f4cbf05Sopenharmony_ci
2353f4cbf05Sopenharmony_ci/**
2363f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_InvalidOperation_002
2373f4cbf05Sopenharmony_ci * @tc.desc: map after closing ashmem
2383f4cbf05Sopenharmony_ci * @tc.type: FUNC
2393f4cbf05Sopenharmony_ci */
2403f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_InvalidOperation_002, TestSize.Level0)
2413f4cbf05Sopenharmony_ci{
2423f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
2433f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
2443f4cbf05Sopenharmony_ci
2453f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
2463f4cbf05Sopenharmony_ci
2473f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
2483f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
2493f4cbf05Sopenharmony_ci}
2503f4cbf05Sopenharmony_ci
2513f4cbf05Sopenharmony_ci/**
2523f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_InvalidOperation_003
2533f4cbf05Sopenharmony_ci * @tc.desc: write or read after closing ashmem
2543f4cbf05Sopenharmony_ci * @tc.type: FUNC
2553f4cbf05Sopenharmony_ci */
2563f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_InvalidOperation_003, TestSize.Level0)
2573f4cbf05Sopenharmony_ci{
2583f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
2593f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
2603f4cbf05Sopenharmony_ci
2613f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
2623f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
2633f4cbf05Sopenharmony_ci
2643f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
2653f4cbf05Sopenharmony_ci
2663f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
2673f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
2683f4cbf05Sopenharmony_ci
2693f4cbf05Sopenharmony_ci    auto readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), 0);
2703f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData == nullptr);
2713f4cbf05Sopenharmony_ci}
2723f4cbf05Sopenharmony_ci
2733f4cbf05Sopenharmony_ci/**
2743f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_InvalidOperation_004
2753f4cbf05Sopenharmony_ci * @tc.desc: write or read after unmapping ashmem
2763f4cbf05Sopenharmony_ci * @tc.type: FUNC
2773f4cbf05Sopenharmony_ci */
2783f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_InvalidOperation_004, TestSize.Level0)
2793f4cbf05Sopenharmony_ci{
2803f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
2813f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
2823f4cbf05Sopenharmony_ci
2833f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
2843f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
2853f4cbf05Sopenharmony_ci
2863f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
2873f4cbf05Sopenharmony_ci
2883f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), 0);
2893f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
2903f4cbf05Sopenharmony_ci
2913f4cbf05Sopenharmony_ci    auto readData = ashmem->ReadFromAshmem(sizeof(MEMORY_CONTENT), 0);
2923f4cbf05Sopenharmony_ci    ASSERT_TRUE(readData == nullptr);
2933f4cbf05Sopenharmony_ci
2943f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
2953f4cbf05Sopenharmony_ci}
2963f4cbf05Sopenharmony_ci
2973f4cbf05Sopenharmony_ci/**
2983f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_InvalidOperation_005
2993f4cbf05Sopenharmony_ci * @tc.desc: expand protection type
3003f4cbf05Sopenharmony_ci * @tc.type: FUNC
3013f4cbf05Sopenharmony_ci */
3023f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_InvalidOperation_005, TestSize.Level0)
3033f4cbf05Sopenharmony_ci{
3043f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
3053f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
3063f4cbf05Sopenharmony_ci
3073f4cbf05Sopenharmony_ci    bool ret = ashmem->SetProtection(PROT_WRITE);
3083f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
3093f4cbf05Sopenharmony_ci
3103f4cbf05Sopenharmony_ci    ret = ashmem->SetProtection(PROT_READ);
3113f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
3123f4cbf05Sopenharmony_ci
3133f4cbf05Sopenharmony_ci    ret = ashmem->SetProtection(PROT_READ | PROT_WRITE);
3143f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
3153f4cbf05Sopenharmony_ci
3163f4cbf05Sopenharmony_ci    ret = ashmem->SetProtection(PROT_NONE);
3173f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
3183f4cbf05Sopenharmony_ci
3193f4cbf05Sopenharmony_ci    ret = ashmem->SetProtection(PROT_READ);
3203f4cbf05Sopenharmony_ci    ASSERT_FALSE(ret);
3213f4cbf05Sopenharmony_ci
3223f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
3233f4cbf05Sopenharmony_ci}
3243f4cbf05Sopenharmony_ci
3253f4cbf05Sopenharmony_ci/**
3263f4cbf05Sopenharmony_ci * @tc.name: test_ashmem_InvalidOperation_006
3273f4cbf05Sopenharmony_ci * @tc.desc: test invalid input or test invalid operation
3283f4cbf05Sopenharmony_ci * @tc.type: FUNC
3293f4cbf05Sopenharmony_ci */
3303f4cbf05Sopenharmony_ciHWTEST_F(UtilsAshmemTest, test_ashmem_InvalidOperation_006, TestSize.Level0)
3313f4cbf05Sopenharmony_ci{
3323f4cbf05Sopenharmony_ci    sptr<Ashmem> ashmem = Ashmem::CreateAshmem(MEMORY_NAME.c_str(), MEMORY_SIZE);
3333f4cbf05Sopenharmony_ci    ASSERT_TRUE(ashmem != nullptr);
3343f4cbf05Sopenharmony_ci
3353f4cbf05Sopenharmony_ci    bool ret = ashmem->MapReadAndWriteAshmem();
3363f4cbf05Sopenharmony_ci    ASSERT_TRUE(ret);
3373f4cbf05Sopenharmony_ci
3383f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(nullptr, sizeof(MEMORY_CONTENT), 0);
3393f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3403f4cbf05Sopenharmony_ci
3413f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), MEMORY_SIZE+1);
3423f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3433f4cbf05Sopenharmony_ci
3443f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), -1);
3453f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3463f4cbf05Sopenharmony_ci
3473f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), MEMORY_SIZE+1, 0);
3483f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3493f4cbf05Sopenharmony_ci
3503f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), -1, 0);
3513f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3523f4cbf05Sopenharmony_ci
3533f4cbf05Sopenharmony_ci    ret = ashmem->WriteToAshmem(MEMORY_CONTENT.c_str(), sizeof(MEMORY_CONTENT), MEMORY_SIZE);
3543f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3553f4cbf05Sopenharmony_ci
3563f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
3573f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
3583f4cbf05Sopenharmony_ci
3593f4cbf05Sopenharmony_ci    ashmem->GetAshmemSize();
3603f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3613f4cbf05Sopenharmony_ci
3623f4cbf05Sopenharmony_ci    ashmem->GetProtection();
3633f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3643f4cbf05Sopenharmony_ci
3653f4cbf05Sopenharmony_ci    ashmem->UnmapAshmem();
3663f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3673f4cbf05Sopenharmony_ci
3683f4cbf05Sopenharmony_ci    ashmem->CloseAshmem();
3693f4cbf05Sopenharmony_ci    EXPECT_FALSE(ret);
3703f4cbf05Sopenharmony_ci}
3713f4cbf05Sopenharmony_ci}  // namespace
3723f4cbf05Sopenharmony_ci}  // namespace OHOS