From cd8058ec92114197ae6517b6e8b0ca308ad2e499 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Tue, 17 Oct 2017 07:27:07 +0200 Subject: [PATCH 1/2] test: allow tests to pass without internet Currently when running the test without an internet connection there are two JavaScript test failures and one cctest. The cctest only fails on Mac as far as I know. (I've only tested using Mac and Linux thus far). This commit moves the two JavaScript tests to test/internet. The details for test_inspector_socket_server.cc: [ RUN ] InspectorSocketServerTest.FailsToBindToNodejsHost make[1]: *** [cctest] Segmentation fault: 11 make: *** [test] Error 2 lldb output: [ RUN ] InspectorSocketServerTest.FailsToBindToNodejsHost Process 63058 stopped * thread #1: tid = 0x7b175, 0x00007fff96d04384 * libsystem_info.dylib`_gai_simple + 87, queue = * 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, * address=0x0) frame #0: 0x00007fff96d04384 libsystem_info.dylib`_gai_simple + 87 libsystem_info.dylib`_gai_simple: -> 0x7fff96d04384 <+87>: movw (%rdx), %ax 0x7fff96d04387 <+90>: movw %ax, -0x2a(%rbp) 0x7fff96d0438b <+94>: movq %r13, -0x38(%rbp) 0x7fff96d0438f <+98>: movq 0x18(%rbp), %rcx (lldb) bt * thread #1: tid = 0x7b175, 0x00007fff96d04384 * libsystem_info.dylib`_gai_simple + 87, queue = * 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, * address=0x0) * frame #0: 0x00007fff96d04384 libsystem_info.dylib`_gai_simple + 87 frame #1: 0x00007fff96cfe98b libsystem_info.dylib`search_addrinfo + 179 frame #2: 0x00007fff96cfafef libsystem_info.dylib`si_addrinfo + 2255 frame #3: 0x00007fff96cfa67b libsystem_info.dylib`getaddrinfo + 179 frame #4: 0x00000001017d8888 cctest`uv__getaddrinfo_work(w=0x00007fff5fbfe210) + 72 at getaddrinfo.c:102 frame #5: 0x00000001017d880e cctest`uv_getaddrinfo(loop=0x000000010287cb80, req=0x00007fff5fbfe1c8, cb=0x0000000000000000, hostname="nodejs.org", service="0", hints=0x00007fff5fbfe268) + 734 at getaddrinfo.c:192 frame #6: 0x000000010171f781 cctest`node::inspector::InspectorSocketServer::Start(this=0x00007fff5fbfe658) + 801 at inspector_socket_server.cc:398 frame #7: 0x00000001016ed590 cctest`InspectorSocketServerTest_FailsToBindToNodejsHost_Test::TestBody(this=0x0000000105001fd0) + 288 at test_inspector_socket_server.cc:593 I'm not sure about the exact cause for this but when using a standalone c program to simulate this it seems like when the ai_flags `AI_NUMERICSERV` is set, which is done in inspector_socket_server.cc line 394, the servname (the port in the FailsToBindToNodejsHost test) is expected to be a numeric port string to avoid looking it up in /etc/services. When the port is 0 as is it was before this commit the segment fault occurs but not if it is non-zero. Here is the example program I used to reproduce: int main(int argc, char *argv[]) { struct addrinfo hints, *info, *p; int res; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_NUMERICSERV; hints.ai_socktype = SOCK_STREAM; // using "0" will segfault if there is no internet connection if ((res = getaddrinfo("nodejs.org", "0", &hints, &info)) != 0) { fprintf(stderr, "Error: %s, (%d)\n", gai_strerror(res), res); exit(1); } fprintf(stdout, "flags %d\n", info->ai_flags); fprintf(stdout, "family %d\n", info->ai_family); fprintf(stdout, "socktype %d\n", info->ai_socktype); fprintf(stdout, "protocol %d\n", info->ai_protocol); } --- test/cctest/test_inspector_socket_server.cc | 2 +- test/{parallel => internet}/test-dgram-membership.js | 0 .../test-dgram-multicast-set-interface-lo.js | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename test/{parallel => internet}/test-dgram-membership.js (100%) rename test/{parallel => internet}/test-dgram-multicast-set-interface-lo.js (100%) diff --git a/test/cctest/test_inspector_socket_server.cc b/test/cctest/test_inspector_socket_server.cc index 83512611824a0d..5eff9d706b2a3a 100644 --- a/test/cctest/test_inspector_socket_server.cc +++ b/test/cctest/test_inspector_socket_server.cc @@ -589,7 +589,7 @@ TEST_F(InspectorSocketServerTest, TerminatingSessionReportsDone) { TEST_F(InspectorSocketServerTest, FailsToBindToNodejsHost) { TestInspectorServerDelegate delegate; - ServerHolder server(&delegate, &loop, "nodejs.org", 0, nullptr); + ServerHolder server(&delegate, &loop, "nodejs.org", 80, nullptr); ASSERT_FALSE(server->Start()); SPIN_WHILE(uv_loop_alive(&loop)); } diff --git a/test/parallel/test-dgram-membership.js b/test/internet/test-dgram-membership.js similarity index 100% rename from test/parallel/test-dgram-membership.js rename to test/internet/test-dgram-membership.js diff --git a/test/parallel/test-dgram-multicast-set-interface-lo.js b/test/internet/test-dgram-multicast-set-interface-lo.js similarity index 100% rename from test/parallel/test-dgram-multicast-set-interface-lo.js rename to test/internet/test-dgram-multicast-set-interface-lo.js From 204416768b92768d0b607353a6747779aae3357d Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Tue, 24 Oct 2017 15:23:58 +0200 Subject: [PATCH 2/2] squash: move internet dependent tests to internet This commit moves only the parts of test-dgram-membership.js that require an internet connection, leaving the others in place. --- test/internet/test-dgram-membership.js | 72 +----------------------- test/parallel/test-dgram-membership.js | 78 ++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 71 deletions(-) create mode 100644 test/parallel/test-dgram-membership.js diff --git a/test/internet/test-dgram-membership.js b/test/internet/test-dgram-membership.js index 183faca1a43b6f..97bc1e648ad79e 100644 --- a/test/internet/test-dgram-membership.js +++ b/test/internet/test-dgram-membership.js @@ -1,82 +1,12 @@ 'use strict'; -const common = require('../common'); +require('../common'); const assert = require('assert'); const dgram = require('dgram'); const multicastAddress = '224.0.0.114'; const setup = dgram.createSocket.bind(dgram, { type: 'udp4', reuseAddr: true }); -// addMembership() on closed socket should throw -{ - const socket = setup(); - socket.close(common.mustCall(() => { - assert.throws(() => { - socket.addMembership(multicastAddress); - }, common.expectsError({ - code: 'ERR_SOCKET_DGRAM_NOT_RUNNING', - type: Error, - message: /^Not running$/ - })); - })); -} - -// dropMembership() on closed socket should throw -{ - const socket = setup(); - socket.close(common.mustCall(() => { - assert.throws(() => { - socket.dropMembership(multicastAddress); - }, common.expectsError({ - code: 'ERR_SOCKET_DGRAM_NOT_RUNNING', - type: Error, - message: /^Not running$/ - })); - })); -} - -// addMembership() with no argument should throw -{ - const socket = setup(); - assert.throws(() => { - socket.addMembership(); - }, common.expectsError({ - code: 'ERR_MISSING_ARGS', - type: TypeError, - message: /^The "multicastAddress" argument must be specified$/ - })); - socket.close(); -} - -// dropMembership() with no argument should throw -{ - const socket = setup(); - assert.throws(() => { - socket.dropMembership(); - }, common.expectsError({ - code: 'ERR_MISSING_ARGS', - type: TypeError, - message: /^The "multicastAddress" argument must be specified$/ - })); - socket.close(); -} - -// addMembership() with invalid multicast address should throw -{ - const socket = setup(); - assert.throws(() => { socket.addMembership('256.256.256.256'); }, - /^Error: addMembership EINVAL$/); - socket.close(); -} - -// dropMembership() with invalid multicast address should throw -{ - const socket = setup(); - assert.throws(() => { socket.dropMembership('256.256.256.256'); }, - /^Error: dropMembership EINVAL$/); - socket.close(); -} - // addMembership() with valid socket and multicast address should not throw { const socket = setup(); diff --git a/test/parallel/test-dgram-membership.js b/test/parallel/test-dgram-membership.js new file mode 100644 index 00000000000000..8729b387bf3991 --- /dev/null +++ b/test/parallel/test-dgram-membership.js @@ -0,0 +1,78 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const dgram = require('dgram'); +const multicastAddress = '224.0.0.114'; + +const setup = dgram.createSocket.bind(dgram, { type: 'udp4', reuseAddr: true }); + +// addMembership() on closed socket should throw +{ + const socket = setup(); + socket.close(common.mustCall(() => { + assert.throws(() => { + socket.addMembership(multicastAddress); + }, common.expectsError({ + code: 'ERR_SOCKET_DGRAM_NOT_RUNNING', + type: Error, + message: /^Not running$/ + })); + })); +} + +// dropMembership() on closed socket should throw +{ + const socket = setup(); + socket.close(common.mustCall(() => { + assert.throws(() => { + socket.dropMembership(multicastAddress); + }, common.expectsError({ + code: 'ERR_SOCKET_DGRAM_NOT_RUNNING', + type: Error, + message: /^Not running$/ + })); + })); +} + +// addMembership() with no argument should throw +{ + const socket = setup(); + assert.throws(() => { + socket.addMembership(); + }, common.expectsError({ + code: 'ERR_MISSING_ARGS', + type: TypeError, + message: /^The "multicastAddress" argument must be specified$/ + })); + socket.close(); +} + +// dropMembership() with no argument should throw +{ + const socket = setup(); + assert.throws(() => { + socket.dropMembership(); + }, common.expectsError({ + code: 'ERR_MISSING_ARGS', + type: TypeError, + message: /^The "multicastAddress" argument must be specified$/ + })); + socket.close(); +} + +// addMembership() with invalid multicast address should throw +{ + const socket = setup(); + assert.throws(() => { socket.addMembership('256.256.256.256'); }, + /^Error: addMembership EINVAL$/); + socket.close(); +} + +// dropMembership() with invalid multicast address should throw +{ + const socket = setup(); + assert.throws(() => { socket.dropMembership('256.256.256.256'); }, + /^Error: dropMembership EINVAL$/); + socket.close(); +}