19762338dSopenharmony_ci/* 29762338dSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 49762338dSopenharmony_ci * you may not use this file except in compliance with the License. 59762338dSopenharmony_ci * You may obtain a copy of the License at 69762338dSopenharmony_ci * 79762338dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 89762338dSopenharmony_ci * 99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129762338dSopenharmony_ci * See the License for the specific language governing permissions and 139762338dSopenharmony_ci * limitations under the License. 149762338dSopenharmony_ci */ 159762338dSopenharmony_ci 169762338dSopenharmony_ci#include <cstdio> 179762338dSopenharmony_ci#include <cstdlib> 189762338dSopenharmony_ci#include <fcntl.h> 199762338dSopenharmony_ci#include <cerrno> 209762338dSopenharmony_ci#include <unistd.h> 219762338dSopenharmony_ci#include <sys/types.h> 229762338dSopenharmony_ci#include <sys/stat.h> 239762338dSopenharmony_ci#include <sys/mman.h> 249762338dSopenharmony_ci#include <sys/wait.h> 259762338dSopenharmony_ci#include <climits> 269762338dSopenharmony_ci#include <dirent.h> 279762338dSopenharmony_ci#include <string> 289762338dSopenharmony_ci#include "securec.h" 299762338dSopenharmony_ci#include "gtest/gtest.h" 309762338dSopenharmony_ci#include "dmabuf_alloc.h" 319762338dSopenharmony_ci 329762338dSopenharmony_ciusing namespace testing; 339762338dSopenharmony_ciusing namespace testing::ext; 349762338dSopenharmony_ci 359762338dSopenharmony_cinamespace { 369762338dSopenharmony_ciconst int BUFFER_SIZE = 128; 379762338dSopenharmony_ci 389762338dSopenharmony_ciclass DmabufAllocTest : public testing::Test { 399762338dSopenharmony_cipublic: 409762338dSopenharmony_ci static void SetUpTestCase(); 419762338dSopenharmony_ci static void TearDownTestCase(); 429762338dSopenharmony_ci void SetUp(); 439762338dSopenharmony_ci void TearDown(); 449762338dSopenharmony_ci std::string heapName; 459762338dSopenharmony_ci}; 469762338dSopenharmony_ci 479762338dSopenharmony_civoid DmabufAllocTest::SetUpTestCase() 489762338dSopenharmony_ci{ 499762338dSopenharmony_ci} 509762338dSopenharmony_ci 519762338dSopenharmony_civoid DmabufAllocTest::TearDownTestCase() 529762338dSopenharmony_ci{ 539762338dSopenharmony_ci} 549762338dSopenharmony_ci 559762338dSopenharmony_civoid DmabufAllocTest::SetUp() 569762338dSopenharmony_ci{ 579762338dSopenharmony_ci std::string rootDir = "/dev/dma_heap/"; 589762338dSopenharmony_ci DIR *dir = opendir(rootDir.c_str()); 599762338dSopenharmony_ci if (dir == nullptr) { 609762338dSopenharmony_ci return; 619762338dSopenharmony_ci } 629762338dSopenharmony_ci struct dirent *ptr; 639762338dSopenharmony_ci while ((ptr = readdir(dir)) != nullptr) { 649762338dSopenharmony_ci std::string fileName = ptr->d_name; 659762338dSopenharmony_ci std::string::size_type idx = fileName.find("system"); 669762338dSopenharmony_ci if (idx != std::string::npos) { 679762338dSopenharmony_ci heapName = fileName; 689762338dSopenharmony_ci break; 699762338dSopenharmony_ci } 709762338dSopenharmony_ci } 719762338dSopenharmony_ci closedir(dir); 729762338dSopenharmony_ci} 739762338dSopenharmony_ci 749762338dSopenharmony_civoid DmabufAllocTest::TearDown() 759762338dSopenharmony_ci{ 769762338dSopenharmony_ci} 779762338dSopenharmony_ci 789762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, AllocSingleBuffer, TestSize.Level1) 799762338dSopenharmony_ci{ 809762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 819762338dSopenharmony_ci 829762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 839762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 849762338dSopenharmony_ci 859762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = BUFFER_SIZE, .heapFlags = 0 }; 869762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferAlloc(heapFd, &buffer)); 879762338dSopenharmony_ci 889762338dSopenharmony_ci void *ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 899762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 909762338dSopenharmony_ci 919762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 929762338dSopenharmony_ci 939762338dSopenharmony_ci ASSERT_GE(sprintf_s((char *)ptr, BUFFER_SIZE, "libdmabufheap"), 0); 949762338dSopenharmony_ci 959762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 969762338dSopenharmony_ci 979762338dSopenharmony_ci ASSERT_STREQ("libdmabufheap", (char *)ptr); 989762338dSopenharmony_ci 999762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 1009762338dSopenharmony_ci 1019762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 1029762338dSopenharmony_ci 1039762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 1049762338dSopenharmony_ci} 1059762338dSopenharmony_ci 1069762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, ShareBufferBetweenProcess, Function|MediumTest|Level1) 1079762338dSopenharmony_ci{ 1089762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 1099762338dSopenharmony_ci 1109762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 1119762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 1129762338dSopenharmony_ci 1139762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = BUFFER_SIZE, .heapFlags = 0 }; 1149762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferAlloc(heapFd, &buffer)); 1159762338dSopenharmony_ci 1169762338dSopenharmony_ci void *ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 1179762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 1189762338dSopenharmony_ci 1199762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 1209762338dSopenharmony_ci 1219762338dSopenharmony_ci ASSERT_GE(sprintf_s((char *)ptr, BUFFER_SIZE, "parent"), 0); 1229762338dSopenharmony_ci 1239762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 1249762338dSopenharmony_ci 1259762338dSopenharmony_ci pid_t pid = fork(); 1269762338dSopenharmony_ci ASSERT_GE(pid, 0); 1279762338dSopenharmony_ci /* child process */ 1289762338dSopenharmony_ci if (pid == 0) { 1299762338dSopenharmony_ci ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 1309762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 1319762338dSopenharmony_ci 1329762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 1339762338dSopenharmony_ci 1349762338dSopenharmony_ci ASSERT_STREQ("parent", (char *)ptr); 1359762338dSopenharmony_ci 1369762338dSopenharmony_ci ASSERT_GE(sprintf_s((char *)ptr, BUFFER_SIZE, "child"), 0); 1379762338dSopenharmony_ci 1389762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 1399762338dSopenharmony_ci 1409762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 1419762338dSopenharmony_ci 1429762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 1439762338dSopenharmony_ci 1449762338dSopenharmony_ci exit(EXIT_SUCCESS); 1459762338dSopenharmony_ci } 1469762338dSopenharmony_ci /* parent process */ 1479762338dSopenharmony_ci waitpid(pid, nullptr, 0); 1489762338dSopenharmony_ci 1499762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 1509762338dSopenharmony_ci 1519762338dSopenharmony_ci ASSERT_STREQ("child", (char *)ptr); 1529762338dSopenharmony_ci 1539762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 1549762338dSopenharmony_ci 1559762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 1569762338dSopenharmony_ci 1579762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 1589762338dSopenharmony_ci 1599762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 1609762338dSopenharmony_ci} 1619762338dSopenharmony_ci 1629762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, OpenInvalidNameHeap, Function|MediumTest|Level1) 1639762338dSopenharmony_ci{ 1649762338dSopenharmony_ci int i; 1659762338dSopenharmony_ci std::string invalidName = "invalid"; 1669762338dSopenharmony_ci int heapFd = DmabufHeapOpen(invalidName.c_str()); 1679762338dSopenharmony_ci ASSERT_EQ(-EPERM, heapFd); 1689762338dSopenharmony_ci 1699762338dSopenharmony_ci for (i = 0; i < 20; i++) { 1709762338dSopenharmony_ci invalidName += "invalid"; 1719762338dSopenharmony_ci } 1729762338dSopenharmony_ci heapFd = DmabufHeapOpen(invalidName.c_str()); 1739762338dSopenharmony_ci ASSERT_EQ(-EINVAL, heapFd); 1749762338dSopenharmony_ci} 1759762338dSopenharmony_ci 1769762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, AllocInvalidSizeBuffer, Function|MediumTest|Level1) 1779762338dSopenharmony_ci{ 1789762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 1799762338dSopenharmony_ci 1809762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 1819762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 1829762338dSopenharmony_ci 1839762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = 0 }; 1849762338dSopenharmony_ci ASSERT_EQ(-EINVAL, DmabufHeapBufferAlloc(heapFd, &buffer)); 1859762338dSopenharmony_ci 1869762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 1879762338dSopenharmony_ci} 1889762338dSopenharmony_ci 1899762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, BufferSyncWithWrongFd, Function|MediumTest|Level1) 1909762338dSopenharmony_ci{ 1919762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 1929762338dSopenharmony_ci 1939762338dSopenharmony_ci const unsigned int wrongFd = UINT_MAX; 1949762338dSopenharmony_ci 1959762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 1969762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 1979762338dSopenharmony_ci 1989762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = BUFFER_SIZE, .heapFlags = 0 }; 1999762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferAlloc(heapFd, &buffer)); 2009762338dSopenharmony_ci 2019762338dSopenharmony_ci void *ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 2029762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 2039762338dSopenharmony_ci 2049762338dSopenharmony_ci ASSERT_NE(0, DmabufHeapBufferSyncStart(wrongFd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2059762338dSopenharmony_ci 2069762338dSopenharmony_ci ASSERT_NE(0, DmabufHeapBufferSyncEnd(wrongFd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2079762338dSopenharmony_ci 2089762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 2099762338dSopenharmony_ci 2109762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 2119762338dSopenharmony_ci 2129762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 2139762338dSopenharmony_ci} 2149762338dSopenharmony_ci 2159762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, BufferSyncWithWrongSyncType, Function|MediumTest|Level1) 2169762338dSopenharmony_ci{ 2179762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 2189762338dSopenharmony_ci 2199762338dSopenharmony_ci const unsigned int wrongSyncType = UINT_MAX; 2209762338dSopenharmony_ci 2219762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 2229762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 2239762338dSopenharmony_ci 2249762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = BUFFER_SIZE, .heapFlags = 0 }; 2259762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferAlloc(heapFd, &buffer)); 2269762338dSopenharmony_ci 2279762338dSopenharmony_ci void *ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 2289762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 2299762338dSopenharmony_ci 2309762338dSopenharmony_ci ASSERT_NE(0, DmabufHeapBufferSyncEnd(buffer.fd, (DmabufHeapBufferSyncType)wrongSyncType)); 2319762338dSopenharmony_ci 2329762338dSopenharmony_ci ASSERT_NE(0, DmabufHeapBufferSyncStart(buffer.fd, (DmabufHeapBufferSyncType)wrongSyncType)); 2339762338dSopenharmony_ci 2349762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 2359762338dSopenharmony_ci 2369762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 2379762338dSopenharmony_ci 2389762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 2399762338dSopenharmony_ci} 2409762338dSopenharmony_ci 2419762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, SyncBufferTwice, Function|MediumTest|Level1) 2429762338dSopenharmony_ci{ 2439762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 2449762338dSopenharmony_ci 2459762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 2469762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 2479762338dSopenharmony_ci 2489762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = BUFFER_SIZE, .heapFlags = 0 }; 2499762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferAlloc(heapFd, &buffer)); 2509762338dSopenharmony_ci 2519762338dSopenharmony_ci void *ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 2529762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 2539762338dSopenharmony_ci 2549762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2559762338dSopenharmony_ci 2569762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2579762338dSopenharmony_ci 2589762338dSopenharmony_ci ASSERT_GE(sprintf_s((char *)ptr, BUFFER_SIZE, "libdmabufheap"), 0); 2599762338dSopenharmony_ci 2609762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2619762338dSopenharmony_ci 2629762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2639762338dSopenharmony_ci 2649762338dSopenharmony_ci ASSERT_STREQ("libdmabufheap", (char *)ptr); 2659762338dSopenharmony_ci 2669762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 2679762338dSopenharmony_ci 2689762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 2699762338dSopenharmony_ci 2709762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 2719762338dSopenharmony_ci} 2729762338dSopenharmony_ci 2739762338dSopenharmony_ciHWTEST_F(DmabufAllocTest, ExchangeBufferSyncOrder, Function|MediumTest|Level1) 2749762338dSopenharmony_ci{ 2759762338dSopenharmony_ci ASSERT_STRNE(heapName.c_str(), ""); 2769762338dSopenharmony_ci 2779762338dSopenharmony_ci int heapFd = DmabufHeapOpen(heapName.c_str()); 2789762338dSopenharmony_ci ASSERT_GE(heapFd, 0); 2799762338dSopenharmony_ci 2809762338dSopenharmony_ci DmabufHeapBuffer buffer = { .size = BUFFER_SIZE, .heapFlags = 0 }; 2819762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferAlloc(heapFd, &buffer)); 2829762338dSopenharmony_ci 2839762338dSopenharmony_ci void *ptr = mmap(nullptr, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, buffer.fd, 0); 2849762338dSopenharmony_ci ASSERT_TRUE(ptr != nullptr); 2859762338dSopenharmony_ci 2869762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncEnd(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2879762338dSopenharmony_ci 2889762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferSyncStart(buffer.fd, DMA_BUF_HEAP_BUF_SYNC_RW)); 2899762338dSopenharmony_ci 2909762338dSopenharmony_ci ASSERT_EQ(0, munmap(ptr, BUFFER_SIZE)); 2919762338dSopenharmony_ci 2929762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapBufferFree(&buffer)); 2939762338dSopenharmony_ci 2949762338dSopenharmony_ci ASSERT_EQ(0, DmabufHeapClose(heapFd)); 2959762338dSopenharmony_ci} 2969762338dSopenharmony_ci}