[VM / Test] Add an API test for sending external typed data to a native
port.
TEST=new test added.
Change-Id: I90dddb169bef0d36a94e15ece85e6b591d07927a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/223720
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 426bb94..02cbfa3 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -8121,6 +8121,64 @@
EXPECT(Dart_CloseNativePort(port_id2));
}
+static const intptr_t kSendLength = 16;
+
+static void NewNativePort_ExternalTypedData(Dart_Port dest_port_id,
+ Dart_CObject* message) {
+ // Gets a send port message.
+ EXPECT_NOTNULL(message);
+ EXPECT_EQ(Dart_CObject_kTypedData, message->type);
+ EXPECT_EQ(Dart_TypedData_kUint8, message->value.as_typed_data.type);
+ EXPECT_EQ(kSendLength, message->value.as_typed_data.length);
+ for (intptr_t i = 0; i < kSendLength; i++) {
+ EXPECT_EQ((0x41 + i), message->value.as_typed_data.values[i]);
+ }
+}
+
+static void FinalizeTypedData(void* isolate_callback_data, void* peer) {
+ delete[] reinterpret_cast<int8_t*>(peer);
+}
+
+TEST_CASE(DartAPI_NativePortPostExternalTypedData) {
+ int8_t* extTypedData = new int8_t[kSendLength];
+ for (int i = 0; i < kSendLength; i++) {
+ extTypedData[i] = 0x41 + i;
+ }
+ const char* kScriptChars =
+ "import 'dart:typed_data';\n"
+ "import 'dart:isolate';\n"
+ "void callPort(SendPort port, Uint8List data) {\n"
+ " port.send(data);\n"
+ "}\n";
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ Dart_EnterScope();
+
+ Dart_Port port_id =
+ Dart_NewNativePort("Port123", NewNativePort_ExternalTypedData, true);
+
+ Dart_Handle send_port = Dart_NewSendPort(port_id);
+ EXPECT_VALID(send_port);
+
+ Dart_Handle extdata = Dart_NewExternalTypedDataWithFinalizer(
+ Dart_TypedData_kUint8, extTypedData, kSendLength, extTypedData,
+ kSendLength, FinalizeTypedData);
+ EXPECT_VALID(extdata);
+
+ // Test first port.
+ Dart_Handle dart_args[2];
+ dart_args[0] = send_port;
+ dart_args[1] = extdata;
+ Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 2, dart_args);
+ EXPECT_VALID(result);
+ result = Dart_RunLoop();
+ EXPECT_VALID(result);
+
+ Dart_ExitScope();
+
+ // Delete the native ports.
+ EXPECT(Dart_CloseNativePort(port_id));
+}
+
static void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
Dart_CObject* message) {
EXPECT_NOTNULL(message);