Files
sdk/tests/lib/isolate/transferable_failed_to_send_test.dart
Robert Nystrom 8a51cb6093 Reformat tests/lib/isolate/** using 3.8 style.
Change-Id: I8fafc8c2788faf848a8a8488b76cb163b7679308
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/425330
Commit-Queue: Lasse Nielsen <lrn@google.com>
Auto-Submit: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Lasse Nielsen <lrn@google.com>
2025-05-02 04:01:24 -07:00

98 lines
3.2 KiB
Dart

// Copyright (c) 2019, 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.
// VMOptions=--no-enable-fast-object-copy
// VMOptions=--enable-fast-object-copy
import "dart:io" show ServerSocket;
import "dart:isolate";
import "dart:typed_data" show ByteData;
import "package:expect/expect.dart";
void main() async {
final port = new ReceivePort();
// Sending a socket object will result in an error.
final socket = await ServerSocket.bind('localhost', 0);
final x = new ByteData(4);
for (int i = 0; i < 4; i++) {
x.setUint8(i, i);
}
{
final transferableFirst = TransferableTypedData.fromList([x]);
Expect.throwsArgumentError(
() => port.sendPort.send(<dynamic>[transferableFirst, socket]),
);
// Once TransferableTypedData was sent even if attempt failed, it can't be
// materialized.
// This need to be changed so that on failed send we should not detach the
// buffer form the transferable. The order should not matter (i.e. if the
// error happens before or after the serializer hits a transferable object)
final data1 = transferableFirst.materialize().asUint8List();
Expect.equals(x.lengthInBytes, data1.length);
for (int i = 0; i < data1.length; i++) {
Expect.equals(i, data1[i]);
}
}
{
final transferableFirst = TransferableTypedData.fromList([x]);
Expect.throwsArgumentError(
() => port.sendPort.send(<dynamic>[
transferableFirst,
transferableFirst,
socket,
]),
);
// Once TransferableTypedData was sent even if attempt failed, it can't be
// materialized.
// This need to be changed so that on failed send we should not detach the
// buffer form the transferable. The order should not matter (i.e. if the
// error happens before or after the serializer hits a transferable object)
final data1 = transferableFirst.materialize().asUint8List();
Expect.equals(x.lengthInBytes, data1.length);
for (int i = 0; i < data1.length; i++) {
Expect.equals(i, data1[i]);
}
}
{
final transferableSecond = TransferableTypedData.fromList([x]);
Expect.throwsArgumentError(
() => port.sendPort.send(<dynamic>[socket, transferableSecond]),
);
// Once TransferableTypedData was sent even if attempt failed, it can't be
// materialized.
final data2 = transferableSecond.materialize().asUint8List();
Expect.equals(x.lengthInBytes, data2.length);
for (int i = 0; i < data2.length; i++) {
Expect.equals(i, data2[i]);
}
}
{
final transferableSecond = TransferableTypedData.fromList([x]);
Expect.throwsArgumentError(
() => port.sendPort.send(<dynamic>[
socket,
transferableSecond,
transferableSecond,
]),
);
// Once TransferableTypedData was sent even if attempt failed, it can't be
// materialized.
final data2 = transferableSecond.materialize().asUint8List();
Expect.equals(x.lengthInBytes, data2.length);
for (int i = 0; i < data2.length; i++) {
Expect.equals(i, data2[i]);
}
}
socket.close();
port.close();
}