OLD | NEW |
1 # 2010 April 14 | 1 # 2010 April 14 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 }] | 79 }] |
80 if {$rc} { | 80 if {$rc} { |
81 testfixture $chan "set ::sqlite_pending_byte $::sqlite_pending_byte" | 81 testfixture $chan "set ::sqlite_pending_byte $::sqlite_pending_byte" |
82 } | 82 } |
83 return $chan | 83 return $chan |
84 } | 84 } |
85 | 85 |
86 # Execute a command in a child testfixture process, connected by two-way | 86 # Execute a command in a child testfixture process, connected by two-way |
87 # channel $chan. Return the result of the command, or an error message. | 87 # channel $chan. Return the result of the command, or an error message. |
88 # | 88 # |
89 proc testfixture {chan cmd} { | 89 proc testfixture {chan cmd args} { |
90 puts $chan $cmd | 90 |
91 puts $chan OVER | 91 if {[llength $args] == 0} { |
92 set r "" | 92 fconfigure $chan -blocking 1 |
93 while { 1 } { | 93 puts $chan $cmd |
94 set line [gets $chan] | 94 puts $chan OVER |
95 if { $line == "OVER" } { | 95 |
96 set res [lindex $r 1] | 96 set r "" |
97 if { [lindex $r 0] } { error $res } | 97 while { 1 } { |
98 return $res | 98 set line [gets $chan] |
| 99 if { $line == "OVER" } { |
| 100 set res [lindex $r 1] |
| 101 if { [lindex $r 0] } { error $res } |
| 102 return $res |
| 103 } |
| 104 if {[eof $chan]} { |
| 105 return "ERROR: Child process hung up" |
| 106 } |
| 107 append r $line |
99 } | 108 } |
100 if {[eof $chan]} { | 109 return $r |
101 return "ERROR: Child process hung up" | 110 } else { |
102 } | 111 set ::tfnb($chan) "" |
103 append r $line | 112 fconfigure $chan -blocking 0 -buffering none |
| 113 puts $chan $cmd |
| 114 puts $chan OVER |
| 115 fileevent $chan readable [list testfixture_script_cb $chan [lindex $args 0]] |
| 116 return "" |
104 } | 117 } |
105 } | 118 } |
106 | 119 |
| 120 proc testfixture_script_cb {chan script} { |
| 121 if {[eof $chan]} { |
| 122 append ::tfnb($chan) "ERROR: Child process hung up" |
| 123 set line "OVER" |
| 124 } else { |
| 125 set line [gets $chan] |
| 126 } |
| 127 |
| 128 if { $line == "OVER" } { |
| 129 uplevel #0 $script [list [lindex $::tfnb($chan) 1]] |
| 130 unset ::tfnb($chan) |
| 131 fileevent $chan readable "" |
| 132 } else { |
| 133 append ::tfnb($chan) $line |
| 134 } |
| 135 } |
| 136 |
107 proc testfixture_nb_cb {varname chan} { | 137 proc testfixture_nb_cb {varname chan} { |
108 if {[eof $chan]} { | 138 if {[eof $chan]} { |
109 append ::tfnb($chan) "ERROR: Child process hung up" | 139 append ::tfnb($chan) "ERROR: Child process hung up" |
110 set line "OVER" | 140 set line "OVER" |
111 } else { | 141 } else { |
112 set line [gets $chan] | 142 set line [gets $chan] |
113 } | 143 } |
114 | 144 |
115 if { $line == "OVER" } { | 145 if { $line == "OVER" } { |
116 set $varname [lindex $::tfnb($chan) 1] | 146 set $varname [lindex $::tfnb($chan) 1] |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 } else { | 195 } else { |
166 append script $line | 196 append script $line |
167 append script "\n" | 197 append script "\n" |
168 } | 198 } |
169 } | 199 } |
170 }] | 200 }] |
171 close $fd | 201 close $fd |
172 set main_loop_written 1 | 202 set main_loop_written 1 |
173 } | 203 } |
174 | 204 |
OLD | NEW |