@@ -44,7 +44,6 @@ impl UdpSocket {
44
44
Ok ( ( nread, src) ) => Some ( ( nread, src) ) ,
45
45
Err ( ioerr) => {
46
46
// EOF is indicated by returning None
47
- // XXX do we ever find EOF reading UDP packets?
48
47
if ioerr. kind != EndOfFile {
49
48
read_error:: cond. raise ( ioerr) ;
50
49
}
@@ -86,10 +85,12 @@ impl UdpStream {
86
85
87
86
impl Reader for UdpStream {
88
87
fn read ( & mut self , buf : & mut [ u8 ] ) -> Option < uint > {
89
- let conn = self . connectedTo ;
90
88
do self . as_socket |sock| {
91
- sock. recvfrom ( buf)
92
- . map_consume ( |( nread, src) | if src == conn { nread} else { 0 } )
89
+ match sock. recvfrom ( buf) {
90
+ Some ( ( _nread, src) ) if src != self . connectedTo => Some ( 0 ) ,
91
+ Some ( ( nread, _src) ) => Some ( nread) ,
92
+ None => None ,
93
+ }
93
94
}
94
95
}
95
96
@@ -105,3 +106,97 @@ impl Writer for UdpStream {
105
106
106
107
fn flush ( & mut self ) { fail ! ( ) }
107
108
}
109
+
110
+ #[ cfg( test) ]
111
+ mod test {
112
+ use super :: * ;
113
+ use rt:: test:: * ;
114
+ use rt:: io:: net:: ip:: Ipv4 ;
115
+ use rt:: io:: * ;
116
+ use option:: { Some , None } ;
117
+
118
+ #[ test] #[ ignore]
119
+ fn bind_error ( ) {
120
+ do run_in_newsched_task {
121
+ let mut called = false ;
122
+ do io_error:: cond. trap ( |e| {
123
+ assert ! ( e. kind == PermissionDenied ) ;
124
+ called = true ;
125
+ } ) . in {
126
+ let addr = Ipv4 ( 0 , 0 , 0 , 0 , 1 ) ;
127
+ let socket = UdpSocket :: bind ( addr) ;
128
+ assert ! ( socket. is_none( ) ) ;
129
+ }
130
+ assert ! ( called) ;
131
+ }
132
+ }
133
+
134
+ #[ test]
135
+ fn socket_smoke_test ( ) {
136
+ do run_in_newsched_task {
137
+ let server_ip = next_test_ip4 ( ) ;
138
+ let client_ip = next_test_ip4 ( ) ;
139
+
140
+ do spawntask_immediately {
141
+ match UdpSocket :: bind ( server_ip) {
142
+ Some ( server) => {
143
+ let mut buf = [ 0 ] ;
144
+ match server. recvfrom ( buf) {
145
+ Some ( ( nread, src) ) => {
146
+ assert_eq ! ( nread, 1 ) ;
147
+ assert_eq ! ( buf[ 0 ] , 99 ) ;
148
+ assert_eq ! ( src, client_ip) ;
149
+ }
150
+ None => fail ! ( )
151
+ }
152
+ }
153
+ None => fail ! ( )
154
+ }
155
+ }
156
+
157
+ do spawntask_immediately {
158
+ match UdpSocket :: bind ( client_ip) {
159
+ Some ( client) => client. sendto ( [ 99 ] , server_ip) ,
160
+ None => fail ! ( )
161
+ }
162
+ }
163
+ }
164
+ }
165
+
166
+ #[ test]
167
+ fn stream_smoke_test ( ) {
168
+ do run_in_newsched_task {
169
+ let server_ip = next_test_ip4 ( ) ;
170
+ let client_ip = next_test_ip4 ( ) ;
171
+
172
+ do spawntask_immediately {
173
+ match UdpSocket :: bind ( server_ip) {
174
+ Some ( server) => {
175
+ let server = ~server;
176
+ let mut stream = server. connect ( client_ip) ;
177
+ let mut buf = [ 0 ] ;
178
+ match stream. read ( buf) {
179
+ Some ( nread) => {
180
+ assert_eq ! ( nread, 1 ) ;
181
+ assert_eq ! ( buf[ 0 ] , 99 ) ;
182
+ }
183
+ None => fail ! ( )
184
+ }
185
+ }
186
+ None => fail ! ( )
187
+ }
188
+ }
189
+
190
+ do spawntask_immediately {
191
+ match UdpSocket :: bind ( client_ip) {
192
+ Some ( client) => {
193
+ let client = ~client;
194
+ let mut stream = client. connect ( server_ip) ;
195
+ stream. write ( [ 99 ] ) ;
196
+ }
197
+ None => fail ! ( )
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
0 commit comments