sl@0: /* sl@0: * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: #include /* definition of exit() */ sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "CTEST.H" sl@0: sl@0: sl@0: int GlobalPort; sl@0: sl@0: test_Data; sl@0: int close_console=0; sl@0: sl@0: /** sl@0: @SYMTestCaseID SYSLIB-STDLIB-CT-1099 sl@0: @SYMTestCaseDesc Tests for serial port sl@0: @SYMTestPriority High sl@0: @SYMTestActions Tests for serial port,and under posix server sl@0: @SYMTestExpectedResults Test must not fail sl@0: @SYMREQ REQ0000 sl@0: */ sl@0: void DoTests(char*port) sl@0: { sl@0: int port1, port2; sl@0: int int1 = 0; sl@0: int int2 = 0; sl@0: int ret=0; sl@0: int sigs[] = {0,0}; sl@0: int sig = 0; sl@0: sl@0: SerialConfig config; sl@0: SerialConfig newconfig; sl@0: sl@0: char buffer[1024]; sl@0: size_t size = 100; sl@0: sl@0: memset(&newconfig, 0, sizeof(newconfig)); sl@0: sl@0: test_Next("Open port"); sl@0: sl@0: port1 = open(port, 0); //exclusive sl@0: if (-1 != port1) sl@0: { sl@0: sl@0: //this one should fail sl@0: port2 = open(port, 0); sl@0: test_errno(-1==port2, EACCES); sl@0: sl@0: sl@0: test_Next("set signals"); sl@0: //play with the signals sl@0: ret = ioctl(port1, COMMIOCTL_SETSIGNALS, &sigs[0]); sl@0: test(-1 != ret); sl@0: sl@0: test_Next("get signals"); sl@0: ret = ioctl(port1, COMMIOCTL_GETSIGNALS, &sig); sl@0: test(-1 != ret); sl@0: sl@0: //try changing the settings sl@0: test_Next("port configuration"); sl@0: ret = ioctl(port1, COMMIOCTL_GETCONFIG, &config); sl@0: sl@0: config.iRate = Bps115200; sl@0: config.iDataBits = DBits6; sl@0: config.iStopBits=Stop2; sl@0: config.iParity=ParityOdd; sl@0: config.iHandshake=0; sl@0: config.iParityError=ConfigParityErrorFail; sl@0: config.iFifo=3; sl@0: config.iSpecialRate=0; sl@0: config.iTerminatorCount=0; sl@0: config.iTerminator[0]=0; sl@0: config.iXonChar=1; sl@0: config.iXoffChar=2; sl@0: config.iParityErrorChar=3; sl@0: config.iSIREnable=SIRDisable; sl@0: config.iSIRSettings=0; sl@0: sl@0: ret = ioctl(port1, COMMIOCTL_SETCONFIG, &config); sl@0: ret = ioctl(port1, COMMIOCTL_GETCONFIG, &newconfig); sl@0: sl@0: test(config.iRate == newconfig.iRate); sl@0: test(config.iDataBits==newconfig.iDataBits); sl@0: test(config.iStopBits==newconfig.iStopBits); sl@0: test(config.iParity==newconfig.iParity); sl@0: test(config.iHandshake==newconfig.iHandshake); sl@0: test(config.iParityError==newconfig.iParityError); sl@0: test(config.iFifo==newconfig.iFifo); sl@0: test(config.iSpecialRate==newconfig.iSpecialRate); sl@0: test(config.iTerminatorCount==newconfig.iTerminatorCount); sl@0: test(config.iTerminator[0]==newconfig.iTerminator[0]); sl@0: test(config.iXonChar==newconfig.iXonChar); sl@0: test(config.iXoffChar==newconfig.iXoffChar); sl@0: test(config.iParityErrorChar==newconfig.iParityErrorChar); sl@0: test(config.iSIREnable==newconfig.iSIREnable); sl@0: test(config.iSIRSettings==newconfig.iSIRSettings); sl@0: sl@0: test_Next("Buffer lengths"); sl@0: int1 = 0; sl@0: ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &int1); sl@0: test(ret != -1); sl@0: test(int1 != 0); sl@0: sl@0: int1 = 2048; sl@0: ret = ioctl(port1, COMMIOCTL_SETBUFFERLENGTH, &int1); sl@0: test(ret != -1); sl@0: sl@0: int2 = 0; sl@0: ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &int2); sl@0: test(ret != -1); sl@0: test(int1 == int2); sl@0: sl@0: sl@0: int1 = 100000000; sl@0: ret = ioctl(port1, COMMIOCTL_SETBUFFERLENGTH, &int1); sl@0: test(ret != -1); sl@0: sl@0: ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &int1); sl@0: test(ret != -1); sl@0: test(int1 == int2); //shoudn't have changed, val too big. sl@0: sl@0: sl@0: test_Next("break"); sl@0: sig = 5000; sl@0: ret = ioctl(port1, COMMIOCTL_BREAK, &sig); sl@0: //break isn't supported sl@0: test_errno(-1==ret, ENOSYS); sl@0: sl@0: sl@0: test_Next("read timeout"); sl@0: int1 = 2000; sl@0: ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &int1); sl@0: test (ret != -1); sl@0: sl@0: int2 = 0; sl@0: ret = ioctl(port1, COMMIOCTL_GETREADTIMEOUT, &int2); sl@0: test (ret != -1); sl@0: test(int2 == int1); sl@0: sl@0: sl@0: test_Next("read threshold"); sl@0: int1 = 2000; sl@0: ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &int1); sl@0: test (ret != -1); sl@0: sl@0: int2 = 0; sl@0: ret = ioctl(port1, COMMIOCTL_GETREADTHRESHOLD, &int2); sl@0: test(ret != -1); sl@0: test(int1 == int2); sl@0: sl@0: sl@0: sl@0: //signals sl@0: test_Next("test notifications supported"); sl@0: ret = ioctl(port1, COMMIOCTL_NOTIFYSUPPORTED, &int1); sl@0: test((int1 & (KNotifyFramingError|KNotifyOverrunError|KNotifyParityError)) == (KNotifyFramingError|KNotifyOverrunError|KNotifyParityError)); sl@0: printf("Notifications supported are %08x\n",int1); sl@0: sl@0: test_Next("Test read timeout with a threshold"); sl@0: int2 = 3000; sl@0: ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &int2); sl@0: test (ret != -1); sl@0: sl@0: int1 = 1; sl@0: ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &int1); sl@0: test (ret != -1); sl@0: sl@0: ret = read(port1, buffer, size); sl@0: test_errno(-1==ret, ETIMEDOUT); sl@0: sl@0: //no threshold, but with a 1 second timeout sl@0: test_Next("no threshold with timeout"); sl@0: int2 = 5000; sl@0: ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &int2); sl@0: test (ret != -1); sl@0: sl@0: int1 = -1; sl@0: ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &int1); sl@0: test (ret != -1); sl@0: sl@0: ret = read(port1, buffer, size); sl@0: test_errno(-1==ret, ETIMEDOUT); sl@0: sl@0: sl@0: close(port1); sl@0: } sl@0: else sl@0: printf("failed to open port %s with errno %d\n", port,errno); sl@0: } sl@0: sl@0: sl@0: sl@0: void DoTestsSerial(void) sl@0: { sl@0: DoTests("COM1:"); sl@0: sl@0: if (close_console) sl@0: { sl@0: test_Close(); sl@0: close(0); sl@0: close(1); sl@0: close(2); sl@0: } sl@0: } sl@0: sl@0: sl@0: sl@0: int main(void) sl@0: { sl@0: void* client; sl@0: int err; sl@0: sl@0: test_Title("Serial port test1"); sl@0: test_Next("Do tests with local server for COM1:"); sl@0: DoTests("COM1:"); sl@0: test_Next("Do tests with local server for COM2:"); sl@0: DoTests("COM2:"); sl@0: test_Next("Do tests with local server for COM3:"); sl@0: DoTests("COM3:"); sl@0: test_Next("Do tests with local server for COM4:"); sl@0: DoTests("COM4:"); sl@0: sl@0: sl@0: start_posix_server(); /* calls SpawnPosixServer from C++ code */ sl@0: sl@0: close_console=1; sl@0: test_Next("Do tests with posix server for COM1:"); sl@0: client=create_thread(DoTestsSerial, "serial tests"); sl@0: test(client); sl@0: sl@0: start_thread(client); sl@0: err=wait_for_thread(client); sl@0: test(0 == err); sl@0: sl@0: sl@0: test_Close(); sl@0: return 0; sl@0: } sl@0: