OLD | NEW |
---|---|
1 // Copyright (c) 2013, 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 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:io'; | 6 import 'dart:io'; |
7 import 'dart:convert'; | 7 import 'dart:convert'; |
8 | 8 |
9 import 'package:async_helper/async_helper.dart'; | 9 import 'package:async_helper/async_helper.dart'; |
10 import 'package:expect/expect.dart'; | 10 import 'package:expect/expect.dart'; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
59 }); | 59 }); |
60 }); | 60 }); |
61 } | 61 } |
62 | 62 |
63 Future testBindDifferentAddresses(InternetAddress addr1, | 63 Future testBindDifferentAddresses(InternetAddress addr1, |
64 InternetAddress addr2, | 64 InternetAddress addr2, |
65 bool addr1V6Only, | 65 bool addr1V6Only, |
66 bool addr2V6Only) async { | 66 bool addr2V6Only) async { |
67 int freePort = await freeIPv4AndIPv6Port(); | 67 int freePort = await freeIPv4AndIPv6Port(); |
68 | 68 |
69 asyncStart(); | 69 var socket = await ServerSocket.bind( |
70 return ServerSocket.bind( | 70 addr1, freePort, v6Only: addr1V6Only, shared: false); |
71 addr1, freePort, v6Only: addr1V6Only, shared: false).then((socket) { | 71 |
72 try { | |
72 Expect.isTrue(socket.port > 0); | 73 Expect.isTrue(socket.port > 0); |
73 | 74 |
74 asyncStart(); | 75 var socket2 = await ServerSocket.bind( |
75 return ServerSocket.bind( | 76 addr2, freePort, v6Only: addr2V6Only, shared: false); |
76 addr2, freePort, v6Only: addr2V6Only, shared: false).then((socket2) { | 77 try { |
77 Expect.equals(socket.port, socket2.port); | 78 Expect.equals(socket.port, socket2.port); |
78 | 79 } finally { |
79 return Future.wait([ | 80 await socket2.close(); |
80 socket.close().whenComplete(asyncEnd), | 81 } |
81 socket2.close().whenComplete(asyncEnd), | 82 } finally { |
82 ]); | 83 await socket.close(); |
83 }); | 84 } |
84 }); | |
85 } | 85 } |
86 | 86 |
87 testListenCloseListenClose(String host) async { | 87 testListenCloseListenClose(String host) async { |
88 asyncStart(); | 88 asyncStart(); |
89 | 89 |
90 ServerSocket socket = | 90 ServerSocket socket = |
91 await ServerSocket.bind(host, 0, shared: true); | 91 await ServerSocket.bind(host, 0, shared: true); |
92 ServerSocket socket2 = | 92 ServerSocket socket2 = |
93 await ServerSocket.bind(host, socket.port, shared: true); | 93 await ServerSocket.bind(host, socket.port, shared: true); |
94 | 94 |
(...skipping 18 matching lines...) Expand all Loading... | |
113 } | 113 } |
114 | 114 |
115 Future<int> freeIPv4AndIPv6Port() async { | 115 Future<int> freeIPv4AndIPv6Port() async { |
116 var socket = | 116 var socket = |
117 await ServerSocket.bind(InternetAddress.ANY_IP_V6, 0, v6Only: false); | 117 await ServerSocket.bind(InternetAddress.ANY_IP_V6, 0, v6Only: false); |
118 int port = socket.port; | 118 int port = socket.port; |
119 await socket.close(); | 119 await socket.close(); |
120 return port; | 120 return port; |
121 } | 121 } |
122 | 122 |
123 Future retry(Future fun(), {int maxCount: 10}) async { | |
124 for (int i = 0; i < maxCount; i++) { | |
125 print("Retry $i"); | |
Bill Hesse
2016/06/28 10:29:28
Put the print after the retry-catch block, and pri
kustermann
2016/06/28 10:36:06
Done.
| |
126 try { | |
127 // If there is no exception this will simply return otherwise we keep | |
128 // trying. | |
129 return await fun(); | |
130 } catch (_) {} | |
131 } | |
132 return await fun(); | |
133 } | |
134 | |
123 main() async { | 135 main() async { |
124 asyncStart(); | 136 asyncStart(); |
125 await testBindDifferentAddresses(InternetAddress.ANY_IP_V6, | 137 |
126 InternetAddress.ANY_IP_V4, | 138 await retry(() async { |
127 true, | 139 await testBindDifferentAddresses(InternetAddress.ANY_IP_V6, |
128 false); | 140 InternetAddress.ANY_IP_V4, |
129 await testBindDifferentAddresses(InternetAddress.ANY_IP_V4, | 141 true, |
130 InternetAddress.ANY_IP_V6, | 142 false); |
131 false, | 143 }); |
132 true); | 144 await retry(() async { |
145 await testBindDifferentAddresses(InternetAddress.ANY_IP_V4, | |
146 InternetAddress.ANY_IP_V6, | |
147 false, | |
148 true); | |
149 }); | |
133 | 150 |
134 for (var host in ['127.0.0.1', '::1']) { | 151 for (var host in ['127.0.0.1', '::1']) { |
135 testBindShared(host, false); | 152 testBindShared(host, false); |
136 testBindShared(host, true); | 153 testBindShared(host, true); |
137 | 154 |
138 negTestBindSharedMismatch(host, false); | 155 negTestBindSharedMismatch(host, false); |
139 negTestBindSharedMismatch(host, true); | 156 negTestBindSharedMismatch(host, true); |
140 | 157 |
141 negTestBindV6OnlyMismatch(host, true); | 158 negTestBindV6OnlyMismatch(host, true); |
142 negTestBindV6OnlyMismatch(host, false); | 159 negTestBindV6OnlyMismatch(host, false); |
143 | 160 |
144 testListenCloseListenClose(host); | 161 testListenCloseListenClose(host); |
145 } | 162 } |
146 asyncEnd(); | 163 asyncEnd(); |
147 } | 164 } |
OLD | NEW |