OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 // | 4 // |
5 // Tests socket exceptions. | 5 // Tests socket exceptions. |
6 | 6 |
| 7 import "dart:async"; |
7 import "dart:isolate"; | 8 import "dart:isolate"; |
8 import "dart:io"; | 9 import "dart:io"; |
9 | 10 |
10 class SocketExceptionTest { | 11 class SocketExceptionTest { |
11 | 12 |
12 static const PORT = 0; | |
13 static const HOST = "127.0.0.1"; | |
14 | |
15 static void serverSocketExceptionTest() { | 13 static void serverSocketExceptionTest() { |
16 bool exceptionCaught = false; | 14 bool exceptionCaught = false; |
17 bool wrongExceptionCaught = false; | 15 bool wrongExceptionCaught = false; |
18 | 16 |
19 ServerSocket server = new ServerSocket(HOST, PORT, 10); | 17 ServerSocket.bind().then((server) { |
20 Expect.equals(true, server != null); | 18 Expect.isNotNull(server); |
21 server.close(); | |
22 try { | |
23 server.close(); | 19 server.close(); |
24 } on SocketIOException catch(ex) { | |
25 exceptionCaught = true; | |
26 } on Exception catch (ex) { | |
27 wrongExceptionCaught = true; | |
28 } | |
29 Expect.equals(false, exceptionCaught); | |
30 Expect.equals(true, !wrongExceptionCaught); | |
31 | |
32 // Test invalid host. | |
33 Expect.throws(() => new ServerSocket("__INVALID_HOST__", PORT, 10), | |
34 (e) => e is SocketIOException); | |
35 } | |
36 | |
37 static void clientSocketExceptionTest() { | |
38 bool exceptionCaught = false; | |
39 bool wrongExceptionCaught = false; | |
40 | |
41 ServerSocket server = new ServerSocket(HOST, PORT, 10); | |
42 Expect.equals(true, server != null); | |
43 int port = server.port; | |
44 Socket client = new Socket(HOST, port); | |
45 client.onConnect = () { | |
46 Expect.equals(true, client != null); | |
47 InputStream input = client.inputStream; | |
48 OutputStream output = client.outputStream; | |
49 client.close(); | |
50 try { | 20 try { |
51 client.close(); | 21 server.close(); |
52 } on SocketIOException catch(ex) { | 22 } on SocketIOException catch(ex) { |
53 exceptionCaught = true; | 23 exceptionCaught = true; |
54 } on Exception catch (ex) { | 24 } catch (ex) { |
55 wrongExceptionCaught = true; | 25 wrongExceptionCaught = true; |
56 } | 26 } |
57 Expect.equals(false, exceptionCaught); | 27 Expect.equals(false, exceptionCaught); |
58 Expect.equals(true, !wrongExceptionCaught); | 28 Expect.equals(true, !wrongExceptionCaught); |
59 exceptionCaught = false; | 29 |
60 try { | 30 // Test invalid host. |
61 client.available(); | 31 ServerSocket.bind("__INVALID_HOST__") |
62 } on SocketIOException catch(ex) { | 32 .then((server) { }) |
63 exceptionCaught = true; | 33 .catchError((e) => e is SocketIOException); |
64 } on Exception catch (ex) { | 34 }); |
65 wrongExceptionCaught = true; | 35 } |
66 } | 36 |
67 Expect.equals(true, exceptionCaught); | 37 static void serverSocketCloseListenTest() { |
68 Expect.equals(true, !wrongExceptionCaught); | 38 var port = new ReceivePort(); |
69 exceptionCaught = false; | 39 ServerSocket.bind().then((server) { |
70 try { | 40 Socket.connect("127.0.0.1", server.port).then((socket) { |
71 List<int> buffer = new List<int>.fixedLength(10); | 41 server.close(); |
72 client.readList(buffer, 0 , 10); | 42 server.listen( |
73 } on SocketIOException catch(ex) { | 43 (incoming) => Expect.fail("Unexpected socket"), |
74 exceptionCaught = true; | 44 onDone: port.close); |
75 } on Exception catch (ex) { | 45 }); |
76 wrongExceptionCaught = true; | 46 }); |
77 } | 47 } |
78 Expect.equals(true, exceptionCaught); | 48 |
79 Expect.equals(true, !wrongExceptionCaught); | 49 static void serverSocketListenCloseTest() { |
80 exceptionCaught = false; | 50 var port = new ReceivePort(); |
81 try { | 51 ServerSocket.bind().then((server) { |
82 List<int> buffer = new List<int>.fixedLength(10); | 52 Socket.connect("127.0.0.1", server.port).then((socket) { |
83 client.writeList(buffer, 0, 10); | 53 server.listen( |
84 } on SocketIOException catch(ex) { | 54 (incoming) => server.close(), |
85 exceptionCaught = true; | 55 onDone: port.close()); |
86 } on Exception catch (ex) { | 56 }); |
87 wrongExceptionCaught = true; | 57 }); |
88 } | 58 } |
89 Expect.equals(true, exceptionCaught); | 59 |
90 Expect.equals(true, !wrongExceptionCaught); | 60 static void clientSocketExceptionTest() { |
91 exceptionCaught = false; | |
92 try { | |
93 List<int> buffer = new List<int>.fixedLength(42); | |
94 input.readInto(buffer, 0, 12); | |
95 } on SocketIOException catch(ex) { | |
96 exceptionCaught = true; | |
97 } on Exception catch (ex) { | |
98 wrongExceptionCaught = true; | |
99 } | |
100 Expect.equals(true, exceptionCaught); | |
101 Expect.equals(true, !wrongExceptionCaught); | |
102 exceptionCaught = false; | |
103 try { | |
104 List<int> buffer = new List<int>.fixedLength(42); | |
105 output.writeFrom(buffer, 0, 12); | |
106 } on SocketIOException catch(ex) { | |
107 exceptionCaught = true; | |
108 } on Exception catch (ex) { | |
109 wrongExceptionCaught = true; | |
110 } | |
111 Expect.equals(true, exceptionCaught); | |
112 Expect.equals(true, !wrongExceptionCaught); | |
113 | |
114 server.close(); | |
115 }; | |
116 } | |
117 | |
118 static void indexOutOfRangeExceptionTest() { | |
119 bool exceptionCaught = false; | 61 bool exceptionCaught = false; |
120 bool wrongExceptionCaught = false; | 62 bool wrongExceptionCaught = false; |
121 | 63 |
122 ServerSocket server = new ServerSocket(HOST, PORT, 10); | 64 ServerSocket.bind().then((server) { |
123 Expect.equals(true, server != null); | 65 Expect.isNotNull(server); |
124 int port = server.port; | 66 int port = server.port; |
125 Socket client = new Socket(HOST, port); | 67 Socket.connect("127.0.0.1", port).then((client) { |
126 client.onConnect = () { | 68 Expect.isNotNull(client); |
127 Expect.equals(true, client != null); | 69 client.close(); |
128 try { | 70 try { |
129 List<int> buffer = new List<int>.fixedLength(10); | 71 client.close(); |
130 client.readList(buffer, -1, 1); | 72 } on SocketIOException catch(ex) { |
131 } on RangeError catch (ex) { | 73 exceptionCaught = true; |
132 exceptionCaught = true; | 74 } catch (ex) { |
133 } on Exception catch (ex) { | 75 wrongExceptionCaught = true; |
134 wrongExceptionCaught = true; | 76 } |
135 } | 77 Expect.isFalse(exceptionCaught); |
136 Expect.equals(true, exceptionCaught); | 78 Expect.isFalse(wrongExceptionCaught); |
137 Expect.equals(true, !wrongExceptionCaught); | 79 try { |
138 exceptionCaught = false; | 80 client.destroy(); |
139 | 81 } on SocketIOException catch(ex) { |
140 try { | 82 exceptionCaught = true; |
141 List<int> buffer = new List<int>.fixedLength(10); | 83 } catch (ex) { |
142 client.readList(buffer, 0, -1); | 84 print(ex); |
143 } on RangeError catch (ex) { | 85 wrongExceptionCaught = true; |
144 exceptionCaught = true; | 86 } |
145 } on Exception catch (ex) { | 87 Expect.isFalse(exceptionCaught); |
146 wrongExceptionCaught = true; | 88 Expect.isFalse(wrongExceptionCaught); |
147 } | 89 try { |
148 Expect.equals(true, exceptionCaught); | 90 List<int> buffer = new List<int>.fixedLength(10); |
149 Expect.equals(true, !wrongExceptionCaught); | 91 client.add(buffer); |
150 exceptionCaught = false; | 92 } on StateError catch (ex) { |
151 | 93 exceptionCaught = true; |
152 try { | 94 } catch (ex) { |
153 List<int> buffer = new List<int>.fixedLength(10); | 95 wrongExceptionCaught = true; |
154 client.writeList(buffer, -1, 1); | 96 } |
155 } on RangeError catch (ex) { | 97 Expect.isTrue(exceptionCaught); |
156 exceptionCaught = true; | 98 Expect.isFalse(wrongExceptionCaught); |
157 } on Exception catch (ex) { | 99 |
158 wrongExceptionCaught = true; | 100 server.close(); |
159 } | 101 }); |
160 Expect.equals(true, exceptionCaught); | 102 }); |
161 Expect.equals(true, !wrongExceptionCaught); | 103 } |
162 exceptionCaught = false; | 104 |
163 | 105 static void clientSocketDestroyNoErrorTest() { |
164 try { | 106 ServerSocket.bind().then((server) { |
165 List<int> buffer = new List<int>.fixedLength(10); | 107 server.listen((socket) { |
166 client.writeList(buffer, 0, -1); | 108 socket.pipe(socket); |
167 } on RangeError catch (ex) { | 109 }); |
168 exceptionCaught = true; | 110 Socket.connect("127.0.0.1", server.port).then((client) { |
169 } on Exception catch (ex) { | 111 client.listen((data) {}, onDone: server.close); |
170 wrongExceptionCaught = true; | 112 client.destroy(); |
171 } | 113 }); |
172 Expect.equals(true, exceptionCaught); | 114 }); |
173 Expect.equals(true, !wrongExceptionCaught); | 115 } |
174 | 116 |
175 server.close(); | 117 static void clientSocketAddDestroyNoErrorTest() { |
176 client.close(); | 118 ServerSocket.bind().then((server) { |
177 }; | 119 server.listen((socket) { |
| 120 // Passive block data by not sobscribing to socket. |
| 121 }); |
| 122 Socket.connect("127.0.0.1", server.port).then((client) { |
| 123 client.listen((data) {}, onDone: server.close); |
| 124 client.add(new List.fixedLength(1024 * 1024, fill: 0)); |
| 125 client.destroy(); |
| 126 }); |
| 127 }); |
| 128 } |
| 129 |
| 130 static void clientSocketAddCloseNoErrorTest() { |
| 131 ServerSocket.bind().then((server) { |
| 132 var completer = new Completer(); |
| 133 server.listen((socket) { |
| 134 // The socket is 'paused' until the future completes. |
| 135 completer.future.then((_) => socket.pipe(socket)); |
| 136 }); |
| 137 Socket.connect("127.0.0.1", server.port).then((client) { |
| 138 const int SIZE = 1024 * 1024; |
| 139 int count = 0; |
| 140 client.listen( |
| 141 (data) => count += data.length, |
| 142 onDone: () { |
| 143 Expect.equals(SIZE, count); |
| 144 server.close(); |
| 145 }); |
| 146 client.add(new List.fixedLength(SIZE, fill: 0)); |
| 147 client.close(); |
| 148 // Start piping now. |
| 149 completer.complete(null); |
| 150 }); |
| 151 }); |
| 152 } |
| 153 |
| 154 static void clientSocketAddCloseErrorTest() { |
| 155 ServerSocket.bind().then((server) { |
| 156 var completer = new Completer(); |
| 157 server.listen((socket) { |
| 158 completer.future.then((_) => socket.destroy()); |
| 159 }); |
| 160 Socket.connect("127.0.0.1", server.port).then((client) { |
| 161 const int SIZE = 1024 * 1024; |
| 162 int errors = 0; |
| 163 client.listen( |
| 164 (data) => Expect.fail("Unexpected data"), |
| 165 onError: (error) { |
| 166 Expect.isTrue(error.error is SocketIOException); |
| 167 errors++; |
| 168 }, |
| 169 onDone: () { |
| 170 // We get either a close or an error followed by a close |
| 171 // on the socket. Whether we get both depends on |
| 172 // whether the system notices the error for the read |
| 173 // event or only for the write event. |
| 174 Expect.isTrue(errors <= 1); |
| 175 server.close(); |
| 176 }); |
| 177 client.add(new List.fixedLength(SIZE, fill: 0)); |
| 178 // Destroy other socket now. |
| 179 completer.complete(null); |
| 180 var port = new ReceivePort(); |
| 181 client.done.then( |
| 182 (_) { |
| 183 Expect.fail("Expected error"); |
| 184 }, |
| 185 onError: (error) { |
| 186 Expect.isTrue(error.error is SocketIOException); |
| 187 port.close(); |
| 188 }); |
| 189 }); |
| 190 }); |
| 191 } |
| 192 |
| 193 static void clientSocketAddCloseResultErrorTest() { |
| 194 ServerSocket.bind().then((server) { |
| 195 var completer = new Completer(); |
| 196 server.listen((socket) { |
| 197 completer.future.then((_) => socket.destroy()); |
| 198 }); |
| 199 Socket.connect("127.0.0.1", server.port).then((client) { |
| 200 const int SIZE = 1024 * 1024; |
| 201 int errors = 0; |
| 202 client.add(new List.fixedLength(SIZE, fill: 0)); |
| 203 client.close(); |
| 204 client.done.catchError((error) { |
| 205 server.close(); |
| 206 }); |
| 207 // Destroy other socket now. |
| 208 completer.complete(null); |
| 209 }); |
| 210 }); |
178 } | 211 } |
179 | 212 |
180 static void unknownHostTest() { | 213 static void unknownHostTest() { |
181 // Port to verify that the test completes. | 214 // Port to verify that the test completes. |
182 var port = new ReceivePort(); | 215 var port = new ReceivePort(); |
183 port.receive((message, replyTo) => null); | 216 port.receive((message, replyTo) => null); |
184 | 217 |
185 Socket s = new Socket("hede.hule.hest", 1234); | 218 Socket.connect("hede.hule.hest", 1234) |
186 s.onError = (e) => port.close(); | 219 .then((socket) => Expect.fail("Connection completed")) |
187 s.onConnect = () => Expect.fail("Connection completed"); | 220 .catchError((e) => port.close(), test: (e) => e is SocketIOException); |
| 221 |
188 } | 222 } |
189 | 223 |
190 static void testMain() { | 224 static void testMain() { |
191 serverSocketExceptionTest(); | 225 serverSocketExceptionTest(); |
| 226 serverSocketCloseListenTest(); |
| 227 serverSocketListenCloseTest(); |
192 clientSocketExceptionTest(); | 228 clientSocketExceptionTest(); |
193 indexOutOfRangeExceptionTest(); | 229 clientSocketDestroyNoErrorTest(); |
| 230 clientSocketAddDestroyNoErrorTest(); |
| 231 clientSocketAddCloseNoErrorTest(); |
| 232 clientSocketAddCloseErrorTest(); |
| 233 clientSocketAddCloseResultErrorTest(); |
194 unknownHostTest(); | 234 unknownHostTest(); |
195 } | 235 } |
196 } | 236 } |
197 | 237 |
198 main() { | 238 main() { |
199 SocketExceptionTest.testMain(); | 239 SocketExceptionTest.testMain(); |
200 } | 240 } |
201 | 241 |
OLD | NEW |