!396 修复signal中的关于pipe部分的用例问题

Merge pull request !396 from phchang/fix_pipebug
This commit is contained in:
openharmony_ci 2021-07-13 08:21:28 +00:00 committed by Gitee
commit 78a50aff99
9 changed files with 105 additions and 49 deletions

View File

@ -46,7 +46,7 @@ static UINT32 Testcase(VOID)
ret = pipe(pipeFd[i]); ret = pipe(pipeFd[i]);
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax; 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); printf("write first status: %d\n", ret);
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
} }

View File

@ -49,7 +49,7 @@ static UINT32 Testcase(VOID)
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax; fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax;
fdmax = pipeFd[i][0] > fdmax ? pipeFd[i][0] : 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); printf("write first status: %d\n", ret);
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
} }

View File

@ -48,7 +48,7 @@ static UINT32 Testcase(VOID)
ret = pipe(pipeFd[i]); ret = pipe(pipeFd[i]);
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax; 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); printf("write first status: %d\n", ret);
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
} }

View File

@ -29,28 +29,41 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "it_test_signal.h" #include "it_test_signal.h"
#include "sys/shm.h"
static UINT32 Testcase(VOID) static UINT32 Testcase(VOID)
{ {
int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter
char buffer[20]; // 20, target buffer size char buffer[20]; // 20, target buffer size
int *sharedflag = NULL;
int shmid;
ret = pipe(pipeFd); ret = pipe(pipeFd);
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT1); 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(); spid = fork();
ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1); ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1);
if (spid == 0) { if (spid == 0) {
sharedflag = (int *)shmat(shmid, NULL, 0);
close(pipeFd[0]); close(pipeFd[0]);
sleep(10); // 10, sleep 10 second.
ret = write(pipeFd[1], "hello world", 12); // 12, "hello world" length and '\0' ret = write(pipeFd[1], "hello world", 12); // 12, "hello world" length and '\0'
printf("write first status: %d\n", ret); printf("write first status: %d\n", ret);
if (ret != 12) { // 12, "hello world" length and '\0' if (ret != 12) { // 12, "hello world" length and '\0'
exit(11); // 11, the value of son process unexpect exit, convenient to debug exit(11); // 11, the value of son process unexpect exit, convenient to debug
} }
*sharedflag = 1;
close(pipeFd[1]); close(pipeFd[1]);
exit(RED_FLAG); exit(RED_FLAG);
} }
close(pipeFd[1]); 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' 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' ICUNIT_GOTO_EQUAL(ret, 12, ret, EXIT); // 12, "hello world" length and '\0'
ret = strcmp(buffer, "hello world"); ret = strcmp(buffer, "hello world");

View File

@ -29,7 +29,7 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "it_test_signal.h" #include "it_test_signal.h"
#include "sys/shm.h"
static const int TAR_STR_LEN = 12; 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 int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter
char buffer[20]; // 20, target buffer size char buffer[20]; // 20, target buffer size
int *sharedflag = NULL;
int shmid;
ret = pipe(pipeFd); ret = pipe(pipeFd);
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT1); 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(); spid = fork();
ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1); ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1);
if (spid == 0) { if (spid == 0) {
sharedflag = (int *)shmat(shmid, NULL, 0);
close(pipeFd[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); printf("write first status: %d\n", ret);
if (ret != TAR_STR_LEN) { if (ret != TAR_STR_LEN) {
exit(11); // 11, the value of son process unexpect exit, convenient to debug exit(11); // 11, the value of son process unexpect exit, convenient to debug
} }
*sharedflag = 1;
close(pipeFd[1]); close(pipeFd[1]);
exit(RED_FLAG); exit(RED_FLAG);
} }
close(pipeFd[1]); 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); ret = read(pipeFd[0], buffer, TAR_STR_LEN);
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); 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); ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
printf("read pipe success: %s\n", buffer); printf("read pipe success: %s\n", buffer);
wait(&ret); wait(&ret);

View File

@ -28,6 +28,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "sys/shm.h"
#include "it_test_signal.h" #include "it_test_signal.h"
#include "signal.h" #include "signal.h"
@ -41,58 +42,59 @@ static int PipecommonWrite()
int pipefd[2]; // 2, array subscript int pipefd[2]; // 2, array subscript
pid_t pid; pid_t pid;
int retValue = -1; int retValue = -1;
retValue = pipe(pipefd); int *sharedflag = NULL;
ICUNIT_ASSERT_EQUAL(retValue, 0, retValue); int shmid;
signal(SIGPIPE, SigPrint);
int *readFd = &pipefd[0]; int *readFd = &pipefd[0];
int *writeFd = &pipefd[1]; int *writeFd = &pipefd[1];
char sentence[] = "Hello World"; char sentence[] = "Hello World";
char readbuffer[100]; char readbuffer[100];
int status, ret; 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(); pid = fork();
if (pid == -1) { if (pid == -1) {
printf("Fork Error!\n"); printf("Fork Error!\n");
return -1; return -1;
} else if (pid == 0) { } else if (pid == 0) {
for (int i = 0; i < 3; i++) { // 3, Number of cycles sharedflag = (int *)shmat(shmid, NULL, 0);
close(*readFd); close(*readFd);
retValue = write(*writeFd, sentence, strlen(sentence) + 1); retValue = write(*writeFd, sentence, strlen(sentence) + 1);
ICUNIT_ASSERT_EQUAL(retValue, strlen(sentence) + 1, retValue);
if (i == 0) { *sharedflag = 1;
if (retValue != strlen(sentence) + 1) { // 2 waitting for the father process close the pipe's read port
exit(retValue); while (*sharedflag != 2) {
} usleep(1);
} else {
if (retValue != -1) {
exit(retValue);
}
if (errno != EPIPE) {
exit(errno);
}
}
usleep(150000); // 150000, Used to calculate the delay time.
} }
retValue = write(*writeFd, sentence, strlen(sentence) + 1);
ICUNIT_ASSERT_EQUAL(retValue, -1, retValue);
ICUNIT_ASSERT_EQUAL(errno, EPIPE, errno);
exit(0); exit(0);
} else { } else {
usleep(10000); // 10000, Used to calculate the delay time. close(*writeFd);
for (int i = 0; i < 3; i++) { // 3, Number of cycles // 1 waitting for the sub process has written the sentence first
close(*readFd); while (*sharedflag != 1) {
usleep(1);
} }
close(*readFd);
// 2 father process close the pipe's read port
*sharedflag = 2;
ret = waitpid(pid, &status, 0); ret = waitpid(pid, &status, 0);
ICUNIT_ASSERT_EQUAL(ret, pid, ret); ICUNIT_ASSERT_EQUAL(ret, pid, ret);
ICUNIT_ASSERT_EQUAL(WEXITSTATUS(status), 0, WEXITSTATUS(status)); ICUNIT_ASSERT_EQUAL(WEXITSTATUS(status), 0, WEXITSTATUS(status));
} }
close(*readFd);
close(*writeFd);
return 0; return 0;
} }
void ItPosixPipe005(void) void ItPosixPipe005(void)
{ {
TEST_ADD_CASE(__FUNCTION__, PipecommonWrite, TEST_POSIX, TEST_MEM, TEST_LEVEL0, TEST_FUNCTION); TEST_ADD_CASE(__FUNCTION__, PipecommonWrite, TEST_POSIX, TEST_MEM, TEST_LEVEL0, TEST_FUNCTION);

View File

@ -627,6 +627,17 @@ HWTEST_F(SignalTest, ItPosixPipe003, TestSize.Level0)
ItPosixPipe003(); 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.name: ItPosixPipe005
* @tc.desc: function for SignalTest * @tc.desc: function for SignalTest

View File

@ -39,7 +39,7 @@ static UINT32 Testcase(VOID)
fd_set reads; fd_set reads;
ret = pipe(pipeFd); ret = pipe(pipeFd);
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT); 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); printf("write first status: %d\n", ret);
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
FD_ZERO(&reads); FD_ZERO(&reads);

View File

@ -31,6 +31,7 @@
#include "it_test_signal.h" #include "it_test_signal.h"
#include "signal.h" #include "signal.h"
#include "fcntl.h" #include "fcntl.h"
#include "sys/shm.h"
static int TestPipeMultiProcess() static int TestPipeMultiProcess()
{ {
@ -42,46 +43,62 @@ static int TestPipeMultiProcess()
int *readFd = &pipefd[0]; int *readFd = &pipefd[0];
int *writeFd = &pipefd[1]; int *writeFd = &pipefd[1];
char readbuffer[100] = {0};
char readbuffer[100];
int status, ret; int status, ret;
int totalNum = 3; int totalNum = 3;
int *sharedflag = NULL;
int shmid;
int flag = fcntl(*readFd, F_GETFL); int flag = fcntl(*readFd, F_GETFL);
fcntl(*readFd, F_SETFL, flag | O_NONBLOCK); 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(); pid = fork();
if (pid == -1) { if (pid == -1) {
printf("Fork Error!\n"); printf("Fork Error!\n");
return -1; return -1;
} else if (pid == 0) { } else if (pid == 0) {
sharedflag = (int *)shmat(shmid, NULL, 0);
close(pipefd[0]);
for (int i = 0; i < totalNum; i++) { for (int i = 0; i < totalNum; i++) {
errno = 0; errno = 0;
char sentence1[15] = "Hello World"; char sentence1[15] = "Hello World";
char a[4] = {0}; char a[2] = {0};
sprintf(a, "%d", i); sprintf(a, "%d", i);
strcat(sentence1, a); strcat(sentence1, a);
int ret = write(*writeFd, sentence1, strlen(sentence1) + 1); 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. usleep(10000); // 10000, Used to calculate the delay time.
} }
*sharedflag = 1;
ret = close(pipefd[1]);
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
exit(0); exit(0);
} else { } 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++) { for (int i = 0; i < totalNum; i++) {
printf("read\n"); printf("read\n");
char sentence1[15] = "Hello World"; 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)); memset(readbuffer, 0, sizeof(readbuffer));
retValue = read(*readFd, readbuffer, sizeof(readbuffer)); retValue = read(*readFd, readbuffer, strlen(sentence1) + 1);
printf("Receive %d bytes data : %s,%d\n", retValue, readbuffer, errno); printf("Receive %d bytes data : %s, errno : %d\n", retValue, readbuffer, errno);
ICUNIT_ASSERT_SIZE_STRING_EQUAL(readbuffer, readbuffer, strlen(sentence1), errno); ICUNIT_ASSERT_SIZE_STRING_EQUAL(readbuffer, sentence1, strlen(sentence1), errno);
} }
} }
ret = waitpid(pid, &status, 0); ret = waitpid(pid, &status, 0);
ICUNIT_ASSERT_EQUAL(ret, pid, ret); ICUNIT_ASSERT_EQUAL(ret, pid, ret);
ret = close(pipefd[0]); ret = close(pipefd[0]);
ICUNIT_ASSERT_EQUAL(ret, 0, ret); ICUNIT_ASSERT_EQUAL(ret, 0, ret);
ret = close(pipefd[1]);
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
return 0; return 0;
} }