summaryrefslogtreecommitdiff
path: root/trunk/ACE/tests/Pipe_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/ACE/tests/Pipe_Test.cpp')
-rw-r--r--trunk/ACE/tests/Pipe_Test.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/trunk/ACE/tests/Pipe_Test.cpp b/trunk/ACE/tests/Pipe_Test.cpp
new file mode 100644
index 00000000000..883f1db5126
--- /dev/null
+++ b/trunk/ACE/tests/Pipe_Test.cpp
@@ -0,0 +1,172 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// tests
+//
+// = FILENAME
+// Pipe_Test.cpp
+//
+// = DESCRIPTION
+// Tests the construction of multiple pipes in a process.
+//
+// = AUTHOR
+// Irfan Pyarali <irfan@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "test_config.h"
+#include "ace/Pipe.h"
+#include "ace/Process.h"
+#include "ace/Get_Opt.h"
+#include "ace/ACE.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_stdlib.h"
+#include "ace/OS_NS_unistd.h"
+
+ACE_RCSID(tests, Pipe_Test, "$Id$")
+
+// Indicates whether we should close the pipe or not.
+static int close_pipe = 1;
+
+// Indicates whether we're running as the child or the parent.
+static int child_process = 0;
+
+// Number of iterations to run the test.
+static int iterations = ACE_MAX_ITERATIONS;
+
+// Explain usage and exit.
+static void
+print_usage_and_die (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("usage: %n [-d (don't close pipes)] ")
+ ACE_TEXT ("[-c (child process)] [-i (iterations)] \n")));
+ ACE_OS::exit (1);
+}
+
+// Parse the command-line arguments and set options.
+
+static void
+parse_args (int argc, ACE_TCHAR *argv[])
+{
+ ACE_Get_Opt get_opt (argc, argv, ACE_TEXT("dci:"));
+
+ int c;
+
+ while ((c = get_opt ()) != -1)
+ switch (c)
+ {
+ case 'd':
+ close_pipe = 0;
+ break;
+ case 'c':
+ child_process = 1;
+ break;
+ case 'i':
+ iterations = ACE_OS::atoi (get_opt.opt_arg ());
+ break;
+ default:
+ print_usage_and_die ();
+ break;
+ }
+}
+
+// Consolidate the ACE_Pipe initializations.
+
+static void
+open (ACE_Pipe &pipe,
+ const char *name)
+{
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("opening %C\n"), name));
+ int result = pipe.open ();
+
+ ACE_ASSERT (result != -1);
+ result = pipe.read_handle () != ACE_INVALID_HANDLE
+ && pipe.write_handle () != ACE_INVALID_HANDLE;
+ ACE_ASSERT (result == 1);
+
+ if (close_pipe)
+ pipe.close ();
+}
+
+int
+run_main (int argc, ACE_TCHAR *argv[])
+{
+ parse_args (argc, argv);
+
+ if (child_process)
+ {
+ ACE_APPEND_LOG (ACE_TEXT("Pipe_Test-children"));
+ ACE_Pipe a, b, c, d, e;
+
+ open (a, "a");
+ open (b, "b");
+ open (c, "c");
+ open (d, "d");
+ open (e, "e");
+
+ ACE_END_LOG;
+ }
+ else
+ {
+ ACE_START_TEST (ACE_TEXT("Pipe_Test"));
+ ACE_INIT_LOG (ACE_TEXT("Pipe_Test-children"));
+
+# if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)
+ const ACE_TCHAR *cmdline_fmt = ACE_TEXT ("%s -c%s");
+# else
+ const ACE_TCHAR *cmdline_fmt = ACE_TEXT ("%ls -c%ls");
+# endif /* ACE_WIN32 || !ACE_USES_WCHAR */
+ ACE_Process_Options options;
+ options.command_line (cmdline_fmt,
+ argv[0],
+ close_pipe == 0 ? ACE_TEXT (" -d") : ACE_TEXT (""));
+
+ ACE_exitcode status = 0;
+
+ for (int i = 0; i < ::iterations; i++)
+ {
+ ACE_Process server;
+
+ if (server.spawn (options) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("spawn failed")),
+ -1);
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Server forked with pid = %d.\n"),
+ server.getpid ()));
+ }
+
+ // Wait for the process we just created to exit.
+ server.wait (&status);
+
+ // Check if child exited without error.
+ if (WIFEXITED (status) != 0
+ && WEXITSTATUS (status) != 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Child of server %d finished with error ")
+ ACE_TEXT ("exit status %d\n"),
+ server.getpid (),
+ WEXITSTATUS (status)));
+
+ ACE_END_TEST;
+
+ ACE_OS::exit (WEXITSTATUS (status));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Server %d finished\n"),
+ server.getpid ()));
+ }
+ ACE_END_TEST;
+ }
+
+ return 0;
+}