| Index: runtime/vm/dart_api_impl_test.cc
|
| diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
|
| index 1499f37fc348dddb403295350128816bc2e1d913..3cbf287d699d00185c127555a576243920e75ae8 100644
|
| --- a/runtime/vm/dart_api_impl_test.cc
|
| +++ b/runtime/vm/dart_api_impl_test.cc
|
| @@ -6980,6 +6980,7 @@ void NewNativePort_send321(Dart_Port dest_port_id,
|
| Dart_CObject* message) {
|
| // Gets a null message.
|
| EXPECT_NOTNULL(message);
|
| + EXPECT_EQ(Dart_CObject_kArray, message->type);
|
| EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
|
|
|
| // Post integer value.
|
| @@ -7067,6 +7068,194 @@ UNIT_TEST_CASE(NewNativePort) {
|
| }
|
|
|
|
|
| +void NewNativePort_sendInteger123(Dart_Port dest_port_id,
|
| + Dart_CObject *message) {
|
| + // Gets a send port message.
|
| + EXPECT_NOTNULL(message);
|
| + EXPECT_EQ(Dart_CObject_kArray, message->type);
|
| + EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
|
| +
|
| + // Post integer value.
|
| + Dart_PostInteger(
|
| + message->value.as_array.values[0]->value.as_send_port.id, 123);
|
| +}
|
| +
|
| +
|
| +void NewNativePort_sendInteger321(Dart_Port dest_port_id,
|
| + Dart_CObject* message) {
|
| + // Gets a null message.
|
| + EXPECT_NOTNULL(message);
|
| + EXPECT_EQ(Dart_CObject_kArray, message->type);
|
| + EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
|
| +
|
| + // Post integer value.
|
| + Dart_PostInteger(
|
| + message->value.as_array.values[0]->value.as_send_port.id, 321);
|
| +}
|
| +
|
| +
|
| +TEST_CASE(NativePortPostInteger) {
|
| + const char* kScriptChars =
|
| + "import 'dart:isolate';\n"
|
| + "void callPort(SendPort port) {\n"
|
| + " var receivePort = new RawReceivePort();\n"
|
| + " var replyPort = receivePort.sendPort;\n"
|
| + " port.send([replyPort]);\n"
|
| + " receivePort.handler = (message) {\n"
|
| + " receivePort.close();\n"
|
| + " throw new Exception(message);\n"
|
| + " };\n"
|
| + "}\n";
|
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
| + Dart_EnterScope();
|
| +
|
| + Dart_Port port_id1 =
|
| + Dart_NewNativePort("Port123", NewNativePort_sendInteger123, true);
|
| + Dart_Port port_id2 =
|
| + Dart_NewNativePort("Port321", NewNativePort_sendInteger321, true);
|
| +
|
| + Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
|
| + EXPECT_VALID(send_port1);
|
| + Dart_Handle send_port2 = Dart_NewSendPort(port_id2);
|
| + EXPECT_VALID(send_port2);
|
| +
|
| + // Test first port.
|
| + Dart_Handle dart_args[1];
|
| + dart_args[0] = send_port1;
|
| + Dart_Handle result =
|
| + Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + result = Dart_RunLoop();
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
|
| +
|
| + // result second port.
|
| + dart_args[0] = send_port2;
|
| + result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + result = Dart_RunLoop();
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result));
|
| +
|
| + Dart_ExitScope();
|
| +
|
| + // Delete the native ports.
|
| + EXPECT(Dart_CloseNativePort(port_id1));
|
| + EXPECT(Dart_CloseNativePort(port_id2));
|
| +}
|
| +
|
| +
|
| +void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
|
| + Dart_CObject *message) {
|
| + EXPECT_NOTNULL(message);
|
| +
|
| + if ((message->type == Dart_CObject_kArray) &&
|
| + (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
|
| + // Post integer value.
|
| + Dart_PostInteger(
|
| + message->value.as_array.values[0]->value.as_send_port.id, 123);
|
| + } else {
|
| + EXPECT_EQ(message->type, Dart_CObject_kNull);
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_CASE(NativePortReceiveNull) {
|
| + const char* kScriptChars =
|
| + "import 'dart:isolate';\n"
|
| + "void callPort(SendPort port) {\n"
|
| + " var receivePort = new RawReceivePort();\n"
|
| + " var replyPort = receivePort.sendPort;\n"
|
| + " port.send(null);\n"
|
| + " port.send([replyPort]);\n"
|
| + " receivePort.handler = (message) {\n"
|
| + " receivePort.close();\n"
|
| + " throw new Exception(message);\n"
|
| + " };\n"
|
| + "}\n";
|
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
| + Dart_EnterScope();
|
| +
|
| + Dart_Port port_id1 =
|
| + Dart_NewNativePort("PortNull", NewNativePort_nativeReceiveNull, true);
|
| + Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
|
| + EXPECT_VALID(send_port1);
|
| +
|
| + // Test first port.
|
| + Dart_Handle dart_args[1];
|
| + dart_args[0] = send_port1;
|
| + Dart_Handle result =
|
| + Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + result = Dart_RunLoop();
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
|
| +
|
| + Dart_ExitScope();
|
| +
|
| + // Delete the native ports.
|
| + EXPECT(Dart_CloseNativePort(port_id1));
|
| +}
|
| +
|
| +
|
| +void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id,
|
| + Dart_CObject *message) {
|
| + EXPECT_NOTNULL(message);
|
| +
|
| + if ((message->type == Dart_CObject_kArray) &&
|
| + (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
|
| + // Post integer value.
|
| + Dart_PostInteger(
|
| + message->value.as_array.values[0]->value.as_send_port.id, 123);
|
| + } else {
|
| + EXPECT_EQ(message->type, Dart_CObject_kInt32);
|
| + EXPECT_EQ(message->value.as_int32, 321);
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_CASE(NativePortReceiveInteger) {
|
| + const char* kScriptChars =
|
| + "import 'dart:isolate';\n"
|
| + "void callPort(SendPort port) {\n"
|
| + " var receivePort = new RawReceivePort();\n"
|
| + " var replyPort = receivePort.sendPort;\n"
|
| + " port.send(321);\n"
|
| + " port.send([replyPort]);\n"
|
| + " receivePort.handler = (message) {\n"
|
| + " receivePort.close();\n"
|
| + " throw new Exception(message);\n"
|
| + " };\n"
|
| + "}\n";
|
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
| + Dart_EnterScope();
|
| +
|
| + Dart_Port port_id1 =
|
| + Dart_NewNativePort("PortNull", NewNativePort_nativeReceiveInteger, true);
|
| + Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
|
| + EXPECT_VALID(send_port1);
|
| +
|
| + // Test first port.
|
| + Dart_Handle dart_args[1];
|
| + dart_args[0] = send_port1;
|
| + Dart_Handle result =
|
| + Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + result = Dart_RunLoop();
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
|
| +
|
| + Dart_ExitScope();
|
| +
|
| + // Delete the native ports.
|
| + EXPECT(Dart_CloseNativePort(port_id1));
|
| +}
|
| +
|
| +
|
| static Dart_Isolate RunLoopTestCallback(const char* script_name,
|
| const char* main,
|
| const char* package_root,
|
|
|