genericopenlibs/cstdlib/TSTLIB/TPIPE3.CPP
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/TSTLIB/TPIPE3.CPP	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,211 @@
+// Copyright (c) 2005-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 <e32debug.h> // for RDebug::Print
+
+#include <e32std.h>
+#include <estlib.h>	// for multi-threading control
+
+extern "C" {
+#include "CTEST.H"
+}
+
+#ifdef _DEBUG
+#define DebugPrint	RDebug::Print
+#else
+inline void DebugPrint(const TDesC&, ...) {}
+#endif
+
+// prepare buf for pipe write/read opereations
+void fillbuf(int seed, char* buf, int buflen)
+	{
+	int j;
+	sleep(seed/3);
+	seed += 'A';
+	for (j=0; j<buflen; j++)
+		{
+		buf[j]=(char)seed;
+		seed+=13;
+		if (seed > 127)
+			seed = seed - 127 + 'A';
+		}
+	}
+
+int fids[3];
+
+// Producer, writing buf to pipe(fid)
+void producer(int fid)
+	{
+
+	test_Data;
+	char buf[128];
+	int nbytes;
+
+	test_Title("Producer");
+	
+	fillbuf(1,buf,sizeof(buf));
+	fflush(stdout);
+	
+	// Pipe Write test
+	nbytes=write(fid, buf, sizeof(buf));
+	
+	fflush(stdout);
+	test(nbytes==sizeof(buf));
+	
+	TProcessId id=RProcess().Id();
+	TUint pid=*REINTERPRET_CAST(TUint*,&id);
+	DebugPrint(_L("Process %d: Pipe Write success"), pid);
+	
+	printf("1.\n\n");	
+	return;
+	}
+	
+#define select_test(fid)	\
+		mask=E32SELECT_READ+E32SELECT_WRITE; \
+		err=ioctl(fid,E32IOSELECT,(void*)&mask);
+
+// consumer, doing ioctl test and then read from pipe(fid)					
+void consumer(int fid)
+	{
+
+	test_Data;
+	char buf[256];
+	char checkbuf[256];
+	int nbytes;
+	int mask=E32SELECT_READ;
+	int err=0;
+
+	test_Title("Consumer");
+	fillbuf(1,checkbuf,128);
+	
+	test_Next("Simple read, exactly matching write\n");
+	
+	// Pipe Ioctl test
+	select_test(fid);
+
+	test(err==0);
+	test(mask==E32SELECT_READ);
+	
+	// Pipe Read test
+	nbytes=read(fid,buf,128);
+	
+	test(nbytes==128);
+	test(memcmp(buf,checkbuf,128)==0);
+
+	TProcessId id=RProcess().Id();
+	TUint pid=*REINTERPRET_CAST(TUint*,&id);
+	DebugPrint(_L("Process %d: Pipe Read success"), pid);
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-STDLIB-UT-1572
+@SYMTestCaseDesc	    Tests for cancellation on pipe operations
+@SYMTestPriority 	    High
+@SYMTestActions  	    Cancel an outstanding pipe operation request 
+						and check if CPosixIPCSession::PipeCancel() handling correct.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+void pipeCancel(int fid)
+	{
+	test_Data;
+	int err=0;
+	int mask=E32SELECT_READ+E32SELECT_WRITE; 
+	
+	test_Title("Pipe cancellation");
+	DebugPrint(_L("Pipe cancellation test"));
+	TRequestStatus aStatus;
+
+	// Issue an ansynchronous pipe operation request
+	err=ioctl(fid,E32IOSELECT,(void*)&mask, aStatus);
+	
+	// Cancel pipe ioctl
+	err=ioctl_cancel(fid);
+	test(err==0);
+	
+	TProcessId id=RProcess().Id();
+	TUint pid=*REINTERPRET_CAST(TUint*,&id);
+	DebugPrint(_L("Process %d: Pipe Cancellation SUCCESS"), pid);
+	
+	test_Close();
+	}
+
+void do_parent()
+	{
+	// testing pipe with writing to child stdin
+	producer(fids[0]);
+	}
+	
+void do_child()
+	{
+	// testing pipe with reading from stdin
+	consumer(0);
+
+	// pipe cancellation test
+	pipeCancel(0);
+	
+	// close pipe
+	close(0);	
+	}
+	
+
+// Linked with mcrt0.o, so that the exe starts the CPosixServer automatically as per the
+// plan all along.
+
+int main(int argc, char* argv[])
+	{
+	void* proc2;
+
+	start_redirection_server();
+
+	if (argc==1)
+		{
+		// create Child process with read/err pipes	
+		proc2 = create_process(do_child, "CHILD", "r", fids);
+		if (proc2)
+			start_process(proc2);
+		else
+			perror("Failed to start process CHILD: ");
+
+		if (proc2)
+			{
+			int exit;
+			
+			// parent process
+			do_parent();
+			exit=wait_for_process(proc2);
+			printf("wait_for_process() returned %d\r\n", exit);
+			}
+		}
+	else
+		{
+		// child process
+		do_child();
+		}
+
+	// exit here, for the moment crt0 libraries panic
+	exit(0);
+	
+	return KErrNone;
+	}
+