| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| // |
| // This test checks that a shutdown(SocketDirection.send) of a socket, |
| // when the other end is already closed, does not discard unread data |
| // that remains in the connection. |
| |
| import "dart:io"; |
| import "dart:async"; |
| import "package:expect/expect.dart"; |
| |
| RawServerSocket server; |
| RawSocket client; |
| Duration delay = new Duration(milliseconds: 100); |
| |
| void serverListen(RawSocket serverSide) { |
| var data = new List.generate(200, (i) => i % 20 + 65); |
| var offset = 0; |
| void serveData(RawSocketEvent event) { |
| if (event == RawSocketEvent.write) { |
| while (offset < data.length) { |
| var written = serverSide.write(data, offset); |
| offset += written; |
| if (written == 0) { |
| serverSide.writeEventsEnabled = true; |
| return; |
| } |
| } |
| serverSide.close(); |
| server.close(); |
| } |
| } |
| |
| serverSide.listen(serveData); |
| } |
| |
| void clientListen(RawSocketEvent event) { |
| if (event == RawSocketEvent.read) { |
| client.readEventsEnabled = false; |
| new Future.delayed(delay, () { |
| var data = client.read(100); |
| if (data == null) { |
| // If there is no data ready to read, wait until there is data |
| // that can be read, before running the rest of the test. |
| client.readEventsEnabled = true; |
| return; |
| } |
| client.shutdown(SocketDirection.send); |
| data = client.read(100); |
| Expect.isNotNull(data); |
| client.close(); |
| }); |
| } |
| } |
| |
| test() async { |
| server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0); |
| server.listen(serverListen); |
| client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port); |
| client.listen(clientListen); |
| } |
| |
| void main() { |
| test(); |
| } |