Index: runtime/vm/dart_api_impl_test.cc |
=================================================================== |
--- runtime/vm/dart_api_impl_test.cc (revision 3743) |
+++ runtime/vm/dart_api_impl_test.cc (working copy) |
@@ -2801,6 +2801,85 @@ |
} |
+void NewNativePort_send123(Dart_Port dest_port_id, |
+ Dart_Port reply_port_id, |
+ uint8_t* data) { |
+ intptr_t response = 123; |
+ Dart_PostIntArray(reply_port_id, 1, &response); |
+} |
+ |
+ |
+void NewNativePort_send321(Dart_Port dest_port_id, |
+ Dart_Port reply_port_id, |
+ uint8_t* data) { |
+ intptr_t response = 321; |
+ Dart_PostIntArray(reply_port_id, 1, &response); |
+} |
+ |
+ |
+UNIT_TEST_CASE(NewNativePort) { |
+ // Create a port with a bogus handler. |
+ Dart_Port error_port = Dart_NewNativePort("Foo", NULL, true); |
+ EXPECT_EQ(kIllegalPort, error_port); |
+ |
+ // Create the port w/o a current isolate, just to make sure that works. |
+ Dart_Port port_id1 = |
+ Dart_NewNativePort("Port123", NewNativePort_send123, true); |
+ |
+ TestIsolateScope __test_isolate__; |
+ const char* kScriptChars = |
+ "void callPort(SendPort port) {\n" |
+ " port.call(null).receive((message, replyTo) {\n" |
+ " throw new Exception(message[0]);\n" |
+ " });\n" |
+ "}\n"; |
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
+ Dart_EnterScope(); |
+ |
+ // Create a port w/ a current isolate, to make sure that works too. |
+ Dart_Port port_id2 = |
+ Dart_NewNativePort("Port321", NewNativePort_send321, 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_InvokeStatic(lib, |
+ Dart_NewString(""), |
+ Dart_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_InvokeStatic(lib, |
+ Dart_NewString(""), |
+ Dart_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)); |
+} |
+ |
+ |
static bool RunLoopTestCallback(const char* name_prefix, |
void* data, char** error) { |
const char* kScriptChars = |