diff -r 000000000000 -r bde4ae8d615e os/ossrv/genericopenlibs/cstdlib/TSTLIB/tser1.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/genericopenlibs/cstdlib/TSTLIB/tser1.c Fri Jun 15 03:10:57 2012 +0200 @@ -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 /* definition of exit() */ +#include +#include +#include +#include +#include +#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; + } +