1 /* 2 * Copyright (c) 2021 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 #include <sys/types.h> 17 #include <sys/stat.h> 18 #include <sys/resource.h> 19 #include <unistd.h> 20 #include <fcntl.h> 21 #include <gtest/gtest.h> 22 #include "log.h" 23 #include "utils.h" 24 #include "KernelConstants.h" 25 #include <securec.h> 26 27 using namespace testing::ext; 28 29 #define FIFO_PATH "/dev/xtsTestFifo" 30 31 class FifoTest : public::testing::Test { 32 protected: SetUp()33 void SetUp() 34 { 35 remove(FIFO_PATH); 36 } TearDown()37 void TearDown() 38 { 39 remove(FIFO_PATH); 40 } 41 }; 42 43 /** 44 * @tc.number SUB_KERNEL_IPC_FIFO_0100 45 * @tc.name basic function test : hello world 46 * @tc.desc [C- SOFTWARE -0200] 47 */ 48 HWTEST_F(FifoTest, testHelloWorld, Function | MediumTest | Level0) 49 { 50 char buffer[80]; 51 int fd; 52 char sentence[] = "Hello World"; 53 54 pid_t pid = fork(); 55 ASSERT_TRUE(pid >= 0) << "> parent: fork : error"; 56 if (pid == 0) { 57 Msleep(20); 58 fd = open(FIFO_PATH, O_WRONLY, S_IRUSR|S_IWUSR); 59 write(fd, sentence, sizeof(sentence)); 60 LOG("> child: write: %s", sentence); 61 close(fd); 62 exit(0); 63 } 64 // parent 65 int ret = mkfifo(FIFO_PATH, 0666); 66 EXPECT_EQ(ret, 0) << "> parent: mkfifo errno = " << errno; 67 fd = open(FIFO_PATH, O_RDONLY, S_IRUSR|S_IWUSR); 68 EXPECT_NE(fd, -1) << "> open faild errno = " << errno; 69 EXPECT_NE(read(fd, buffer, sizeof(buffer)), -1) << "> read errno = " << errno; 70 EXPECT_STREQ(sentence, buffer) << "> parent: read = " << buffer; 71 LOG("> parent: read: %s", buffer); 72 close(fd); 73 74 Msleep(20); 75 WaitProcExitedOK(pid); 76 } 77 78 /** 79 * @tc.number SUB_KERNEL_IPC_FIFO_0700 80 * @tc.name mkfifo Duplicate creation and delete 81 * @tc.desc [C- SOFTWARE -0200] 82 */ 83 HWTEST_F(FifoTest, testFifoAddDelete, Function | MediumTest | Level0) 84 { 85 char fifoPath[50]; 86 const int loopNum = 32; 87 88 for (int i = 0; i < loopNum; i++) { 89 sprintf(fifoPath, "/dev/xtsTestFifo_%d", i); 90 remove(fifoPath); 91 92 LOG("> Create fifo %d", i); 93 EXPECT_EQ(mkfifo(fifoPath, 0666), 0) << "> mkfifo errno = " << errno; 94 95 LOG("> Delete fifo %d", i); 96 EXPECT_NE(remove(fifoPath), -1) << "> remove errno = " << errno; 97 } 98 } 99 100 /** 101 * @tc.number SUB_KERNEL_IPC_FIFO_0800 102 * @tc.name test O_NONBLOCK FIFO 103 * @tc.desc [C- SOFTWARE -0200] 104 */ 105 HWTEST_F(FifoTest, testFifoNonblack, Function | MediumTest | Level1) 106 { 107 const int arrSize = MAX_PIPE_BUFFER + 10; 108 int fd = -1; 109 int tmpInt; 110 int memRet = -1; 111 char testBuffer[arrSize]; 112 memRet = memset_s(testBuffer, sizeof(testBuffer), '1', sizeof(testBuffer)); 113 EXPECT_EQ(0, memRet); 114 115 int ret = mkfifo(FIFO_PATH, 0666); 116 EXPECT_EQ(ret, 0) << "> parent: mkfifo errno = " << errno; 117 118 pid_t pid = fork(); 119 ASSERT_TRUE(pid >= 0) << "> parent : fork : error"; 120 if (pid == 0) { 121 char readBuffer[arrSize]; 122 memRet = memset_s(readBuffer, sizeof(readBuffer), 0, sizeof(readBuffer)); 123 EXPECT_EQ(0, memRet); 124 fd = open(FIFO_PATH, O_RDONLY, S_IRUSR|S_IWUSR); 125 if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) { 126 LOG("> fcntl errno = %d", errno); 127 } 128 129 Msleep(150); 130 LOG("> child read"); 131 tmpInt = read(fd, readBuffer, arrSize); 132 if (tmpInt != MAX_PIPE_BUFFER) { 133 LOG("> child: tmpInt = %d", tmpInt); 134 LOG("> child: errno = %d", errno); 135 close(fd); 136 exit(1); 137 } 138 if (strncmp(testBuffer, readBuffer, MAX_PIPE_BUFFER) != 0) { 139 close(fd); 140 exit(1); 141 } 142 close(fd); 143 exit(0); 144 } 145 // parent 146 char writeBuffer[arrSize]; 147 memRet = memset_s(writeBuffer, sizeof(writeBuffer), '1', sizeof(writeBuffer)); 148 EXPECT_EQ(0, memRet); 149 fd = open(FIFO_PATH, O_WRONLY, S_IRUSR|S_IWUSR); 150 EXPECT_NE(fd, -1) << "> open faild errno = " << errno; 151 EXPECT_NE(fcntl(fd, F_SETFL, O_NONBLOCK), -1) << "> fcntl errno = " << errno; 152 153 Msleep(50); 154 LOG("> parent write"); 155 tmpInt = write(fd, writeBuffer, arrSize); 156 EXPECT_EQ(tmpInt, MAX_PIPE_BUFFER) << "> parent: errno = " <<errno; 157 LOG("> parent: write num = %d", tmpInt); 158 close(fd); 159 160 Msleep(50); 161 WaitProcExitedOK(pid); 162 } 163 164 /** 165 * @tc.number SUB_KERNEL_IPC_FIFO_0900 166 * @tc.name test BLOCK FIFO 167 * @tc.desc [C- SOFTWARE -0200] 168 */ 169 HWTEST_F(FifoTest, testFifoBlock, Function | MediumTest | Level1) 170 { 171 const int arrSize = MAX_PIPE_BUFFER + 1000; 172 int fd = -1; 173 int tmpInt; 174 char testBuffer[arrSize]; 175 int memRet = -1; 176 memRet = memset_s(testBuffer, sizeof(testBuffer), '1', sizeof(testBuffer)); 177 EXPECT_EQ(0, memRet); 178 179 int ret = mkfifo(FIFO_PATH, 0666); 180 EXPECT_EQ(ret, 0) << "> parent: mkfifo errno = " << errno; 181 182 pid_t pid = fork(); 183 ASSERT_TRUE(pid >= 0) << "> parent : fork : error"; 184 if (pid == 0) { 185 char readBuffer[arrSize]; 186 memRet = memset_s(readBuffer, sizeof(readBuffer), 0, sizeof(readBuffer)); 187 EXPECT_EQ(0, memRet); 188 fd = open(FIFO_PATH, O_RDONLY); 189 190 Msleep(60); 191 tmpInt = read(fd, readBuffer, arrSize); 192 if (tmpInt != arrSize) { 193 LOG("> child: error : read %d bytes", tmpInt); 194 LOG("> child: errno = %d", errno); 195 close(fd); 196 exit(1); 197 } 198 if (strncmp(testBuffer, readBuffer, MAX_PIPE_BUFFER) != 0) { 199 close(fd); 200 exit(1); 201 } 202 close(fd); 203 exit(0); 204 } 205 // parent 206 char writeBuffer[arrSize]; 207 memRet = memset_s(writeBuffer, sizeof(writeBuffer), '1', sizeof(writeBuffer)); 208 EXPECT_EQ(0, memRet); 209 fd = open(FIFO_PATH, O_WRONLY, S_IRUSR|S_IWUSR); 210 EXPECT_NE(fd, -1) << "> open faild errno = " << errno; 211 212 Msleep(30); 213 tmpInt = write(fd, writeBuffer, arrSize); 214 EXPECT_EQ(tmpInt, arrSize) << "> parent: errno = " <<errno; 215 LOG("> parent: write : = %d bytes", tmpInt); 216 close(fd); 217 218 Msleep(50); 219 WaitProcExitedOK(pid); 220 } 221