diff --git a/streamApp/tests/streamtestlib.tcl b/streamApp/tests/streamtestlib.tcl index c523b26..2e0c6e2 100644 --- a/streamApp/tests/streamtestlib.tcl +++ b/streamApp/tests/streamtestlib.tcl @@ -41,7 +41,7 @@ proc receiveHandler {sock} { } proc startioc {} { - global debug records protocol startup port sock ioc testname env slsstyle streamversion + global debug records protocol startup port sock ioc testname env streamversion set fd [open test.db w] puts $fd $records close $fd @@ -50,13 +50,9 @@ proc startioc {} { close $fd set fd [open test.cmd w 0777] - if {$slsstyle} { + if [info exists streamversion] { puts $fd "#!/usr/local/bin/iocsh" - if [info exists streamversion] { - puts $fd "require stream,$streamversion" - } else { - puts $fd "require stream" - } + puts $fd "require stream,$streamversion" } else { puts $fd "#!../O.$env(EPICS_HOST_ARCH)/streamApp" puts $fd "dbLoadDatabase ../O.Common/streamApp.dbd" @@ -71,7 +67,7 @@ proc startioc {} { puts $fd "dbior stream 2" puts $fd "var streamDebug 1" close $fd - if $slsstyle { + if [info exists streamversion] { set ioc [open "|iocsh test.cmd >& $testname.ioclog 2>@stderr" w] } else { set ioc [open "|../O.$env(EPICS_HOST_ARCH)/streamApp test.cmd >& $testname.ioclog 2>@stderr" w] @@ -94,8 +90,8 @@ proc ioccmd {command} { } proc send {string} { - global sock - debugmsg "sending \"[escape $string]\"" + global sock lastsent + set lastsent $string puts -nonewline $sock $string } @@ -125,6 +121,7 @@ set faults 0 proc assure {args} { global faults global lastcommand + global lastsent global line incr line @@ -146,6 +143,9 @@ proc assure {args} { } if {[llength $notfound] || [llength $input]} { puts stderr "In command \"$lastcommand\"" + if [info exists lastsent] { + puts stderr "last sent: \"[escape $lastsent]\"" + } } foreach string $notfound { puts stderr "Error in assure: line $line missing \"[escape $string]\"" @@ -182,10 +182,10 @@ proc finish {} { after 100 close $ioc if $faults { - puts "Test failed." + puts "\033\[31;7mTest failed.\033\[0m" exit 1 } - puts "Test passed." + puts "\033\[32mTest passed.\033\[0m" eval file delete [glob -nocomplain test.*] StreamDebug.log $testname.ioclog } @@ -193,12 +193,8 @@ set port 40123 socket -server deviceconnect $port set inputlog [open "test.inputlog" w] -set slsstyle 0 -if {[lindex $argv 0] == "--sls"} { - set argv [lrange $argv 1 end] - set slsstyle 1 -} -if {[lindex $argv 0] == "--ver"} { +# SLS style driver modules (optionally with version) +if {[lindex $argv 0] == "-sls"} { set streamversion [lindex $argv 1] set argv [lrange $argv 2 end] } diff --git a/streamApp/tests/test64Bit b/streamApp/tests/test64Bit index 476bbc6..63b6a37 100755 --- a/streamApp/tests/test64Bit +++ b/streamApp/tests/test64Bit @@ -29,6 +29,8 @@ set records { field (OUT, "@test.proto mbbo device") field (ZRVL, "0") field (ONVL, "-1") + field (ZRST, "0") + field (ONST, "-1") } record (mbboDirect, "DZ:mbboDirect") { @@ -75,7 +77,7 @@ ioccmd {dbpf DZ:longout -1} assure "longout -1 -1\n" ioccmd {dbpf DZ:bo 1} assure "bo 4294967295 ffffffff 11111111111111111111111111111111\n" -ioccmd {dbpf DZ:mbbo 1} +ioccmd {dbpf DZ:mbbo -1} assure "mbbo 4294967295 ffffffff 11111111111111111111111111111111\n" ioccmd {dbpf DZ:mbboDirect.B0 1} assure "mbboDirect 1 1 1\n" diff --git a/streamApp/tests/testCharset b/streamApp/tests/testCharset new file mode 100755 index 0000000..2f44b5d --- /dev/null +++ b/streamApp/tests/testCharset @@ -0,0 +1,108 @@ +#!/usr/bin/env tclsh +source streamtestlib.tcl + +# Define records, protocol and startup (text goes to files) +# The asynPort "device" is connected to a network TCP socket +# Talk to the socket with send/receive/assure +# Send commands to the ioc shell with ioccmd + +set records { + record (stringin, "DZ:test1") + { + field (DTYP, "stream") + field (INP, "@test.proto test1 device") + } + record (stringin, "DZ:test2") + { + field (DTYP, "stream") + field (INP, "@test.proto test2 device") + } + record (stringin, "DZ:test3") + { + field (DTYP, "stream") + field (INP, "@test.proto test3 device") + } + record (stringin, "DZ:test4") + { + field (DTYP, "stream") + field (INP, "@test.proto test4 device") + } +} + +set protocol { + Terminator = LF; + extraInput=ignore; + @mismatch {out "mismatch";} + test1 {in "%[a-zA-Z1-5]%(DESC) #s"; out "%s|%(DESC)s" } + test2 {in "%[]A-Za-z ]%(DESC) #s"; out "%s|%(DESC)s" } + test3 {in "%[^]A-Z]%(DESC) #s"; out "%s|%(DESC)s" } + test4 {in "%[^]-A-Z]%(DESC) #s"; out "%s|%(DESC)s" } +} + +set startup { +} + +set debug 0 + +startioc + +ioccmd {dbpf DZ:test1.PROC 1} +send "This is a test\n" +assure "This| is a test\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "Test123]bla\n" +assure "Test123|]bla\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "Test123456\n" +assure "Test12345|6\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "Test43210\n" +assure "Test4321|0\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "test-bla\n" +assure "test|-bla\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " Space first\n" +assure "| Space first\n" + +ioccmd {dbpf DZ:test2.PROC 1} +send "This is a test\n" +assure "This is a test|\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "Test]xx123bla\n" +assure "Test]xx|123bla\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "test-bla\n" +assure "test|-bla\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " Space first\n" +assure " Space first|\n" + +ioccmd {dbpf DZ:test3.PROC 1} +send "this is a test\n" +assure "this is a test|\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "test]xx123bla\n" +assure "test|]xx123bla\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "test-bla\n" +assure "test-bla|\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " Space first\n" +assure " |Space first\n" + +ioccmd {dbpf DZ:test4.PROC 1} +send "this is a test\n" +assure "this is a test|\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "test]xx123bla\n" +assure "test|]xx123bla\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "test-bla\n" +assure "test|-bla\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " Space first\n" +assure " |Space first\n" + +finish + diff --git a/streamApp/tests/testInteger b/streamApp/tests/testInteger new file mode 100755 index 0000000..b100c99 --- /dev/null +++ b/streamApp/tests/testInteger @@ -0,0 +1,455 @@ +#!/usr/bin/env tclsh +source streamtestlib.tcl + +# Define records, protocol and startup (text goes to files) +# The asynPort "device" is connected to a network TCP socket +# Talk to the socket with send/receive/assure +# Send commands to the ioc shell with ioccmd + +set records { + record (ai, "DZ:test1") + { + field (DTYP, "stream") + field (INP, "@test.proto test1 device") + } + record (ai, "DZ:test2") + { + field (DTYP, "stream") + field (INP, "@test.proto test2 device") + } + record (ai, "DZ:test3") + { + field (DTYP, "stream") + field (INP, "@test.proto test3 device") + } + record (ai, "DZ:test4") + { + field (DTYP, "stream") + field (INP, "@test.proto test4 device") + } + record (ai, "DZ:test5") + { + field (DTYP, "stream") + field (INP, "@test.proto test5 device") + } + record (ai, "DZ:test6") + { + field (DTYP, "stream") + field (INP, "@test.proto test6 device") + } + record (ai, "DZ:test7") + { + field (DTYP, "stream") + field (INP, "@test.proto test7 device") + } + record (ai, "DZ:test8") + { + field (DTYP, "stream") + field (INP, "@test.proto test8 device") + } + record (ai, "DZ:test9") + { + field (DTYP, "stream") + field (INP, "@test.proto test9 device") + } + record (ai, "DZ:test10") + { + field (DTYP, "stream") + field (INP, "@test.proto test10 device") + } +} + +set protocol { + Terminator = LF; + extraInput=ignore; + @mismatch {out "mismatch";} + test1 {in "%i"; out "%i"; } + test2 {in "%d"; out "%d"; } + test3 {in "%u"; out "%u"; } + test4 {in "%x"; out "%x"; } + test5 {in "%o"; out "%o"; } + test6 {in "%4i"; out "%i"; } + test7 {in "% 4i"; out "%i"; } + test8 {in "%#i"; out "%i"; } + test9 {in "%-x"; out "%i"; } + test10 {in "%-o"; out "%i"; } +} + +set startup { +} + +set debug 0 + +startioc + +ioccmd {dbpf DZ:test1.PROC 1} +send "12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "-12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " 12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " -12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " 0x12345\n" +assure "74565\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " 012345\n" +assure "5349\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "-0x12345\n" +assure "-74565\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "0xffffffff\n" +assure "-1\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "-0xffffffff\n" +assure "1\n" + +ioccmd {dbpf DZ:test2.PROC 1} +send "12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "-12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " 12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " -12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " 0x12345\n" +assure "0\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " 012345\n" +assure "12345\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "-0x12345\n" +assure "0\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "0xffffffff\n" +assure "0\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "-0xffffffff\n" +assure "0\n" + +ioccmd {dbpf DZ:test3.PROC 1} +send "12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "-12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " 12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " -12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " 0x12345\n" +assure "0\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " 012345\n" +assure "12345\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "-0x12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "0xffffffff\n" +assure "0\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "-0xffffffff\n" +assure "mismatch\n" + +ioccmd {dbpf DZ:test4.PROC 1} +send "12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "-12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " 12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " -12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " 0x12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " 012345\n" +assure "12345\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "-0x12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "0xffffffff\n" +assure "ffffffff\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "-0xffffffff\n" +assure "mismatch\n" + +ioccmd {dbpf DZ:test5.PROC 1} +send "12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test5.PROC 1} +send "-12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " 12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " -12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test5.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test5.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " 0x12345\n" +assure "0\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " 012345\n" +assure "12345\n" +ioccmd {dbpf DZ:test5.PROC 1} +send "-0x12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test5.PROC 1} +send "0xffffffff\n" +assure "0\n" +ioccmd {dbpf DZ:test5.PROC 1} +send "-0xffffffff\n" +assure "mismatch\n" + +ioccmd {dbpf DZ:test6.PROC 1} +send "12345\n" +assure "1234\n" +ioccmd {dbpf DZ:test6.PROC 1} +send "-12345\n" +assure "-123\n" +ioccmd {dbpf DZ:test6.PROC 1} +send " 12345\n" +assure "1234\n" +ioccmd {dbpf DZ:test6.PROC 1} +send " -12345\n" +assure "-123\n" +ioccmd {dbpf DZ:test6.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test6.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test6.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test6.PROC 1} +send " 0x12345\n" +assure "18\n" +ioccmd {dbpf DZ:test6.PROC 1} +send " 012345\n" +assure "83\n" +ioccmd {dbpf DZ:test6.PROC 1} +send "-0x12345\n" +assure "-1\n" +ioccmd {dbpf DZ:test6.PROC 1} +send "0xffffffff\n" +assure "255\n" +ioccmd {dbpf DZ:test6.PROC 1} +send "-0xffffffff\n" +assure "-15\n" + +ioccmd {dbpf DZ:test7.PROC 1} +send "12345\n" +assure "1234\n" +ioccmd {dbpf DZ:test7.PROC 1} +send "-12345\n" +assure "-123\n" +ioccmd {dbpf DZ:test7.PROC 1} +send " 12345\n" +assure "1\n" +ioccmd {dbpf DZ:test7.PROC 1} +send " -12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test7.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test7.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test7.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test7.PROC 1} +send " 0x12345\n" +assure "1\n" +ioccmd {dbpf DZ:test7.PROC 1} +send " 012345\n" +assure "10\n" +ioccmd {dbpf DZ:test7.PROC 1} +send "-0x12345\n" +assure "-1\n" +ioccmd {dbpf DZ:test7.PROC 1} +send "0xffffffff\n" +assure "255\n" +ioccmd {dbpf DZ:test7.PROC 1} +send "-0xffffffff\n" +assure "-15\n" + +ioccmd {dbpf DZ:test8.PROC 1} +send "12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test8.PROC 1} +send "-12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test8.PROC 1} +send " 12345\n" +assure "12345\n" +ioccmd {dbpf DZ:test8.PROC 1} +send " -12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test8.PROC 1} +send "- 12345\n" +assure "-12345\n" +ioccmd {dbpf DZ:test8.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test8.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test8.PROC 1} +send " 0x12345\n" +assure "74565\n" +ioccmd {dbpf DZ:test8.PROC 1} +send " 012345\n" +assure "5349\n" +ioccmd {dbpf DZ:test8.PROC 1} +send "-0x12345\n" +assure "-74565\n" +ioccmd {dbpf DZ:test8.PROC 1} +send "0xffffffff\n" +assure "-1\n" +ioccmd {dbpf DZ:test8.PROC 1} +send "-0xffffffff\n" +assure "1\n" + +ioccmd {dbpf DZ:test9.PROC 1} +send "12345\n" +assure "74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send "-12345\n" +assure "-74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send " 12345\n" +assure "74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send " -12345\n" +assure "-74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test9.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test9.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test9.PROC 1} +send " 0x12345\n" +assure "74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send " 012345\n" +assure "74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send "-0x12345\n" +assure "-74565\n" +ioccmd {dbpf DZ:test9.PROC 1} +send "0xffffffff\n" +assure "-1\n" +ioccmd {dbpf DZ:test9.PROC 1} +send "-0xffffffff\n" +assure "1\n" + +ioccmd {dbpf DZ:test10.PROC 1} +send "12345\n" +assure "5349\n" +ioccmd {dbpf DZ:test10.PROC 1} +send "-12345\n" +assure "-5349\n" +ioccmd {dbpf DZ:test10.PROC 1} +send " 12345\n" +assure "5349\n" +ioccmd {dbpf DZ:test10.PROC 1} +send " -12345\n" +assure "-5349\n" +ioccmd {dbpf DZ:test10.PROC 1} +send "- 12345\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test10.PROC 1} +send "\n" +assure "mismatch\n" +ioccmd {dbpf DZ:test10.PROC 1} +send " \n" +assure "mismatch\n" +ioccmd {dbpf DZ:test10.PROC 1} +send " 0x12345\n" +assure "0\n" +ioccmd {dbpf DZ:test10.PROC 1} +send " 012345\n" +assure "5349\n" +ioccmd {dbpf DZ:test10.PROC 1} +send "-0x12345\n" +assure "0\n" +ioccmd {dbpf DZ:test10.PROC 1} +send "0xffffffff\n" +assure "0\n" +ioccmd {dbpf DZ:test10.PROC 1} +send "-0xffffffff\n" +assure "0\n" + +finish diff --git a/streamApp/tests/testPerformance b/streamApp/tests/testPerformance new file mode 100755 index 0000000..74fce3a --- /dev/null +++ b/streamApp/tests/testPerformance @@ -0,0 +1,55 @@ +#!/usr/bin/env tclsh +source streamtestlib.tcl + +# Define records, protocol and startup (text goes to files) +# The asynPort "device" is connected to a network TCP socket +# Talk to the socket with send/receive/assure +# Send commands to the ioc shell with ioccmd + +set records { + record (waveform, "DZ:test1") + { + field (DTYP, "stream") + field (FTVL, "DOUBLE") + field (NELM, "1048576") + field (INP, "@test.proto test1 device") + } +} + +set protocol { + replyTimeout =600000; + Terminator = LF; + Separator = ","; + test1 {in "%f"; out "%(NORD)d";} +} + +set startup { +} + +set debug 0 + +set message "3.1415" +set size 1 +set timeout 600000 + +startioc + ioccmd {dbpf DZ:test1.PROC 1} + send "$message\n" + assure "$size\n" + +ioccmd {var streamDebug 0} +for {set log 1} {$log <= 21} {incr log} { + set output "$message\n" + set starttime [clock clicks] + send $output + ioccmd {dbpf DZ:test1.PROC 1} + assure "$size\n" + set duration [expr [clock clicks] - $starttime] + set performance($size) [expr $duration*1.0/$size] + puts [format "size %7d duration: %8d time/element: %6.1f" $size $duration $performance($size)] + if {$performance($size) > $performance(1)} {incr faults} + set message "$message,$message" + set size [expr $size*2] +} + +finish diff --git a/streamApp/tests/testStreamBuffer b/streamApp/tests/testStreamBuffer index e0718cd..c18a269 100755 --- a/streamApp/tests/testStreamBuffer +++ b/streamApp/tests/testStreamBuffer @@ -8,15 +8,15 @@ int main () { StreamBuffer haystack = "12345abc123xyz123"; StreamBuffer needle = "1n4m6p7q"; needle.remove(2,4); - assert (needle.equals("1n7q")); + assert (needle.startswith("1n7q")); needle.append("2x3y"); - assert (needle.equals("1n7q2x3y")); + assert (needle.startswith("1n7q2x3y")); needle.remove(4); - assert (needle.equals("2x3y")); + assert (needle.startswith("2x3y")); needle.remove(1,1); - assert (needle.equals("23y")); + assert (needle.startswith("23y")); needle.truncate(-1); - assert (needle.equals("23")); + assert (needle.startswith("23")); assert (haystack.find(needle) == 1); assert (haystack.find(needle, 2) == 9); assert (haystack.find(needle, -5) == 15); @@ -54,6 +54,11 @@ EOF g++ -I ../../src ../../src/O.$EPICS_HOST_ARCH/StreamBuffer.o test.cc -o test.exe -test.exe || exit 1 +test.exe +if [ $? != 0 ] +then + echo -e "\033[31;7mTest failed.\033[0m" + exit 1 +fi rm test.* -echo "Test passed." +echo -e "\033[32mTest passed.\033[0m" diff --git a/streamApp/tests/testString b/streamApp/tests/testString new file mode 100755 index 0000000..bd8995d --- /dev/null +++ b/streamApp/tests/testString @@ -0,0 +1,124 @@ +#!/usr/bin/env tclsh +source streamtestlib.tcl + +# Define records, protocol and startup (text goes to files) +# The asynPort "device" is connected to a network TCP socket +# Talk to the socket with send/receive/assure +# Send commands to the ioc shell with ioccmd + +set records { + record (stringin, "DZ:test1") + { + field (DTYP, "stream") + field (INP, "@test.proto test1 device") + } + record (stringin, "DZ:test2") + { + field (DTYP, "stream") + field (INP, "@test.proto test2 device") + } + record (stringin, "DZ:test3") + { + field (DTYP, "stream") + field (INP, "@test.proto test3 device") + } + record (stringin, "DZ:test4") + { + field (DTYP, "stream") + field (INP, "@test.proto test4 device") + } + record (stringin, "DZ:test5") + { + field (DTYP, "stream") + field (INP, "@test.proto test5 device") + } +} + +set protocol { + Terminator = LF; + extraInput=ignore; + @mismatch {out "mismatch";} + test1 {in "%s%(DESC) #s"; out "%s|%(DESC)s" } + test2 {in "% s%(DESC) #s"; out "%s|%(DESC)s" } + test3 {in "%#s%(DESC) #s"; out "%s|%(DESC)s" } + test4 {in "%# s%(DESC) #s"; out "%s|%(DESC)s" } + test5 {in "% #s%(DESC) #s"; out "%s|%(DESC)s" } +} + +set startup { +} + +set debug 0 + +startioc + +ioccmd {dbpf DZ:test1.PROC 1} +send "foobar\n" +assure "foobar|\n" +ioccmd {dbpf DZ:test1.PROC 1} +send " foobar \n" +assure "foobar| \n" +ioccmd {dbpf DZ:test1.PROC 1} +send " foo bar \n" +assure "foo| bar \n" +ioccmd {dbpf DZ:test1.PROC 1} +send " \n" +assure "|\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "ThisIsAVeryLongInputStringThatExceedsFouryCharacters right?\n" +assure "ThisIsAVeryLongInputStringThatExceedsFo| right?\n" + +ioccmd {dbpf DZ:test2.PROC 1} +send "foobar\n" +assure "foobar|\n" +ioccmd {dbpf DZ:test2.PROC 1} +send " foobar \n" +assure " foobar| \n" +ioccmd {dbpf DZ:test2.PROC 1} +send " foo bar \n" +assure " foo| bar \n" +ioccmd {dbpf DZ:test2.PROC 1} +send " \n" +assure " |\n" + +ioccmd {dbpf DZ:test3.PROC 1} +send "foobar\n" +assure "foobar|\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " foobar \n" +assure "foobar |\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " foo bar \n" +assure "foo bar |\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " \n" +assure "|\n" + +ioccmd {dbpf DZ:test4.PROC 1} +send "foobar\n" +assure "foobar|\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " foobar \n" +assure " foobar |\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " foo bar \n" +assure " foo bar |\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " \n" +assure " |\n" + +ioccmd {dbpf DZ:test5.PROC 1} +send "foobar\n" +assure "foobar|\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " foobar \n" +assure " foobar |\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " foo bar \n" +assure " foo bar |\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " \n" +assure " |\n" + +finish + diff --git a/streamApp/tests/testTimestamp b/streamApp/tests/testTimestamp index 616995f..165be83 100755 --- a/streamApp/tests/testTimestamp +++ b/streamApp/tests/testTimestamp @@ -22,13 +22,37 @@ set records { field (DTYP, "stream") field (INP, "@test.proto test3 device") } + record (ai, "DZ:test4") + { + field (DTYP, "stream") + field (INP, "@test.proto test4 device") + } + record (ai, "DZ:test5") + { + field (DTYP, "stream") + field (INP, "@test.proto test5 device") + } + record (ai, "DZ:test6") + { + field (DTYP, "stream") + field (INP, "@test.proto test6 device") + } + record (ai, "DZ:test7") + { + field (DTYP, "stream") + field (INP, "@test.proto test7 device") + } } set protocol { Terminator = LF; test1 {out "%T(%d.%m.%Y %H:%M:%.2S %z)"; } - test2 {out "?"; in "%T"; out "%.0f %T"; } - test3 {out "?"; in "%(TIME)T(%Ed. %B %Y %H:%M:%.S%+0100) %f"; out "%(TIME)T %f"; } + test2 {in "%T"; out "%.0f %T"; } + test3 {in "%(TIME)T(%Ed. %B %Y %H:%M:%.S) %f"; out "%(TIME)T(%d.%m.%Y %H:%M:%.2S %z)"; } + test4 {in "%(TIME)T(%c) %f"; out "%(TIME)T(%a %d.%m.%Y %H:%M:%.2S %z)"; } + test5 {in "%T(%H %p)"; out "%T(%H)"; } + test6 {in "%T(%p %H)"; out "%T(%H)"; } + test7 {in "%T(%d.%m.%Y %T %z)"; out "%T(%d.%m.%Y %T %z) %.6f"; } } set startup { @@ -36,23 +60,93 @@ set startup { set debug 0 +package require Epics +proc checkTS {pv timestamp} { + global faults + pvget $pv + array set PV [pvinfo $pv] + if {$PV(TIME) != $timestamp} { + puts "expected timestamp: $timestamp" + puts "received timestamp: $PV(TIME)" + incr faults + } +} + startioc ioccmd {dbpf DZ:test1 1044068706.789} assure "01.02.2003 04:05:06.79 +0100\n" +ioccmd {dbpf DZ:test1 1057025106.789} +assure "01.07.2003 04:05:06.79 +0200\n" + ioccmd {dbpf DZ:test2.PROC 1} -assure "?\n" -send "2003-02-01 04:05:06 +0100\n" -assure "1044068706 2003-02-01 04:05:06 +0100\n"; +send "2003-02-01 04:05:06\n" +assure "1044068706 2003-02-01 04:05:06\n"; ioccmd {dbpf DZ:test3.PROC 1} -assure "?\n" -send "1. Feb 2003 04:05:06.789 3.1415\n" -assure "2003-02-01 04:05:06 +0100 3.141500\n"; +send "1. February 2003 04:05:06.789 3.1415\n" +assure "01.02.2003 04:05:06.79 +0100\n"; +checkTS DZ:test3 "02/01/03 04:05:06.789000000" -package require Epics -array set PV [pvinfo DZ:test3.TSE] -if {$PV(VAL) != -2 || $PV(TIME) != "02/01/03 04:05:06.789000000"} {incr faults} +ioccmd {dbpf DZ:test3.PROC 1} +send "1. July 2003 04:05:06.789123 3.1415\n" +assure "01.07.2003 04:05:06.79 +0200\n"; +checkTS DZ:test3 "07/01/03 04:05:06.789123000" +ioccmd {dbpf DZ:test4.PROC 1} +send "mon jan 2 04:05:06 2003 3.1415\n" +assure "Thu 02.01.2003 04:05:06.00 +0100\n"; +checkTS DZ:test4 "01/02/03 04:05:06.000000000" + +ioccmd {dbpf DZ:test5.PROC 1} +send "12 a\n" +assure "00\n"; +ioccmd {dbpf DZ:test5.PROC 1} +send "01 a\n" +assure "01\n"; +ioccmd {dbpf DZ:test5.PROC 1} +send "2 a\n" +assure "02\n"; +ioccmd {dbpf DZ:test5.PROC 1} +send "11 a\n" +assure "11\n"; +ioccmd {dbpf DZ:test5.PROC 1} +send "12 p\n" +assure "12\n"; +ioccmd {dbpf DZ:test5.PROC 1} +send "01 p\n" +assure "13\n"; +ioccmd {dbpf DZ:test5.PROC 1} +send "11 p\n" +assure "23\n"; + +ioccmd {dbpf DZ:test6.PROC 1} +send "am 12\n" +assure "00\n"; +ioccmd {dbpf DZ:test6.PROC 1} +send "Am 01\n" +assure "01\n"; +ioccmd {dbpf DZ:test6.PROC 1} +send "aM 2\n" +assure "02\n"; +ioccmd {dbpf DZ:test6.PROC 1} +send "AM 11\n" +assure "11\n"; +ioccmd {dbpf DZ:test6.PROC 1} +send "p 12\n" +assure "12\n"; +ioccmd {dbpf DZ:test6.PROC 1} +send "P 01\n" +assure "13\n"; +ioccmd {dbpf DZ:test6.PROC 1} +send "PM 11\n" +assure "23\n"; + +ioccmd {dbpf DZ:test7.PROC 1} +send "1.2.2010 13:56:32 +0000\n" +assure "01.02.2010 12:56:32 +0100 1265032592.000000\n"; +ioccmd {dbpf DZ:test7.PROC 1} +send "1.7.2010 13:56:32 +0000\n" +assure "01.07.2010 13:56:32 +0200 1277992592.000000\n"; finish diff --git a/streamApp/tests/testWaveform b/streamApp/tests/testWaveform new file mode 100755 index 0000000..0757bf0 --- /dev/null +++ b/streamApp/tests/testWaveform @@ -0,0 +1,124 @@ +#!/usr/bin/env tclsh +source streamtestlib.tcl + +# Define records, protocol and startup (text goes to files) +# The asynPort "device" is connected to a network TCP socket +# Talk to the socket with send/receive/assure +# Send commands to the ioc shell with ioccmd + +set records { + record (waveform, "DZ:test1") + { + field (DTYP, "stream") + field (FTVL, "DOUBLE") + field (NELM, "3") + field (INP, "@test.proto testd device") + } + record (waveform, "DZ:test2") + { + field (DTYP, "stream") + field (FTVL, "FLOAT") + field (NELM, "3") + field (INP, "@test.proto testd device") + } + record (waveform, "DZ:test3") + { + field (DTYP, "stream") + field (FTVL, "LONG") + field (NELM, "3") + field (INP, "@test.proto testi device") + } + record (waveform, "DZ:test4") + { + field (DTYP, "stream") + field (FTVL, "SHORT") + field (NELM, "3") + field (INP, "@test.proto testi device") + } + record (waveform, "DZ:test5") + { + field (DTYP, "stream") + field (FTVL, "STRING") + field (NELM, "3") + field (INP, "@test.proto tests device") + } +} + +set protocol { + Terminator = LF; + testd { + Separator = ","; + @mismatch {out "mismatch after %(NORD)d elements: %.1f\n"} + in "text %f end"; out "%(NORD)d elements: %.1f"; + } + testi { + Separator = " "; + @mismatch {out "mismatch after %(NORD)d elements: %i\n"} + in "%3i "; out "%(NORD)d elements: %i"; + } + tests { + Separator = " ... "; + @mismatch {out "mismatch after %(NORD)d elements: %s\n"} + in "%s "; out "%(NORD)d elements: %s"; + } +} + +set startup { +} + +set debug 0 + +startioc + +ioccmd {dbpf DZ:test1.PROC 1} +send "text 1.0,2.0,3.0 end\n" +assure "3 elements: 1.0,2.0,3.0\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "text 3, 2, 1 end\n" +assure "3 elements: 3.0,2.0,1.0\n" +ioccmd {dbpf DZ:test1.PROC 1} +send "text 7 end\n" +assure "1 elements: 7.0\n" + +ioccmd {dbpf DZ:test2.PROC 1} +send "text 1.0,2.0,3.0 end\n" +assure "3 elements: 1.0,2.0,3.0\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "text 3, 2, 1 end\n" +assure "3 elements: 3.0,2.0,1.0\n" +ioccmd {dbpf DZ:test2.PROC 1} +send "text 7 end\n" +assure "1 elements: 7.0\n" + +ioccmd {dbpf DZ:test3.PROC 1} +send "1 2 3\n" +assure "3 elements: 1 2 3\n" +ioccmd {dbpf DZ:test3.PROC 1} +send " 3 2 1 \n" +assure "3 elements: 3 2 1\n" +ioccmd {dbpf DZ:test3.PROC 1} +send "12345\n" +assure "2 elements: 123 45\n" + +ioccmd {dbpf DZ:test4.PROC 1} +send "1 2 3\n" +assure "3 elements: 1 2 3\n" +ioccmd {dbpf DZ:test4.PROC 1} +send " 3 2 1 \n" +assure "3 elements: 3 2 1\n" +ioccmd {dbpf DZ:test4.PROC 1} +send "12345\n" +assure "2 elements: 123 45\n" + +ioccmd {dbpf DZ:test5.PROC 1} +send "1...2...3\n" +assure "1 elements: 1...2...3\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " 3 ... 2 ... 1\n" +assure "3 elements: 3 ... 2 ... 1\n" +ioccmd {dbpf DZ:test5.PROC 1} +send " 7 \n" +assure "1 elements: 7\n" + + +finish diff --git a/streamApp/tests/testall b/streamApp/tests/testall index bad4529..f1621e8 100755 --- a/streamApp/tests/testall +++ b/streamApp/tests/testall @@ -2,17 +2,17 @@ for i in test* do if [ $i != testall -a -x $i ] then - echo $i - if ! $i + echo $i "$@" + if ! $i "$@" then - echo "Failed." + echo -e "\033[31;7mFailed.\033[0m" (( fail++ )) fi fi done if [ "$fail" ] -then echo "$fail tests failed" -else echo "All tests passsed." +then echo -e "\033[31;7m$fail tests failed\033[0m" +else echo -e "\033[32;7mAll tests passed.\033[0m" fi exit $fail