Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / native_client / tests / nonsfi / fork_test.cc
1 /*
2  * Copyright 2014 The Native Client Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6
7 #include <sys/types.h>
8 #include <sys/wait.h>
9 #include <unistd.h>
10
11 #include "native_client/src/include/nacl_assert.h"
12
13 void ClosePipe(int fds[2]) {
14   int rc = close(fds[0]);
15   ASSERT_EQ(rc, 0);
16   rc = close(fds[1]);
17   ASSERT_EQ(rc, 0);
18 }
19
20 int main(int argc, char *argv[]) {
21   int fds[2];
22   int rc = pipe(fds);
23   ASSERT_EQ(rc, 0);
24   pid_t pid = fork();
25   if (pid == 0) {
26     int msg = 0;
27     ssize_t num_read = read(fds[0], &msg, sizeof(msg));
28     ASSERT_EQ(num_read, sizeof(msg));
29     ClosePipe(fds);
30
31     ASSERT_EQ(msg, 42);
32     _exit(msg);
33     ASSERT(false);
34   }
35
36   /* In the parent process. */
37   ASSERT_GT(pid, 0);
38
39   int msg = 42;
40   ssize_t num_written = write(fds[1], &msg, sizeof(msg));
41   ASSERT_EQ(num_written, sizeof(msg));
42   ClosePipe(fds);
43
44   int status;
45   pid_t pid_waited = waitpid(pid, &status, 0);
46   ASSERT_EQ(pid_waited, pid);
47   ASSERT(WIFEXITED(status));
48   ASSERT_EQ(WEXITSTATUS(status), msg);
49   return 0;
50 }