OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 import 'dart:async'; |
| 6 import 'dart:io'; |
| 7 import 'dart:convert'; |
| 8 |
| 9 import 'package:async_helper/async_helper.dart'; |
| 10 import 'package:expect/expect.dart'; |
| 11 |
| 12 testBindShared(bool v6Only) { |
| 13 asyncStart(); |
| 14 ServerSocket.bind( |
| 15 'localhost', 0, v6Only: v6Only, shared: true).then((socket) { |
| 16 Expect.isTrue(socket.port > 0); |
| 17 |
| 18 asyncStart(); |
| 19 return ServerSocket.bind( |
| 20 'localhost', socket.port, v6Only: v6Only, shared: true).then((socket2) { |
| 21 Expect.equals(socket.address.address, socket2.address.address); |
| 22 Expect.equals(socket.port, socket2.port); |
| 23 socket.close().whenComplete(asyncEnd); |
| 24 socket2.close().whenComplete(asyncEnd); |
| 25 }); |
| 26 }); |
| 27 } |
| 28 |
| 29 negTestBindSharedMismatch(bool v6Only) { |
| 30 asyncStart(); |
| 31 ServerSocket.bind('localhost', 0, v6Only: v6Only).then((ServerSocket socket) { |
| 32 Expect.isTrue(socket.port > 0); |
| 33 |
| 34 asyncStart(); |
| 35 return ServerSocket.bind( |
| 36 'localhost', socket.port, v6Only: v6Only).catchError((error) { |
| 37 Expect.isTrue(error is SocketException); |
| 38 Expect.isTrue('$error'.contains('shared flag')); |
| 39 socket.close().whenComplete(asyncEnd); |
| 40 asyncEnd(); |
| 41 }); |
| 42 }); |
| 43 } |
| 44 |
| 45 negTestBindV6OnlyMismatch(bool v6Only) { |
| 46 asyncStart(); |
| 47 ServerSocket.bind( |
| 48 'localhost', 0, v6Only: v6Only, shared: true).then((ServerSocket socket) { |
| 49 Expect.isTrue(socket.port > 0); |
| 50 |
| 51 asyncStart(); |
| 52 return ServerSocket.bind( |
| 53 'localhost', socket.port, v6Only: !v6Only, shared: true) |
| 54 .catchError((error) { |
| 55 Expect.isTrue(error is SocketException); |
| 56 Expect.isTrue('$error'.contains('v6Only flag')); |
| 57 socket.close().whenComplete(asyncEnd); |
| 58 asyncEnd(); |
| 59 }); |
| 60 }); |
| 61 } |
| 62 |
| 63 Future testBindDifferentAddresses(InternetAddress addr1, |
| 64 InternetAddress addr2, |
| 65 bool addr1V6Only, |
| 66 bool addr2V6Only) { |
| 67 asyncStart(); |
| 68 return ServerSocket.bind( |
| 69 addr1, 0, v6Only: addr1V6Only, shared: false).then((socket) { |
| 70 Expect.isTrue(socket.port > 0); |
| 71 |
| 72 asyncStart(); |
| 73 return ServerSocket.bind( |
| 74 addr2, socket.port, v6Only: addr2V6Only, shared: false).then((socket2) { |
| 75 Expect.equals(socket.port, socket2.port); |
| 76 |
| 77 return Future.wait([ |
| 78 socket.close().whenComplete(asyncEnd), |
| 79 socket2.close().whenComplete(asyncEnd), |
| 80 ]); |
| 81 }); |
| 82 }); |
| 83 } |
| 84 |
| 85 testSocketReferenceInteroperability() { |
| 86 asyncStart(); |
| 87 ServerSocket.bind('localhost', 0).then((ServerSocket socket) { |
| 88 Expect.isTrue(socket.port > 0); |
| 89 |
| 90 asyncStart(); |
| 91 socket.reference.create().then((socket2) { |
| 92 bool gotResponseFrom1; |
| 93 bool gotResponseFrom2; |
| 94 |
| 95 Expect.isTrue(socket.port > 0); |
| 96 Expect.equals(socket.port, socket2.port); |
| 97 |
| 98 asyncStart(); |
| 99 asyncStart(); |
| 100 socket.listen((client) { |
| 101 client.drain().whenComplete(asyncEnd); |
| 102 client.write('1: hello world'); |
| 103 client.close(); |
| 104 socket.close().whenComplete(asyncEnd); |
| 105 }, onDone: asyncEnd); |
| 106 |
| 107 asyncStart(); |
| 108 asyncStart(); |
| 109 socket2.listen((client) { |
| 110 client.drain().whenComplete(asyncEnd); |
| 111 client.write('2: hello world'); |
| 112 client.close(); |
| 113 socket2.close().whenComplete(asyncEnd); |
| 114 }, onDone: asyncEnd); |
| 115 |
| 116 var futures = []; |
| 117 for (int i = 0; i < 2; i++) { |
| 118 asyncStart(); |
| 119 futures.add( |
| 120 Socket.connect(socket.address, socket.port).then((Socket socket) { |
| 121 socket.close().whenComplete(asyncEnd); |
| 122 asyncStart(); |
| 123 return socket |
| 124 .transform(ASCII.decoder).join('').then((String result) { |
| 125 if (result == '1: hello world') gotResponseFrom1 = true; |
| 126 else if (result == '2: hello world') gotResponseFrom2 = true; |
| 127 else throw 'Unexpected result from server: $result'; |
| 128 asyncEnd(); |
| 129 }); |
| 130 })); |
| 131 } |
| 132 asyncStart(); |
| 133 Future.wait(futures).then((_) { |
| 134 Expect.isTrue(gotResponseFrom1); |
| 135 Expect.isTrue(gotResponseFrom2); |
| 136 asyncEnd(); |
| 137 }); |
| 138 }); |
| 139 }); |
| 140 } |
| 141 |
| 142 void main() { |
| 143 testBindShared(false); |
| 144 testBindShared(true); |
| 145 |
| 146 negTestBindSharedMismatch(false); |
| 147 negTestBindSharedMismatch(true); |
| 148 |
| 149 negTestBindV6OnlyMismatch(true); |
| 150 negTestBindV6OnlyMismatch(false); |
| 151 |
| 152 asyncStart(); |
| 153 testBindDifferentAddresses(InternetAddress.ANY_IP_V6, |
| 154 InternetAddress.ANY_IP_V4, |
| 155 true, |
| 156 false).then((_) { |
| 157 testBindDifferentAddresses(InternetAddress.ANY_IP_V4, |
| 158 InternetAddress.ANY_IP_V6, |
| 159 false, |
| 160 true); |
| 161 asyncEnd(); |
| 162 }); |
| 163 |
| 164 testSocketReferenceInteroperability(); |
| 165 } |
OLD | NEW |