--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/TSTLIB/TWPIPE.C Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,312 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Test code for pipes, using dubious WINS extension for multiple processes...
+*
+*
+*/
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h> /* for MAXPATHLEN */
+#include <sys/errno.h>
+#include <sys/ioctl.h>
+
+#include "CTEST.H"
+
+int fids[3];
+
+/**
+@SYMTestCaseID SYSLIB-STDLIB-CT-1092
+@SYMTestCaseDesc Tests for operations on pipes
+@SYMTestPriority High
+@SYMTestActions Tests for command line arguments,directory operations,environment variables.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ REQ0000
+*/
+int do_main(int argc, wchar_t* argv[])
+ {
+ test_Data;
+ int i;
+ wchar_t* var;
+ wchar_t* varname;
+ wchar_t cwd[MAXPATHLEN];
+ char buf[200];
+ char buf1[200];
+
+ test_Title("PIPE");
+
+ test_Next("Command line arguments");
+ test(argc>0);
+ test(argv!=0);
+ printf(" argc=%d\r\n", argc);
+ for (i=0; i<argc; i++)
+ {
+ test(argv[i]!=0);
+ test(-1 != wcstombs(buf, argv[i], sizeof(buf)));
+ printf(" argv[%d]=\"%s\" length %d\r\n", i, buf, strlen(buf));
+ }
+ printf("\r\n");
+
+ test_Next("Current working directory");
+ var=wgetcwd(cwd,sizeof(cwd)/2);
+ test(var==cwd);
+ test(-1 != wcstombs(buf, cwd, sizeof(buf)));
+ printf(" %s\r\n\n", buf);
+
+ test_Next("Change directory");
+ i=wchdir((wchar_t*)L"z:/system");
+ test(i==0);
+ var=wgetcwd(cwd,sizeof(cwd)/2);
+ test(var==cwd);
+ test(-1 != wcstombs(buf, cwd, sizeof(buf)));
+ printf(" %s\r\n\n", buf);
+
+ test_Next("Environment variables");
+
+ varname=(wchar_t*)L"CLASSPATH";
+ var=wgetenv(varname);
+ test(var!=0);
+ test(-1 != wcstombs(buf, var, sizeof(buf)));
+ test(-1 != wcstombs(buf1, varname, sizeof(buf1)));
+ printf(" %s=%s\r\n", buf1, buf);
+
+ varname=(wchar_t*)"VARIABLE2";
+ var=wgetenv(varname);
+ if (var!=0)
+ {
+ test(-1 != wcstombs(buf, var, sizeof(buf)));
+ test(-1 != wcstombs(buf1, varname, sizeof(buf1)));
+ printf(" %s=%s\r\n", buf1, buf);
+ wunsetenv((wchar_t*)"VARIABLE2");
+ }
+
+ varname=(wchar_t*)L"USER";
+ var=wgetenv(varname);
+ test(var!=0);
+ test(-1 != wcstombs(buf, var, sizeof(buf)));
+ test(-1 != wcstombs(buf1, varname, sizeof(buf1)));
+ printf(" %s=%s\r\n", buf1, buf);
+
+ sleep(5);
+
+ test_Close();
+ return 0;
+ }
+
+/* bodge up two pretend processes */
+
+void do_mainA()
+ {
+ wchar_t* argv[] = { (wchar_t*)L"twpipe.exe", (wchar_t*)L"A" };
+
+ wsetenv((wchar_t*)L"CLASSPATH",(wchar_t*)L".;classes;?:/classes;?:/system/java/lib/classes.zip",0);
+ wsetenv((wchar_t*)L"VARIABLE2",(wchar_t*)L"value2",0);
+ wsetenv((wchar_t*)L"USER",(wchar_t*)L"Tumblin' Wide Boy - Go fer yer guns!",0);
+
+ do_main(2, argv);
+ }
+
+/**
+@SYMTestCaseID SYSLIB-STDLIB-CT-1093
+@SYMTestCaseDesc Tests for operations on a child pipe
+@SYMTestPriority High
+@SYMTestActions Tests for reading from a pipe in the child process
+@SYMTestExpectedResults Test must not fail
+@SYMREQ REQ0000
+*/
+void do_mainB()
+ {
+ test_Data;
+ wchar_t* argv[] = {(wchar_t*) L"twpipe.exe", (wchar_t*)L"B" };
+ int nbytes=1;
+ int mask, err;
+ int firstread=1;
+
+ /* Don't use test_* because it involves fflush and will cause deadlock */
+ printf("PIPE Child");
+
+ printf("Child reads from STDIN\n");
+ while (nbytes>0)
+ {
+ char buf[5];
+ printf("Child calls read of fid=0\n");
+ nbytes=read(0,buf,sizeof(buf));
+ printf("Child got %d bytes\n", nbytes);
+ if (nbytes>0)
+ {
+ if (firstread)
+ {
+ /* We hope that there is still stuff to read */
+ printf("Child calls E32IOSELECT(WRITE) on STDIN\n");
+ mask=E32SELECT_WRITE;
+ err=ioctl(0,E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==0);
+ printf("Child calls E32IOSELECT(READ) on STDIN\n");
+ mask=E32SELECT_READ+E32SELECT_WRITE;
+ err=ioctl(0,E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==E32SELECT_READ);
+ firstread=0;
+ }
+ printf(" %02d >%.*s<\n", nbytes, nbytes, buf);
+ }
+ else
+ if (nbytes<0)
+ printf(" %d (errno=%d)\n", nbytes, errno);
+ }
+
+ printf("Child calls E32IOSELECT on STDOUT");
+ mask=E32SELECT_READ+E32SELECT_WRITE;
+ err=ioctl(1,E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==E32SELECT_WRITE);
+
+ fflush(stdout);
+
+ do_main(2, argv);
+ fclose(stdout);
+ }
+
+/**
+@SYMTestCaseID SYSLIB-STDLIB-CT-1094
+@SYMTestCaseDesc Tests for pipe file descriptors
+@SYMTestPriority High
+@SYMTestActions Tests for writing to the pipe file descriptors
+@SYMTestExpectedResults Test must not fail
+@SYMREQ REQ0000
+*/
+void do_piping()
+ {
+ test_Data;
+ char* s;
+ char buf[180];
+
+ test_Title("PIPE");
+
+ test_Next("Pipe file descriptors");
+ printf(" fids= %d, %d, %d\n", fids[0], fids[1], fids[2]);
+
+ if (fids[0]>=0)
+ {
+ int nbytes;
+ int remainder;
+ int mask, err;
+ const char* buf="test data 18 bytes";
+
+ test_Next("E32IOSELECT(READ) on Child STDIN");
+ mask=E32SELECT_READ;
+ err=ioctl(fids[0],E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==0);
+ test_Next("E32IOSELECT(WRITE) on Child STDIN");
+ mask=E32SELECT_READ+E32SELECT_WRITE;
+ err=ioctl(fids[0],E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==E32SELECT_WRITE);
+
+ test_Next("Child STDIN");
+ remainder=strlen(buf);
+ while (remainder>0)
+ {
+ int length=(remainder<7)?remainder:7;
+ nbytes=write(fids[0],buf,length);
+ printf(" >%.*s<",nbytes,buf);
+ buf+=nbytes;
+ remainder-=nbytes;
+ test(nbytes>0);
+ test(nbytes<=length);
+ }
+ printf("\n");
+ close(fids[0]);
+ sleep(5);
+ }
+ if (fids[1]>=0)
+ {
+ FILE* cout;
+ int mask, err;
+ int firstread=1;
+
+ test_Next("Child STDOUT");
+ cout=wfdopen(fids[1],(wchar_t*)L"r");
+ test(cout!=0);
+
+ do
+ {
+ s=fgets(buf,sizeof(buf),cout);
+ if (s!=0)
+ {
+ printf(" >%s", s);
+ if (firstread)
+ {
+ test_Next("\nE32IOSELECT(WRITE) on Child STDOUT");
+ mask=E32SELECT_WRITE;
+ err=ioctl(fids[1],E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==0);
+ test_Next("E32IOSELECT(READ) on Child STDOUT");
+ mask=E32SELECT_READ+E32SELECT_WRITE;
+ err=ioctl(fids[1],E32IOSELECT,(void*)&mask);
+ test(err==0);
+ test(mask==E32SELECT_READ);
+ firstread=0;
+ }
+ }
+ }
+ while (s!=0);
+ fclose(cout);
+ }
+
+ test_Close();
+ }
+
+/* Linked with mcrt0.o, so that the exe starts the CPosixServer automatically as per the
+ * plan all along.
+ */
+
+int wmain(int argc, wchar_t* argv[])
+ {
+ void* proc2;
+
+ start_redirection_server();
+
+ if (argc==1)
+ {
+ do_mainA();
+
+ proc2 = create_process(do_mainB, "B", "rw", fids);
+ if (proc2)
+ start_process(proc2);
+ else
+ perror("Failed to start processB: ");
+
+ if (proc2)
+ {
+ int exit;
+ do_piping();
+ exit=wait_for_process(proc2);
+ printf("wait_for_process returned %d\r\n", exit);
+ }
+ }
+ else
+ {
+ do_mainB();
+ }
+
+ return 0;
+ }