summaryrefslogtreecommitdiffstats
path: root/tests/winDde.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/winDde.test')
-rw-r--r--tests/winDde.test264
1 files changed, 254 insertions, 10 deletions
diff --git a/tests/winDde.test b/tests/winDde.test
index 06dab25..a23650d 100644
--- a/tests/winDde.test
+++ b/tests/winDde.test
@@ -2,17 +2,18 @@
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
-# generates output for errors. No output means no errors were found.
+# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: winDde.test,v 1.16 2003/05/16 22:00:47 patthoyts Exp $
+# RCS: @(#) $Id: winDde.test,v 1.17 2003/06/23 21:27:56 patthoyts Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
+ #tcltest::configure -verbose {pass start}
namespace import -force ::tcltest::*
}
@@ -34,10 +35,11 @@ if {$tcl_platform(platform) == "windows"} {
set scriptName [makeFile {} script1.tcl]
-proc createChildProcess { ddeServerName } {
+proc createChildProcess { ddeServerName {handler {}}} {
file delete -force $::scriptName
set f [open $::scriptName w+]
+ puts $f [list set ddeServerName $ddeServerName]
puts $f {
# DDE child server -
#
@@ -59,15 +61,37 @@ proc createChildProcess { ddeServerName } {
# If an error occurs during the tests, this process may end up not
# being closed down. To deal with this we create a 30s timeout.
- proc DoTimeout {} {
- global done
- puts stderr "winDde.test child process $ddeServerName timed out."
+ proc ::DoTimeout {} {
+ global done ddeServerName
set done 1
+ puts "winDde.test child process $ddeServerName timed out."
+ flush stdout
+ }
+ set timeout [after 30000 ::DoTimeout]
+
+ # Define a restricted handler.
+ proc Handler1 {cmd} {
+ if {$cmd eq "stop"} {set ::done 1}
+ puts $cmd ; flush stdout
+ return
+ }
+ proc Handler2 {cmd} {
+ if {$cmd eq "stop"} {set ::done 1}
+ puts [uplevel \#0 $cmd] ; flush stdout
+ return
+ }
+ proc Handler3 {prefix cmd} {
+ if {$cmd eq "stop"} {set ::done 1}
+ puts [list $prefix $cmd] ; flush stdout
+ return
}
- set timeout [after 30000 DoTimeout]
}
# set the dde server name to the supplied argument.
- puts $f [list dde servername $ddeServerName]
+ if {$handler == {}} {
+ puts $f [list dde servername $ddeServerName]
+ } else {
+ puts $f [list dde servername -handler $handler -- $ddeServerName]
+ }
puts $f {
# run the server and handle final cleanup.
after 200;# give dde a chance to get going.
@@ -212,7 +236,7 @@ test winDde-5.4 {DDE eval bad arguments} {pcOnly} {
test winDde-6.1 {DDE servername bad arguments} \
-constraints pcOnly \
-body {list [catch {dde servername -z -z -z} msg] $msg} \
- -result {1 {wrong # args: should be "dde servername ?-exact? ?--? ?serverName?"}}
+ -result {1 {wrong # args: should be "dde servername ?-exact? ?-handler proc? ?--? ?serverName?"}}
test winDde-6.2 {DDE servername set name} \
-constraints pcOnly \
@@ -338,11 +362,231 @@ test winDde-7.5 {interp name collision without -exact} \
} \
-result "dde-interp-7.5 #2"
+# -------------------------------------------------------------------------
+
+test winDde-8.1 {Safe DDE load} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ } \
+ -body {
+ list [catch {slave eval dde servername slave} msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {1 {invalid command name "dde"}}
+
+test winDde-8.2 {Safe DDE set servername} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ } \
+ -body {
+ slave invokehidden dde servername slave
+ } \
+ -cleanup {interp delete slave} \
+ -result {slave}
+
+test winDde-8.3 {Safe DDE check handler required for eval} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave invokehidden dde servername slave
+ } \
+ -body {
+ catch {dde eval slave set a 1} msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {1}
+
+test winDde-8.4 {Safe DDE check that execute is denied} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave invokehidden dde servername slave
+ } \
+ -body {
+ slave eval set a 1
+ list [catch {
+ dde execute TclEval slave {set a 2}
+ slave eval set a
+ } msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {0 1}
+
+test winDde-8.5 {Safe DDE check that request is denied} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave invokehidden dde servername slave
+ } \
+ -body {
+ slave eval set a 1
+ list [catch {dde request TclEval slave a} msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {1 {remote server cannot handle this command}}
+
+test winDde-8.6 {Safe DDE assign handler procedure} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
+ } \
+ -body {
+ slave invokehidden dde servername -handler DDEACCEPT slave
+ } \
+ -cleanup {interp delete slave} \
+ -result slave
+
+test winDde-8.7 {Safe DDE check simple command} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
+ slave invokehidden dde servername -handler DDEACCEPT slave
+ } \
+ -body {
+ list [catch {
+ dde eval slave set x 1
+ } msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {0 {set x 1}}
+
+test winDde-8.8 {Safe DDE check non-list command} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
+ slave invokehidden dde servername -handler DDEACCEPT slave
+ } \
+ -body {
+ list [catch {
+ set s "c:\\Program Files\\Microsoft Visual Studio\\"
+ dde eval slave $s
+ string compare [slave eval set DDECMD] $s
+ } msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {0 0}
+
+test winDde-8.9 {Safe DDE check command evaluation} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel #0 $cmd]}}
+ slave invokehidden dde servername -handler DDEACCEPT slave
+ } \
+ -body {
+ list [catch {
+ dde eval slave set x 1
+ slave eval set x
+ } msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {0 1}
+
+test winDde-8.10 {Safe DDE check command evaluation (2)} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel #0 $cmd]}}
+ slave invokehidden dde servername -handler DDEACCEPT slave
+ } \
+ -body {
+ list [catch {
+ dde eval slave [list set x 1]
+ slave eval set x
+ } msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {0 1}
+
+test winDde-8.11 {Safe DDE check command evaluation (3)} \
+ -constraints pcOnly \
+ -setup {
+ interp create -safe slave
+ slave invokehidden load $lib dde
+ slave eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel #0 $cmd]}}
+ slave invokehidden dde servername -handler DDEACCEPT slave
+ } \
+ -body {
+ list [catch {
+ dde eval slave [list [list set x 1]]
+ slave eval set x
+ } msg] $msg
+ } \
+ -cleanup {interp delete slave} \
+ -result {1 {invalid command name "set x 1"}}
+
+# -------------------------------------------------------------------------
+
+test winDde-9.1 {External safe DDE check string passing} \
+ -constraints {pcOnly stdio} \
+ -setup {
+ set name child-9.1
+ set child [createChildProcess $name Handler1]
+ file copy -force script1.tcl dde-script.tcl
+ } \
+ -body {
+ list [catch {
+ dde eval $name set x 1
+ gets $child line
+ set line
+ } msg] $msg
+ } \
+ -cleanup {dde execute TclEval $name stop ; update} \
+ -result {0 {set x 1}}
+
+test winDde-9.2 {External safe DDE check command evaluation} \
+ -constraints {pcOnly stdio} \
+ -setup {
+ set name child-9.2
+ set child [createChildProcess $name Handler2]
+ file copy -force script1.tcl dde-script.tcl
+ } \
+ -body {
+ list [catch {
+ dde eval $name set x 1
+ gets $child line
+ set line
+ } msg] $msg
+ } \
+ -cleanup {dde execute TclEval $name stop ; update} \
+ -result {0 1}
+
+test winDde-9.3 {External safe DDE check prefixed arguments} \
+ -constraints {pcOnly stdio} \
+ -setup {
+ set name child-9.3
+ set child [createChildProcess $name [list Handler3 ARG]]
+ file copy -force script1.tcl dde-script.tcl
+ } \
+ -body {
+ list [catch {
+ dde eval $name set x 1
+ gets $child line
+ set line
+ } msg] $msg
+ } \
+ -cleanup {dde execute TclEval $name stop ; update} \
+ -result {0 {ARG {set x 1}}}
# -------------------------------------------------------------------------
#cleanup
-catch {interp delete $slave}; # ensure we clean up the slave.
+#catch {interp delete $slave}; # ensure we clean up the slave.
file delete -force $::scriptName
::tcltest::cleanupTests
return