# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4 package require tcltest 2 namespace import tcltest::* ::tcltest::configure {*}$::argv set pwd [file dirname [file normalize $argv0]] source ../macports_test_autoconf.tcl # constraint for darwin platform testConstraint darwin [expr {$macports::autoconf::os_platform eq "darwin"}] package require macports 1.0 package require Thread source ./library.tcl # clean leftovers from interrupted tests file delete -force $pwd/tmpdir # use a local, temporary prefix for testing init_tmp_prefix $pwd $pwd/tmpdir # Debug options array set ui_options {} set ui_options(ports_noninteractive) yes mportinit ui_options test mportclose { Mport close unit test. } -setup { set mport [mportopen file://${pwd}] } -body { if {[catch {mportclose $mport}] != 0} { return "FAIL: cannot run mportclose" } if {[ditem_key $mport workername] ne ""} { return "FAIL: port not closed" } return "Mport close successful." } -cleanup { catch {mportclose $mport} } -result "Mport close successful." test mportinfo { Mport info unit test. } -setup { set mport [mportopen file://${pwd}] } -body { set res [mportinfo $mport] catch {array set PortInfo $res} if {![info exists PortInfo(canonical_active_variants)]} { return "FAIL: cannot get ::PortInfo" } return "Mport info successful." } -cleanup { mportclose $mport } -result "Mport info successful." test worker_init { Worker init unit test. } -setup { set name [interp create] set portpath $pwd/portpath set porturl https://www.macports.org set portbuildpath $pwd/build set options {a b} set variations {1 2} } -body { macports::worker_init $name $portpath $porturl $portbuildpath $options $variations if {$name ne "interp0"} { return "FAIL: wrong workername" } if {[catch {$name eval source Portfile} result]} { return "FAIL: cannot load Portfile" } if {[$name eval findBinary ls] ne "/bin/ls"} { return "FAIL: alias not created" } if {[$name eval return \$os_arch] ne $macports::os_arch} { return "FAIL: var not set" } return "Worker init successful." } -result "Worker init successful." test init_logging { Init logging unit test. } -constraints { root } -setup { set mport [mportopen file://${pwd}] } -body { if {[macports::init_logging $mport] != 0} { return "FAIL: incorrect channels" } return "Init logging successful." } -cleanup { mportclose $mport } -result "Init logging successful." test ui_isset { Ui is set unit test. } -body { namespace eval macports { array set ui_options { test yes } } if {[macports::ui_isset test] != 1} { return "FAIL: set option not detected" } if {[macports::ui_isset port] != 0} { return "FAIL: unset option detected" } return "ui_isset successful." } -result "ui_isset successful." test global_option_isset { Global option is set unit test. } -body { namespace eval macports { array set global_options { test yes } } if {[macports::global_option_isset test] != 1} { return "FAIL: set option not detected" } if {[macports::global_option_isset port] != 0} { return "FAIL: unset option detected" } return "Global option isset successful." } -result "Global option isset successful." test ch_logging { Channel logging unit test. Assumes main.log filename. } -constraints { root } -setup { set mport [mportopen file://${pwd}] set portname [_mportkey $mport subport] set portpath [_mportkey $mport portpath] set logname [macports::getportlogpath $portpath $portname] file delete -force $logname } -body { if {[macports::ch_logging $mport] != 0} { return "FAIL: channels not set" } if {![file exists $logname]} { return "FAIL: logname dir missing" } if {![file exists $logname/main.log]} { return "FAIL: main.log missing" } return "Channel logging successful." } -cleanup { mportclose $mport } -result "Channel logging successful." test push_log { Push log unit test. } -constraints { root } -setup { set mport [mportopen file://${pwd}] set ::logenabled 1 } -body { if {[catch {macports::push_log $mport}] != 0} { return "FAIL: cannot push log" } if {[lindex $::logstack 0] != [list $::debuglog $::debuglogname]} { return "FAIL: incorrect logstack" } return "Push log successful." } -cleanup { mportclose $mport } -result "Push log successful." test pop_log { Pop log unit test. } -setup { set ::logenabled 1 set ::logstack [open $pwd/logstack w+] set ::debuglog [open $pwd/log w+] set mport [mportopen file://${pwd}] if {[catch {macports::push_log $mport}] != 0} { return "FAIL: cannot push log" } } -body { macports::pop_log if {$::debuglog ne $::logstack} { return "FAIL: cannot pop log" } return "Pop log successful." } -cleanup { unset ::logenabled unset ::logstack unset ::debuglog mportclose $mport file delete -force $pwd/log file delete -force $pwd/logstack } -result "Pop log successful." test set_phase { Set phase unit test. } -body { set res [set_phase test] if {$macports::current_phase ne "test"} { return "FAIL: phase not set" } return "Set phase successful." } -result "Set phase successful." test ui_message { UI message unit test. } -setup { set fd [open $pwd/message w] set fd2 [open $pwd/log w] set macports::channels(0) $fd set macports::current_phase test set ::debuglog $fd2 } -body { set res [ui_message 0 prefix args] close $fd close $fd2 set fd [open $pwd/message r] set fd2 [open $pwd/log r] set line [read $fd] if {$line ne "prefixargs\n"} { return "FAIL: wrong message: $line" } set line [read $fd2] if {$line ne ":0:test args\n"} { return "FAIL: wrong log: $line" } close $fd close $fd2 set fd [open $pwd/message w] set fd2 [open $pwd/log w] set res [ui_message 0 prefix -nonewline arg] close $fd close $fd2 set fd [open $pwd/message r] set fd2 [open $pwd/log r] set line [read $fd] if {$line ne "prefixarg"} { return "FAIL: wrong message: $line" } set line [read $fd2] if {$line ne ":0:test arg"} { return "FAIL: wrong log: $line" } close $fd close $fd2 return "UI message successful." } -cleanup { file delete -force $pwd/log file delete -force $pwd/message } -result "UI message successful." # test ui_init test ui_prefix_default { UI prefix default unit test. } -body { if {[macports::ui_prefix_default debug] ne {DEBUG: }} { return "FAIL: wrong prefix" } if {[macports::ui_prefix_default error] ne {Error: }} { return "FAIL: wrong prefix" } if {[macports::ui_prefix_default warn] ne {Warning: }} { return "FAIL: wrong prefix" } if {[macports::ui_prefix_default default] ne {}} { return "FAIL: wrong prefix" } return "UI prefix default successful." } -result "UI prefix default successful." test ui_channels_default { UI channels default unit test. } -setup { set macports::ui_options(ports_debug) yes set macports::ui_options(ports_verbose) yes set macports::ui_options(ports_quiet) yes } -body { if {[macports::ui_channels_default debug] ne {stderr}} { return "FAIL: stderr not set" } if {[macports::ui_channels_default info] ne {stdout}} { return "FAIL: stdout not set" } if {[macports::ui_channels_default notice] ne {}} { return "FAIL: channel not set" } if {[macports::ui_channels_default msg] ne {stdout}} { return "FAIL: channel not set" } if {[macports::ui_channels_default warn] ne {stderr}} { return "FAIL: channel not set" } if {[macports::ui_channels_default error] ne {stderr}} { return "FAIL: channel not set" } if {[macports::ui_channels_default default] ne {stdout}} { return "FAIL: channel not set" } return "UI channels default successful." } -result "UI channels default successful." test ui_warn_once { UI warn once unit test. } -setup { # suppress test warning to avoid noise on terminal output set channel_saved $macports::channels(warn) set macports::channels(warn) {} } -body { set res [ui_warn_once 0 test] if {$macports::warning_done(0) != 1} { return "FAIL: warning flag not set" } return "UI warn once successful." } -cleanup { set macports::channels(warn) $channel_saved } -result "UI warn once successful." # Replace puts to catch errors # test puts test findBinary { Find binary unit test. } -body { if {[macports::findBinary pwd ls] ne "/bin/pwd"} { return "FAIL: wrong binary" } if {[macports::findBinary pwd /bin/ls] ne "/bin/ls"} { return "FAIL: wrong binary" } return "Find binary successful." } -result "Find binary successful." test binaryInPath { Binary in path unit test. } -body { if {[catch {macports::binaryInPath zz}] != 1} { return "FAIL: invalid binary found" } if {[macports::binaryInPath ls] ne "/bin/ls"} { return "FAIL: wrong binary found" } return "Binary in path successful." } -result "Binary in path successful." test getoption { Get option unit test. } -body { set macports::test macports if {[macports::getoption test] ne "macports"} { return "FAIL: cannot get option" } return "Get option successful." } -result "Get option successful." test setxcodeinfo { Set XCode info unit test. } -constraints { root } -setup { unset macports::xcodeversion } -body { if {[macports::setxcodeinfo a b c] ne ""} { return "FAIL: xcode binary not found" } if {![info exists macports::xcodeversion]} { return "FAIL: xcodeversion unset" } return "Set XCode version successful." } -result "Set XCode version successful." test set_developer_dir { Set developer dir unit test. Tests only for correct xcode-select dir. } -constraints { root } -body { unset macports::developer_dir if {[macports::set_developer_dir a b c] ne ""} { return "FAIL: cannot set dev dir" } if {![info exists macports::developer_dir]} { return "FAIL: developer_dir var no set" } return "Set developer dir successful." } -result "Set developer dir successful." test _is_valid_developer_dir { Check valid dev dir unit test. } -constraints { darwin } -body { if {[macports::_is_valid_developer_dir $macports::developer_dir] != 1} { return "FAIL: valid dir not detected" } return "Valid dev dir successful." } -result "Valid dev dir successful." # test mportinit test mportopen_installed { Mport installed unit test. } -constraints { root } -setup { set subport gcc_select set version 0.1 set revision 4 set mport [mportopen file://${pwd}] # run destroot mportexec $mport destroot if {[catch {mportexec $mport activate}] != 0} { ui_debug "$::errorInfo" return "FAIL: cannot install port" } set variants {} set options {} } -body { set res [mportopen_installed $subport $version $revision $variants $options] if {![string match "ditem_*" $res]} { return "FAIL: installed port not opened" } if {[catch {mportclose $res}] != 0} { return "FAIL: cannot close port" } if {[catch {mportclose $res}] != 1} { return "FAIL: installed port not closed" } return "Installed port open successful." } -cleanup { if {[catch {mportexec $mport uninstall}] != 0} { return "FAIL: cannot uninstall port" } mportclose $mport file delete -force $pwd/work file delete -force $pwd/$subport cd $pwd } -result "Installed port open successful." test mportshutdown { Mport shutdown unit test. } -setup { unset macports::ping_cache set time [expr [clock seconds] - 86100] set time_exp [expr [clock seconds] - 87000] set macports::portdbpath $pwd/portdbpath set macports::ping_cache(host1) [list test $time] set macports::ping_cache(host2) [list test $time_exp] file mkdir $macports::portdbpath close [open $macports::portdbpath/pingtimes w+] } -body { if {[mportshutdown] ne ""} { return "FAIL: errors occured" } set res "" append res "host1 \{test " $time "\}" set fd [open $macports::portdbpath/pingtimes r] if {[gets $fd] ne $res} { return "FAIL: wrong value saved" } close $fd return "Mportshutdown successful." } -cleanup { file delete -force $macports::portdbpath } -result "Mportshutdown successful." test copy_xcode_plist { Copy xcode plist unit test. } -constraints { root } -body { set target $pwd/target if {[macports::copy_xcode_plist $target] ne ""} { return "FAIL: cannot copy xcode plist" } if {![file exists $target/Library/Preferences/com.apple.dt.Xcode.plist]} { return "FAIL: missing plist file" } return "Copy xcode plist successful." } -cleanup { file delete -force $target } -result "Copy xcode plist successful." test create_thread { Create thread unit test. } -body { unset macports::portinterp_options set macports::portinterp_options {a b} set res [macports::create_thread] if {![string match "tid0x*" $res]} { return "FAIL: cannot create thread" } return "Create thread successful." } -result "Create thread successful." test get_tar_flags { Get tar flags unit test. } -body { if {[macports::get_tar_flags .tbz2] ne "-j"} { return "FAIL: wrong flaga (-j)" } if {[macports::get_tar_flags .tgz] ne "-z"} { return "FAIL: wrong flaga (-z)" } return "Get tar flags successful." } -result "Get tar flags successful." test fetch_port { Fetch port unit test. } -body { set url http://packages.macports.org/db_select/db_select-0.1_3.darwin_14.noarch.tbz2 set res [macports::fetch_port $url] if {$res ne "${pwd}/portdbpath/portdirs/db_select-0.1_3"} { return "FAIL: cannot fetch port" } return "Fetch port successful." } -cleanup { file delete -force $pwd/portdbpath } -result "Fetch port successful." test getprotocol { Get protocol unit test. } -body { if {[macports::getprotocol https://www.macports.org] ne "https"} { return "FAIL: wrong protocol" } return "Get protocol successful." } -result "Get protocol successful." test getportdir { Get port directory unit test. } -setup { close [open $pwd/local_file w+] } -body { set url http://packages.macports.org/db_select/db_select-0.1_3.darwin_14.noarch.tbz2 set res [macports::getportdir $url] set expected ${pwd}/portdbpath/portdirs/db_select-0.1_3 if {$res ne $expected} { return "FAIL: incorrect port directory $res (expected $expected)" } set url file://${pwd}/local_file set res [macports::getportdir $url] set expected ${pwd}/portdbpath/portdirs/local_file if {$res ne $expected} { return "FAIL: incorrect local port directory $res (expected $expected)" } return "Get port dir successful." } -cleanup { file delete -force $pwd/portdbpath file delete -force $pwd/local_file } -result "Get port dir successful." test getportresourcepath { Get port resource path. Doesn't check for 'file' protocol. } -body { set macports::portdbpath $pwd/portdbpath set url "http://packages.macports.org/db_select/db_select-0.1_3.darwin_14.noarch.tbz2" set default_path $pwd/portdbpath/sources/rsync.macports.org/macports/release/tarballs/ports/_resources set fallback_path $pwd/portdbpath/sources/packages.macports.org/db_select/db_select-0.1_3.darwin_14.noarch.tbz2/_resources if {[macports::getportresourcepath $url "" yes] ne $default_path} { return "FAIL: wrong resource path" } if {[macports::getportresourcepath $url "" no] ne $fallback_path} { return "FAIL: wrong fallback path" } if {[macports::getportresourcepath $url "test" no] ne "${fallback_path}/test"} { return "FAIL: wrong fallback path with subdir" } return "Get resource path successful." } -result "Get resource path successful." test getdefaultportresourcepath { Get default port resource path unit test. } -body { set path test/path set macports::sources_default file://$pwd if {[macports::getdefaultportresourcepath $path] ne "${pwd}/_resources/${path}"} { return "FAIL: wrong file res path" } set macports::sources_default http://$pwd set default_source_url [lindex ${macports::sources_default} 0] set right_path [macports::getsourcepath $default_source_url]/_resources/test/path if {[macports::getdefaultportresourcepath $path] ne $right_path} { return "FAIL: wrong http res path" } return "Default res path successful." } -result "Default res path successful." # test mportopen test mporttraverse { Mport traverse unit test. Uses 3rd line of the Portfile. } -setup { file mkdir $pwd/porttree file mkdir $pwd/porttree/cat1/gcc_select file mkdir $pwd/porttree/cat2/gcc_select file copy -force $pwd/Portfile $pwd/porttree/cat1/gcc_select/Portfile file copy -force $pwd/Portfile $pwd/porttree/cat2/gcc_select/Portfile proc test_proc {file} { global pwd res set fd [open ${pwd}/porttree/${file}/Portfile r] gets $fd gets $fd gets $fd line append res [lindex [split $line " "] 1] } global res set res "" } -body { mporttraverse test_proc $pwd/porttree if {$res ne "1.01.0"} { return "FAIL: porttree not traversed" } return "Mport traverse successful." } -cleanup { file delete -force $pwd/porttree } -result "Mport traverse successful." # test _mportsearchpath # test _mportinstalled # test _mportactive # test _portnameactive # test _mportispresent # test _mporterrorifconflictsinstalled # test _mportexec # test mportexec # test _upgrade_mport_deps # test _get_registry_archs # test getsourcepath # test _source_is_snapshot # test getportbuildpath # test getportlogpath # test getportworkpath_from_buildpath # test getportworkpath_from_portdir # test getindex # The test files might themselves be under version control, so the test # repositories need to live somewhere else. # TODO: Replace with "file tempfile" when we move to Tcl 8.6. package require fileutil 1.5.1- set tempdir [::fileutil::tempdir] testConstraint hasSvn [expr { ![catch {macports::findBinary svn} svn] && ![catch {macports::findBinary svnadmin} svnadmin] }] test GetVCSUpdateCmd-svn { Tests GetVCSUpdateCmd on a valid Subversion repository } -constraints { hasSvn } -setup { set repo [makeDirectory macports-test-svn-repo $tempdir] exec $svnadmin create $repo set wc [makeDirectory macports-test-svn-wc $tempdir] # This URL should probably be encoded. exec $svn checkout file://$repo $wc } -body { string map [list $svn SVN $wc WC] [macports::GetVCSUpdateCmd $wc] } -cleanup { removeDirectory macports-test-svn-wc $tempdir removeDirectory macports-test-svn-repo $tempdir } -result {Subversion {SVN update --non-interactive WC}} testConstraint hasGit [expr {![catch {macports::findBinary git} git]}] test GetVCSUpdateCmd-git { Tests GetVCSUpdateCmd on a valid Git repository } -constraints { hasGit } -setup { set repo [makeDirectory macports-test-git-repo $tempdir] exec $git init $repo } -body { string map [list $git GIT $repo REPO] [macports::GetVCSUpdateCmd $repo] } -cleanup { removeDirectory macports-test-git-repo $tempdir } -result {Git {cd REPO && GIT pull --rebase || true}} testConstraint hasGitSvn [expr { ![catch {macports::findBinary git} git] && [file readable [file join [exec $git --exec-path] git-svn]] }] test GetVCSUpdateCmd-gitsvn { Tests GetVCSUpdateCmd on a valid git-svn repository } -constraints { hasGitSvn } -setup { set repo [makeDirectory macports-test-git-svn-repo $tempdir] exec $git svn init http://localhost $repo } -body { string map [list $git GIT $repo REPO] [macports::GetVCSUpdateCmd $repo] } -cleanup { removeDirectory macports-test-git-svn-repo $tempdir } -result {git-svn {cd REPO && GIT svn rebase || true}} test GetVCSUpdateCmd-none { Tests GetVCSUpdateCmd on directories that aren't recognized repositories } -setup { set repo [makeDirectory macports-test-non-repo $tempdir] } -body { macports::GetVCSUpdateCmd $repo } -cleanup { removeDirectory macports-test-non-repo $tempdir } -result {} # test updatevcs # test mportsync # test mportsearch # test mportlookup # test mportlistall # test _mports_load_quickindex # test mports_generate_quickindex # test _mportkey # test mportdepends # test _mport_supports_archs # test _mport_archs # test _active_supports_archs # test _active_archs # test _explain_arch_mismatch # test _mport_has_deptypes # test _target_needs_deps # test _deptypes_for_target # test selfupdate # test upgrade # test _upgrade # test _upgrade_dependencies test mportselect { Mport select unit test. } -setup { set macports::prefix $pwd/prefix file mkdir $macports::prefix/etc/select/group set f1 [open $macports::prefix/etc/select/group/file1 w+] set f2 [open $macports::prefix/etc/select/group/file2 w+] set f3 [open $macports::prefix/srcs w+] puts $f1 "srcs\n" close $f1 close $f2 close $f3 set fd [open $macports::prefix/etc/select/group/base w+] puts $fd "a\nb" close $fd } -body { if {[mportselect list group] ne {file1 file2}} { return "FAIL: files not listed" } if {[mportselect set group file1] ne ""} { reutrn "FAIL: cannot set links" } if {![file exists $macports::prefix/a]} { return "FAIL: link not created" } if {[mportselect show group] ne "file1"} { return "FAIL: file not selected" } return "Mport select successful." } -cleanup { file delete -force $macports::prefix } -result "Mport select successful." test gettmpdir { Get tmp dir unit test. } -body { global env set env(TMPDIR) temporal if {[macports::gettmpdir] ne "temporal"} { return "FAIL: set temp dir not detected" } unset env(TMPDIR) if {[macports::gettmpdir] ne "/tmp"} { return "FAIL: default value not set" } return "Get tmp dir successful." } -result "Get tmp dir successful." test arch_runnable { Arch runnable unit test. } -body { set macports::os_major 12 set macports::os_arch i386 set macports::os_platform darwin if {[macports::arch_runnable ppc1] != no} { return "FAIL: major:12 arch:i386 arch:ppc* not detected" } if {[macports::arch_runnable ppc64] != no} { return "FAIL: major:12 arch:i386 arch:ppc64 not detected" } set macports::os_major 7 set macports::os_arch i386 set macports::os_platform darwin if {[macports::arch_runnable x86_64] != no} { return "FAIL: major:7 arch:i386 arch:x86_64 not detected" } set macports::os_major 12 set macports::os_arch i386 set macports::os_platform darwin if {[macports::arch_runnable x86_64] != yes} { return "FAIL: major:12 arch:i386 arch:x86_64 not detected" } return "Arch runnable successful." } -result "Arch runnable successful." # test revupgrade # test revupgrade_scanandrebuild test path_is_in_prefix { Path is in prefix unit test. } -body { set macports::applications_dir appdir if {[macports::path_is_in_prefix appdir/test/port] != yes} { return "FAIL: application dir not detected" } set macports::prefix prefix if {[macports::path_is_in_prefix prefix/test/port] != yes} { return "FAIL: prefix not detected" } if {[macports::path_is_in_prefix test/port] != no} { return "FAIL: no prefix detected" } return "Path prefix successful." } -result "Path prefix successful." test revupgrade_handle_special_paths { Revupgrade handle special paths unit test. } -body { set res [macports::revupgrade_handle_special_paths fname test_path] if {$res ne "test_path"} { return "FAIL: wrong path" } set res [macports::revupgrade_handle_special_paths fname @loader_path/test_load] if {$res ne "./test_load"} { return "FAIL: wrong load path" } return "Revupgrade handle special path successful." } -result "Revupgrade handle special path successful." # test revupgrade_buildgraph test get_pingtime { Get ping time unit test. } -setup { set time [expr [clock seconds] - 86300] set macports::ping_cache(macports.org) [list MacPorts $time] set macports::host_blacklisted(macports_blacklist) [list black $time] set macports::host_preferred(macports_pref) [list pref $time] } -body { if {[macports::get_pingtime macports.org] ne "MacPorts"} { return "FAIL: wrong ping time" } if {[macports::get_pingtime macports_blacklist] != -1} { return "FAIL: wrong time for blacklisted host" } if {[macports::get_pingtime macports_pref] != 1} { return "FAIL: wrong time for preferred host" } return "Get ping time successful." } -result "Get ping time successful." test set_pingtime { Set ping time unit test. } -body { set macports::ping_cache(macports) {} if {[lindex [macports::set_pingtime macports 007] 0] != 007} { return "FAIL: ping time not set" } return "Set ping time successful." } -result "Set ping time successful." test get_archive_sites_conf_values { Get archive sites conf values unit test. } -setup { file mkdir $pwd/archive_sites set fd [open $pwd/archive_sites/archive_sites.conf w+] puts $fd "name fondu" puts $fd "urls macports.org" puts $fd "type tgz" close $fd set macports::autoconf::macports_conf_path $pwd/archive_sites unset -nocomplain macports::archive_sites_conf_values } -body { set res [macports::get_archive_sites_conf_values] puts $res if {[lindex [split $res " "] 1] ne "macports.org:nosubdir"} { return "FAIL: name not set" } if {[lindex [split $res " "] 3] ne "tgz"} { return "FAIL: wrong type set" } set macports::archive_sites_conf_values {a b c} if {[macports::get_archive_sites_conf_values] ne {a b c}} { return "FAIL: wrong result for bad conf file" } return "Get archive sites conf values successful." } -cleanup { file delete -force $pwd/archive_sites } -result "Get archive sites conf values successful." set shellescapeTests [list \ "using \\backslashes" \ " spaces " \ "and tabs" \ "quotes need to be \"supported\", too" \ "… and not only 'double-quotes'" \ "other meta chars such as \$dollar," \ "!bang, ;semicolon, :colon," \ "\$(subshells) and similar must be kept" \ ">redirects <& must be ignored as well as ampersands &"] test shellescaping { Check whether shell escaping using macports::shellescape works correctly when passed to Pextlib's system extension. } -setup { set outputfile "shellescapetestoutput.txt" makeFile "" $outputfile } -body { set first "yes" foreach test $shellescapeTests { if {$first eq "yes"} { system "echo [macports::shellescape $test] >$outputfile" set first "no" } else { system "echo [macports::shellescape $test] >>$outputfile" } } set fd [open $outputfile r] set output [read -nonewline $fd] close $fd return $output } -cleanup { removeFile $outputfile } -result [join $shellescapeTests "\n"] cleanupTests