File: multiplexer.test

package info (click to toggle)
tcllib 1.20%2Bdfsg-1
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 68,064 kB
  • sloc: tcl: 216,842; ansic: 14,250; sh: 2,846; xml: 1,766; yacc: 1,145; pascal: 881; makefile: 107; perl: 84; f90: 84; python: 33; ruby: 13; php: 11
file content (218 lines) | stat: -rw-r--r-- 5,247 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# -*- tcl -*-
# Tests for the multiplexer facility.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors.
# No output means no errors were found.
#
# Copyright (c) 2003 by David N. Welton <davidw@dedasys.com>.
#
# $Id: multiplexer.test,v 1.11 2011/11/14 18:49:27 andreas_kupries Exp $

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.2
testsNeedTcltest 1.0

testing {
    useLocal multiplexer.tcl multiplexer
}

# -------------------------------------------------------------------------

test multiplexer-1.0 {create multiplexer} {
    set mp [multiplexer::create]
    set ns [namespace children ::multiplexer]
    ${mp}::destroy
    set ns
} {::multiplexer::mp0}

test multiplexer-1.1 {destroy multiplexer} {
    set mp [multiplexer::create]
    ${mp}::destroy
    namespace children multiplexer
} {}

test multiplexer-2.1 {start multiplexer} {
    set mp [multiplexer::create]
    ${mp}::Init 37465
    set res ""
    if { [catch {
	set sk [socket localhost 37465]
    } err] } { set res $err }
    ${mp}::destroy
    set res
} {}

test multiplexer-2.2 {start & destroy multiplexer} {tcl8.3plus} {
    set mp [multiplexer::create]
    set startchans [lsort [file channels]]
    ${mp}::Init 37465

    set sk [socket localhost 37465]
    catch { close $sk }

    ${mp}::destroy
    set chans [lsort [file channels]]
    string compare $chans $startchans
} {0}



proc Get {chan} {
    gets $chan line
    if { [info exists ::forever] } {
	incr ::forever
    } else {
	set ::forever 1
    }
}

test multiplexer-3.1 {send multiplexer - line buffered} {
    set ::forever 0
    set mp [multiplexer::create]
    ${mp}::Init 37465
    set sk1 [socket localhost 37465]
    set sk2 [socket localhost 37465]
    set sk3 [socket localhost 37465]
    fileevent $sk2 readable [list Get $sk2]
    fileevent $sk3 readable [list Get $sk3]

    fconfigure $sk1 -buffering line
    fconfigure $sk2 -buffering line
    fconfigure $sk3 -buffering line

    update
    puts $sk1 "Multiplexer test message 3.1"
    # Each socket should receive a copy of the above message, so we
    # have to vwait's.
    vwait ::forever
    vwait ::forever
    ${mp}::destroy
    set ::forever
} {2}

proc Get2 {chan} {
    set line [read -nonewline $chan]
    if { [info exists ::forever] } {
	incr ::forever
    } else {
	set ::forever 1
    }
}

test multiplexer-3.2 {send multiplexer - not buffered} {
    set ::forever 0
    set mp [multiplexer::create]
    ${mp}::Init 37465
    set sk1 [socket localhost 37465]
    set sk2 [socket localhost 37465]
    set sk3 [socket localhost 37465]
    fileevent $sk2 readable [list Get2 $sk2]
    fileevent $sk3 readable [list Get2 $sk3]

    fconfigure $sk1 -buffering none
    fconfigure $sk2 -buffering none -blocking 0
    fconfigure $sk3 -buffering none -blocking 0

    update
    puts -nonewline $sk1 "Multiplexer test message 3.2"
    # Each socket should receive a copy of the above message, so we
    # have to vwait's.
    vwait ::forever
    vwait ::forever
    ${mp}::destroy
    set ::forever
} {2}


proc TestFilter {data chan clientaddress clientport} {
    #puts "$data $chan $clientaddress $clientport"
    return "Filtered data: $data"
}

proc Get3 {chan} {
    gets $chan line
    set ::forever $line
}

test multiplexer-4.1 {add filter} {
    set ::forever 0
    set mp [multiplexer::create]
    ${mp}::Init 37465
    ${mp}::AddFilter TestFilter
    set sk1 [socket localhost 37465]
    set sk2 [socket localhost 37465]
    fileevent $sk2 readable [list Get3 $sk2]

    fconfigure $sk1 -buffering line
    fconfigure $sk2 -buffering line

    update
    puts $sk1 "Multiplexer test message 4.1"
    # Each socket should receive a copy of the above message, so we
    # have to vwait's.
    vwait ::forever
    ${mp}::destroy
    set ::forever
} {Filtered data: Multiplexer test message 4.1}

proc TestAccessFilter {chan clientaddress clientport} {
    lappend ::forever $clientaddress
    return 0
}

test multiplexer-5.1 {add access filter} {
    set ::forever {}
    set mp [multiplexer::create]
    ${mp}::Init 37465
    ${mp}::AddAccessFilter TestAccessFilter
    update
    set sk1 [socket localhost 37465]
    set sk2 [socket localhost 37465]

    vwait ::forever
    vwait ::forever
    ${mp}::destroy

    expr {
	  [string match {127.*.*.* 127.*.*.*} $::forever] ||
	  [string equal {::1 ::1}             $::forever]
      }
} 1

proc DenyAccessFilter {chan clientaddress clientport} {
    return -1
}

test multiplexer-5.2 {add access filter which denies access} {
    set ::forever {}
    set mp [multiplexer::create]
    ${mp}::Init 37465
    ${mp}::AddAccessFilter DenyAccessFilter
    set sk1 [socket localhost 37465]
    after idle {
	update
	fconfigure $sk1 -buffering none
	if { [catch {
	    puts $sk1 "boom"
	    after 200	;# delay to overcome nagle - see ticket [ced089d5fe]
	    puts $sk1 "tish"
	} err] } {
	    set ::forever "socket blocked"
	} else {
	    set ::forever "socket not blocked"
	}
    }
    vwait ::forever
    ${mp}::destroy
    set forever
} {socket blocked}


testsuiteCleanup
return