|  | // 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 setting writeEventsEnabled on a socket that is | 
|  | // closed for read (the other end has closed for write) does not send | 
|  | // an additional READ_CLOSED event. | 
|  |  | 
|  | import "dart:async"; | 
|  | import "dart:io"; | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | final Duration delay = new Duration(milliseconds: 100); | 
|  | final List<int> data = new List.generate(100, (i) => i % 20 + 65); | 
|  | late RawServerSocket server; | 
|  | late RawSocket client; | 
|  | bool serverReadClosedReceived = false; | 
|  | bool serverFirstWrite = true; | 
|  |  | 
|  | void serverListen(RawSocket serverSide) { | 
|  | void serveData(RawSocketEvent event) { | 
|  | switch (event) { | 
|  | case RawSocketEvent.write: | 
|  | serverSide.write(data); | 
|  | if (serverFirstWrite) { | 
|  | serverFirstWrite = false; | 
|  | new Future.delayed(delay, () { | 
|  | serverSide.writeEventsEnabled = true; | 
|  | }); | 
|  | } else { | 
|  | new Future.delayed(delay, () { | 
|  | Expect.isTrue(serverReadClosedReceived); | 
|  | serverSide.shutdown(SocketDirection.send); | 
|  | server.close(); | 
|  | }); | 
|  | } | 
|  | break; | 
|  | case RawSocketEvent.readClosed: | 
|  | Expect.isFalse(serverReadClosedReceived); | 
|  | serverReadClosedReceived = true; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | serverSide.listen(serveData); | 
|  | } | 
|  |  | 
|  | test() async { | 
|  | server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0); | 
|  | server.listen(serverListen); | 
|  | client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port); | 
|  | client.shutdown(SocketDirection.send); | 
|  | client.listen((RawSocketEvent event) { | 
|  | if (event == RawSocketEvent.read) { | 
|  | client.read(); | 
|  | } | 
|  | }); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | test(); | 
|  | } |