genericopenlibs/cstdlib/TSTLIB/tser1.c
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/TSTLIB/tser1.c	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,259 @@
+/*
+* 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:
+*
+*/
+
+
+
+#include <stdlib.h>	/* definition of exit() */
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/unistd.h>
+#include <sys/ioctl.h>
+#include "CTEST.H"
+
+
+int GlobalPort;
+
+test_Data;
+int close_console=0;
+
+/**
+@SYMTestCaseID          SYSLIB-STDLIB-CT-1099
+@SYMTestCaseDesc	    Tests for serial port
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for serial port,and under posix server
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/		
+void DoTests(char*port)
+	{	
+	int port1, port2;
+	int int1 = 0;
+	int int2 = 0;
+	int ret=0;
+	int sigs[] = {0,0};
+ 	int sig = 0;
+
+	SerialConfig config;
+	SerialConfig newconfig;
+
+	char buffer[1024];
+	size_t size = 100;
+
+	memset(&newconfig, 0, sizeof(newconfig));
+
+	test_Next("Open port");
+	
+	port1 = open(port,  0);	//exclusive
+	if (-1 != port1)
+		{
+
+		//this one should fail
+		port2 = open(port,  0);
+		test_errno(-1==port2, EACCES);
+
+		
+		test_Next("set signals");
+		//play with the signals
+		ret = ioctl(port1, COMMIOCTL_SETSIGNALS, &sigs[0]);
+		test(-1 != ret);
+
+		test_Next("get signals");
+		ret = ioctl(port1, COMMIOCTL_GETSIGNALS, &sig);
+		test(-1 != ret);
+
+		//try changing the settings
+		test_Next("port configuration");
+		ret = ioctl(port1, COMMIOCTL_GETCONFIG, &config);
+
+		config.iRate = Bps115200;
+		config.iDataBits = DBits6;
+		config.iStopBits=Stop2;
+		config.iParity=ParityOdd;
+		config.iHandshake=0;
+		config.iParityError=ConfigParityErrorFail;
+		config.iFifo=3;
+		config.iSpecialRate=0;
+		config.iTerminatorCount=0;
+		config.iTerminator[0]=0;
+		config.iXonChar=1;
+		config.iXoffChar=2;
+		config.iParityErrorChar=3;
+		config.iSIREnable=SIRDisable;
+		config.iSIRSettings=0;
+
+		ret = ioctl(port1, COMMIOCTL_SETCONFIG, &config);
+		ret = ioctl(port1, COMMIOCTL_GETCONFIG, &newconfig);
+
+		test(config.iRate == newconfig.iRate);
+		test(config.iDataBits==newconfig.iDataBits);
+		test(config.iStopBits==newconfig.iStopBits);
+		test(config.iParity==newconfig.iParity);
+		test(config.iHandshake==newconfig.iHandshake);
+		test(config.iParityError==newconfig.iParityError);
+		test(config.iFifo==newconfig.iFifo);
+		test(config.iSpecialRate==newconfig.iSpecialRate);
+		test(config.iTerminatorCount==newconfig.iTerminatorCount);
+		test(config.iTerminator[0]==newconfig.iTerminator[0]);
+		test(config.iXonChar==newconfig.iXonChar);
+		test(config.iXoffChar==newconfig.iXoffChar);
+		test(config.iParityErrorChar==newconfig.iParityErrorChar);
+		test(config.iSIREnable==newconfig.iSIREnable);
+		test(config.iSIRSettings==newconfig.iSIRSettings);
+
+		test_Next("Buffer lengths");
+		int1 = 0;
+		ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &int1);
+		test(ret != -1);
+		test(int1 != 0);
+
+		int1 = 2048;
+		ret = ioctl(port1, COMMIOCTL_SETBUFFERLENGTH, &int1);
+		test(ret != -1);
+
+		int2 = 0;
+		ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &int2);
+		test(ret != -1);
+		test(int1 == int2);
+
+
+		int1 = 100000000;
+		ret = ioctl(port1, COMMIOCTL_SETBUFFERLENGTH, &int1);
+		test(ret != -1);
+		
+		ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &int1);
+		test(ret != -1);
+		test(int1 == int2);	//shoudn't have changed, val too big.
+
+
+		test_Next("break");
+		sig = 5000;
+		ret = ioctl(port1, COMMIOCTL_BREAK, &sig);
+		//break isn't supported
+		test_errno(-1==ret, ENOSYS);
+
+
+		test_Next("read timeout");
+		int1 = 2000;
+		ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &int1);
+		test (ret != -1);
+
+		int2 = 0;
+		ret = ioctl(port1, COMMIOCTL_GETREADTIMEOUT, &int2);
+		test (ret != -1);
+		test(int2 == int1);
+
+				
+		test_Next("read threshold");
+		int1 = 2000;
+		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &int1);
+		test (ret != -1);
+
+		int2 = 0;
+		ret = ioctl(port1, COMMIOCTL_GETREADTHRESHOLD, &int2);
+		test(ret != -1);
+		test(int1 == int2);
+
+
+
+		//signals
+		test_Next("test notifications supported");
+		ret = ioctl(port1, COMMIOCTL_NOTIFYSUPPORTED, &int1);
+		test((int1 & (KNotifyFramingError|KNotifyOverrunError|KNotifyParityError)) == (KNotifyFramingError|KNotifyOverrunError|KNotifyParityError));
+		printf("Notifications supported are %08x\n",int1);
+
+		test_Next("Test read timeout with a threshold");
+		int2 = 3000;
+		ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &int2);
+		test (ret != -1);
+		
+		int1 = 1;
+		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &int1);
+		test (ret != -1);
+
+		ret = read(port1, buffer, size);
+		test_errno(-1==ret, ETIMEDOUT);
+
+		//no threshold, but with a 1 second timeout
+		test_Next("no threshold with timeout");
+		int2 = 5000;
+		ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &int2);
+		test (ret != -1);
+
+		int1 = -1;
+		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &int1);
+		test (ret != -1);
+
+		ret = read(port1, buffer, size);
+		test_errno(-1==ret, ETIMEDOUT);
+
+
+		close(port1);
+		}
+	else
+		printf("failed to open port %s with errno %d\n", port,errno);
+	}
+
+
+
+void DoTestsSerial(void)
+	{
+	DoTests("COM1:");
+
+	if (close_console)
+		{
+		test_Close();
+		close(0);
+		close(1);
+		close(2);
+		}
+	}
+
+
+
+int main(void)
+	{
+	void* client;
+	int err;
+	
+	test_Title("Serial port test1");
+	test_Next("Do tests with local server for COM1:");
+	DoTests("COM1:");
+	test_Next("Do tests with local server for COM2:");
+	DoTests("COM2:");
+	test_Next("Do tests with local server for COM3:");
+	DoTests("COM3:");
+	test_Next("Do tests with local server for COM4:");
+	DoTests("COM4:");
+
+
+	start_posix_server();	/* calls SpawnPosixServer from C++ code */
+
+	close_console=1;
+	test_Next("Do tests with posix server for COM1:");
+	client=create_thread(DoTestsSerial, "serial tests");
+	test(client);
+
+	start_thread(client);
+	err=wait_for_thread(client);
+	test(0 == err);
+
+
+	test_Close();
+	return 0;
+	}
+