From fd6f91bc9f8321e646ab371858db33baa645c391 Mon Sep 17 00:00:00 2001 From: vcbchang Date: Fri, 2 Jul 2021 15:56:13 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E4=BF=AE=E5=A4=8Dsignal=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=85=B3=E4=BA=8Epipe=E9=83=A8=E5=88=86=E7=9A=84?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【背景】signal模块中的pipe用例存在无法通过测试的问题,经查找,pipe用例存在多处bug,这里做以修复 【修改方案】 1 ItPosixPipe002用例存在pipe存在在父进程中没有关闭写端,父进程判断处有编码问题等 2 删掉了一些用例多余的close函数,精简了用例的结构 3 原来用例主子进程依靠延时来实现进程同步,这里更改为使用共享内存的方法来实现 re #I3YPQ8 Signed-off-by: vcbchang Change-Id: Ic0d0ab20521c9af5e5f1d75e76e047162d978464 --- .../unittest/signal/full/It_ipc_fdclr_001.cpp | 2 +- .../unittest/signal/full/It_ipc_fdset_001.cpp | 2 +- .../signal/full/It_ipc_fdzero_001.cpp | 2 +- .../unittest/signal/full/It_ipc_pipe_002.cpp | 17 ++++- .../unittest/signal/full/It_ipc_pipe_003.cpp | 21 +++++-- .../unittest/signal/full/pipe_test_005.cpp | 62 ++++++++++--------- testsuites/unittest/signal/signal_test.cpp | 11 ++++ .../signal/smoke/It_ipc_fdisset_001.cpp | 2 +- .../unittest/signal/smoke/pipe_test_002.cpp | 35 ++++++++--- 9 files changed, 105 insertions(+), 49 deletions(-) diff --git a/testsuites/unittest/signal/full/It_ipc_fdclr_001.cpp b/testsuites/unittest/signal/full/It_ipc_fdclr_001.cpp index 0a1f1897..13fd61a4 100644 --- a/testsuites/unittest/signal/full/It_ipc_fdclr_001.cpp +++ b/testsuites/unittest/signal/full/It_ipc_fdclr_001.cpp @@ -46,7 +46,7 @@ static UINT32 Testcase(VOID) ret = pipe(pipeFd[i]); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax; - ret = write(pipeFd[i][1], "hello world", TAR_STR_LEN); + ret = write(pipeFd[i][1], "aloha world", TAR_STR_LEN); printf("write first status: %d\n", ret); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); } diff --git a/testsuites/unittest/signal/full/It_ipc_fdset_001.cpp b/testsuites/unittest/signal/full/It_ipc_fdset_001.cpp index f244971b..dda0395b 100644 --- a/testsuites/unittest/signal/full/It_ipc_fdset_001.cpp +++ b/testsuites/unittest/signal/full/It_ipc_fdset_001.cpp @@ -49,7 +49,7 @@ static UINT32 Testcase(VOID) ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax; fdmax = pipeFd[i][0] > fdmax ? pipeFd[i][0] : fdmax; - ret = write(pipeFd[i][1], "hello world", TAR_STR_LEN); + ret = write(pipeFd[i][1], "Aloha World", TAR_STR_LEN); printf("write first status: %d\n", ret); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); } diff --git a/testsuites/unittest/signal/full/It_ipc_fdzero_001.cpp b/testsuites/unittest/signal/full/It_ipc_fdzero_001.cpp index 34d14f83..33a45823 100644 --- a/testsuites/unittest/signal/full/It_ipc_fdzero_001.cpp +++ b/testsuites/unittest/signal/full/It_ipc_fdzero_001.cpp @@ -48,7 +48,7 @@ static UINT32 Testcase(VOID) ret = pipe(pipeFd[i]); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax; - ret = write(pipeFd[i][1], "hello world", TAR_STR_LEN); + ret = write(pipeFd[i][1], "Aloha world", TAR_STR_LEN); printf("write first status: %d\n", ret); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); } diff --git a/testsuites/unittest/signal/full/It_ipc_pipe_002.cpp b/testsuites/unittest/signal/full/It_ipc_pipe_002.cpp index f5dfbc21..be0e2578 100644 --- a/testsuites/unittest/signal/full/It_ipc_pipe_002.cpp +++ b/testsuites/unittest/signal/full/It_ipc_pipe_002.cpp @@ -29,28 +29,41 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "it_test_signal.h" - +#include "sys/shm.h" static UINT32 Testcase(VOID) { int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter char buffer[20]; // 20, target buffer size + int *sharedflag = NULL; + int shmid; + ret = pipe(pipeFd); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT1); + shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm + ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid); + sharedflag = (int *)shmat(shmid, NULL, 0); + *sharedflag = 0; + spid = fork(); ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1); if (spid == 0) { + sharedflag = (int *)shmat(shmid, NULL, 0); close(pipeFd[0]); - sleep(10); // 10, sleep 10 second. ret = write(pipeFd[1], "hello world", 12); // 12, "hello world" length and '\0' printf("write first status: %d\n", ret); if (ret != 12) { // 12, "hello world" length and '\0' exit(11); // 11, the value of son process unexpect exit, convenient to debug } + *sharedflag = 1; close(pipeFd[1]); exit(RED_FLAG); } close(pipeFd[1]); + // waitting for the sub process has written the sentence + while (*sharedflag != 1) { + usleep(1); + } ret = read(pipeFd[0], buffer, 12); // 12, "hello world" length and '\0' ICUNIT_GOTO_EQUAL(ret, 12, ret, EXIT); // 12, "hello world" length and '\0' ret = strcmp(buffer, "hello world"); diff --git a/testsuites/unittest/signal/full/It_ipc_pipe_003.cpp b/testsuites/unittest/signal/full/It_ipc_pipe_003.cpp index d4e697a1..e19417f8 100644 --- a/testsuites/unittest/signal/full/It_ipc_pipe_003.cpp +++ b/testsuites/unittest/signal/full/It_ipc_pipe_003.cpp @@ -29,7 +29,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "it_test_signal.h" - +#include "sys/shm.h" static const int TAR_STR_LEN = 12; @@ -37,25 +37,38 @@ static UINT32 Testcase(VOID) { int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter char buffer[20]; // 20, target buffer size + int *sharedflag = NULL; + int shmid; + ret = pipe(pipeFd); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT1); + shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm + ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid); + sharedflag = (int *)shmat(shmid, NULL, 0); + *sharedflag = 0; + spid = fork(); ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1); if (spid == 0) { + sharedflag = (int *)shmat(shmid, NULL, 0); close(pipeFd[0]); - ret = write(pipeFd[1], "hello world", TAR_STR_LEN); + ret = write(pipeFd[1], "Hello world", TAR_STR_LEN); printf("write first status: %d\n", ret); if (ret != TAR_STR_LEN) { exit(11); // 11, the value of son process unexpect exit, convenient to debug } + *sharedflag = 1; close(pipeFd[1]); exit(RED_FLAG); } close(pipeFd[1]); - sleep(2); // 2, sleep 2 second + // waitting for the sub process has written the sentence + while (*sharedflag != 1) { + usleep(1); + } ret = read(pipeFd[0], buffer, TAR_STR_LEN); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); - ret = strcmp(buffer, "hello world"); + ret = strcmp(buffer, "Hello world"); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); printf("read pipe success: %s\n", buffer); wait(&ret); diff --git a/testsuites/unittest/signal/full/pipe_test_005.cpp b/testsuites/unittest/signal/full/pipe_test_005.cpp index f17964ef..9b490529 100644 --- a/testsuites/unittest/signal/full/pipe_test_005.cpp +++ b/testsuites/unittest/signal/full/pipe_test_005.cpp @@ -28,6 +28,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "sys/shm.h" #include "it_test_signal.h" #include "signal.h" @@ -41,58 +42,59 @@ static int PipecommonWrite() int pipefd[2]; // 2, array subscript pid_t pid; int retValue = -1; - retValue = pipe(pipefd); - ICUNIT_ASSERT_EQUAL(retValue, 0, retValue); - - signal(SIGPIPE, SigPrint); - + int *sharedflag = NULL; + int shmid; int *readFd = &pipefd[0]; int *writeFd = &pipefd[1]; - char sentence[] = "Hello World"; char readbuffer[100]; int status, ret; + retValue = pipe(pipefd); + ICUNIT_ASSERT_EQUAL(retValue, 0, retValue); + if (signal(SIGPIPE, SigPrint) == SIG_ERR) { + printf("signal error\n"); + } + + shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm + ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid); + sharedflag = (int *)shmat(shmid, NULL, 0); + *sharedflag = 0; + pid = fork(); if (pid == -1) { printf("Fork Error!\n"); return -1; } else if (pid == 0) { - for (int i = 0; i < 3; i++) { // 3, Number of cycles - close(*readFd); - retValue = write(*writeFd, sentence, strlen(sentence) + 1); - - if (i == 0) { - if (retValue != strlen(sentence) + 1) { - exit(retValue); - } - } else { - if (retValue != -1) { - exit(retValue); - } - if (errno != EPIPE) { - exit(errno); - } - } - usleep(150000); // 150000, Used to calculate the delay time. + sharedflag = (int *)shmat(shmid, NULL, 0); + close(*readFd); + retValue = write(*writeFd, sentence, strlen(sentence) + 1); + ICUNIT_ASSERT_EQUAL(retValue, strlen(sentence) + 1, retValue); + *sharedflag = 1; + // 2 waitting for the father process close the pipe's read port + while (*sharedflag != 2) { + usleep(1); } + retValue = write(*writeFd, sentence, strlen(sentence) + 1); + ICUNIT_ASSERT_EQUAL(retValue, -1, retValue); + ICUNIT_ASSERT_EQUAL(errno, EPIPE, errno); exit(0); } else { - usleep(10000); // 10000, Used to calculate the delay time. - for (int i = 0; i < 3; i++) { // 3, Number of cycles - close(*readFd); + close(*writeFd); + // 1 waitting for the sub process has written the sentence first + while (*sharedflag != 1) { + usleep(1); } + close(*readFd); + // 2 father process close the pipe's read port + *sharedflag = 2; ret = waitpid(pid, &status, 0); ICUNIT_ASSERT_EQUAL(ret, pid, ret); ICUNIT_ASSERT_EQUAL(WEXITSTATUS(status), 0, WEXITSTATUS(status)); } - - close(*readFd); - close(*writeFd); return 0; } - void ItPosixPipe005(void) { TEST_ADD_CASE(__FUNCTION__, PipecommonWrite, TEST_POSIX, TEST_MEM, TEST_LEVEL0, TEST_FUNCTION); diff --git a/testsuites/unittest/signal/signal_test.cpp b/testsuites/unittest/signal/signal_test.cpp index 959457a5..7ddd1a97 100644 --- a/testsuites/unittest/signal/signal_test.cpp +++ b/testsuites/unittest/signal/signal_test.cpp @@ -627,6 +627,17 @@ HWTEST_F(SignalTest, ItPosixPipe003, TestSize.Level0) ItPosixPipe003(); } +/* * + * @tc.name: ItPosixPipe004 + * @tc.desc: function for SignalTest + * @tc.type: FUNC + * @tc.require: AR000EEMQ9 + */ +HWTEST_F(SignalTest, ItPosixPipe004, TestSize.Level0) +{ + ItPosixPipe004(); +} + /* * * @tc.name: ItPosixPipe005 * @tc.desc: function for SignalTest diff --git a/testsuites/unittest/signal/smoke/It_ipc_fdisset_001.cpp b/testsuites/unittest/signal/smoke/It_ipc_fdisset_001.cpp index 21205390..806f38d0 100644 --- a/testsuites/unittest/signal/smoke/It_ipc_fdisset_001.cpp +++ b/testsuites/unittest/signal/smoke/It_ipc_fdisset_001.cpp @@ -39,7 +39,7 @@ static UINT32 Testcase(VOID) fd_set reads; ret = pipe(pipeFd); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); - ret = write(pipeFd[1], "hello world", TAR_STR_LEN); + ret = write(pipeFd[1], "Hello World", TAR_STR_LEN); printf("write first status: %d\n", ret); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); FD_ZERO(&reads); diff --git a/testsuites/unittest/signal/smoke/pipe_test_002.cpp b/testsuites/unittest/signal/smoke/pipe_test_002.cpp index ccbcfbc6..fafa5f3b 100644 --- a/testsuites/unittest/signal/smoke/pipe_test_002.cpp +++ b/testsuites/unittest/signal/smoke/pipe_test_002.cpp @@ -31,6 +31,7 @@ #include "it_test_signal.h" #include "signal.h" #include "fcntl.h" +#include "sys/shm.h" static int TestPipeMultiProcess() { @@ -42,46 +43,62 @@ static int TestPipeMultiProcess() int *readFd = &pipefd[0]; int *writeFd = &pipefd[1]; - - char readbuffer[100]; + char readbuffer[100] = {0}; int status, ret; int totalNum = 3; + int *sharedflag = NULL; + int shmid; int flag = fcntl(*readFd, F_GETFL); fcntl(*readFd, F_SETFL, flag | O_NONBLOCK); + shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm + ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid); + sharedflag = (int *)shmat(shmid, NULL, 0); + *sharedflag = 0; pid = fork(); if (pid == -1) { printf("Fork Error!\n"); return -1; } else if (pid == 0) { + sharedflag = (int *)shmat(shmid, NULL, 0); + close(pipefd[0]); for (int i = 0; i < totalNum; i++) { errno = 0; char sentence1[15] = "Hello World"; - char a[4] = {0}; + char a[2] = {0}; sprintf(a, "%d", i); strcat(sentence1, a); int ret = write(*writeFd, sentence1, strlen(sentence1) + 1); + ICUNIT_ASSERT_EQUAL(ret, strlen(sentence1) + 1, ret); usleep(10000); // 10000, Used to calculate the delay time. } + *sharedflag = 1; + ret = close(pipefd[1]); + ICUNIT_ASSERT_EQUAL(ret, 0, ret); exit(0); } else { + close(pipefd[1]); + // waitting for the sub process has written the sentence first + while (*sharedflag != 1) { + usleep(1); + } for (int i = 0; i < totalNum; i++) { printf("read\n"); char sentence1[15] = "Hello World"; - char a[4] = {0}; + char a[2] = {0}; + sprintf(a, "%d", i); + strcat(sentence1, a); memset(readbuffer, 0, sizeof(readbuffer)); - retValue = read(*readFd, readbuffer, sizeof(readbuffer)); - printf("Receive %d bytes data : %s,%d\n", retValue, readbuffer, errno); - ICUNIT_ASSERT_SIZE_STRING_EQUAL(readbuffer, readbuffer, strlen(sentence1), errno); + retValue = read(*readFd, readbuffer, strlen(sentence1) + 1); + printf("Receive %d bytes data : %s, errno : %d\n", retValue, readbuffer, errno); + ICUNIT_ASSERT_SIZE_STRING_EQUAL(readbuffer, sentence1, strlen(sentence1), errno); } } ret = waitpid(pid, &status, 0); ICUNIT_ASSERT_EQUAL(ret, pid, ret); ret = close(pipefd[0]); ICUNIT_ASSERT_EQUAL(ret, 0, ret); - ret = close(pipefd[1]); - ICUNIT_ASSERT_EQUAL(ret, 0, ret); return 0; } -- GitLab