Open RedBrogdon opened 3 years ago
CC: @kevmoo.
Do you already have a server running on your machine @ 8080?
Guessing that's it!
I don't believe that's the cause of the initial failure. If I run the tests a second time, though, I do get that error:
00:01 +0 -1: test/function_test.dart: defaults [E]
Expected: should eventually emit an event that 'Listening on :8080'
Actual: <Instance of 'StreamQueue<String>'>
Which: emitted x Stream closed.
which never did emit an event that 'Listening on :8080'
package:test_api expectLater
test/function_test.dart 13:11 main.<fn>
===== asynchronous gap ===========================
dart:async _asyncThenWrapperHelper
test/function_test.dart main.<fn>
Process `dart bin/server.dart` exited with exitCode 255. Output:
[e] Unhandled exception:
[e] SocketException: Failed to create server socket (OS Error: Address already in use, errno = 48), address = 0.0.0.0, port = 8080
[e] #0 _NativeSocket.bind (dart:io-patch/socket_patch.dart:962:7)
[e] <asynchronous suspension>
[e] #1 serve (package:shelf/shelf_io.dart:50:16)
[e] <asynchronous suspension>
[e] #2 run (package:functions_framework/src/run.dart:32:18)
[e] <asynchronous suspension>
[e] #3 _serve (package:functions_framework/serve.dart:127:3)
[e] <asynchronous suspension>
[e] #4 serve (package:functions_framework/serve.dart:53:5)
[e] <asynchronous suspension>
[e] #5 main (file:///Users/redbrogdon/source/hellow/bin/server.dart:20:3)
[e] <asynchronous suspension>
00:01 +0 -1: Some tests failed.
I believe the dart bin/server.dart
process initiated in the first run is hanging out in memory -- If I kill it manually, I can get back to the first error.
That's 🍌 🍌 . Hrm...
Glad you're trying this out!
So? I've just created a project with the helloworld
template and I confirm that dart test
is failing out-of-the-box. That sounds very worrying; does it mean that there's a problem with the test, or maybe the function doesn't work at all?
@kevmoo
Do you already have a server running on your machine @ 8080?
Guessing that's it!
I cannot see in this section of the quickstart that it's required to manually start the server before running dart test
. Is it required?
My output of running dart test
:
backend ✔ 33m ⍉
▶ dart test
00:01 +0 -1: test/function_test.dart: defaults [E]
Expected: <0>
Actual: <-15>
Process `dart bin/server.dart` had an unexpected exit code.
package:test_api expect
package:test_process/test_process.dart 228:5 TestProcess.shouldExit
===== asynchronous gap ===========================
test/function_test.dart 28:5 main.<fn>
Process `dart bin/server.dart` exited with exitCode -15. Output:
Listening on :8080
2021-12-23T11:49:26.447544 0:00:00.005582 GET [200] /
00:01 +0 -1: Some tests failed.
Consider enabling the flag chain-stack-traces to receive more detailed exceptions.
For example, 'dart test --chain-stack-traces'.
backend ✔ 33m ⍉
▶ lsof -i tcp:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dart 85133 jakub 12u IPv4 0x6f20cda13ac1c289 0t0 TCP *:http-alt (LISTEN)
So it seems that the function_test.dart
correctly starts the server process, it starts listening on the correct port, but for some reason the line...
proc.signal(ProcessSignal.sigterm);
...doesn't work as expected and doesn't stop the process. What bothers me is the -15 exit code. I'm not a great expert on *nix systems, but where could this exit code come from, if lsof
proves that the launched process never exited?
I've just checked, and the -15 exit code correspond to SIGTERM, which has signal id = 15.
From Process.exitCode
docs:
If the process was terminated due to a signal the exit code will be a negative value in the range
[-255..-1]
, where the absolute value of the exit code is the signal number.
It seems that it's expected that the exit code will be -15 if we send the sigterm to the process.
So the only mistery is why the server process, from one perspective, seems to exit with the (proper) -15 exit code, but on the other hand seems to be still alive and blocking the port.
Would be awesome if we got this solved, what I could do to help was trying every single ProccessSignal const and did it. All of the maintain that process active and I had to do a lsof -i tcp:8080
then kill PID
, so here is a list of each signal sent and code return at macOS Monterey (12.1) M1 2020 on a direct git clone https://github.com/GoogleCloudPlatform/functions-framework-dart.git
then dart test test/function_test.dart
:
proc.signal(ProcessSignal.sigterm);
RESULT: -15
proc.signal(ProcessSignal.sighup);
-1
proc.signal(ProcessSignal.sigint);
-9
proc.signal(ProcessSignal.sigquit);
-9
proc.signal(ProcessSignal.sigill);
-4
proc.signal(ProcessSignal.sigtrap);
-5
proc.signal(ProcessSignal.sigabrt);
-6
proc.signal(ProcessSignal.sigbus);
-10
proc.signal(ProcessSignal.sigfpe);
-8
proc.signal(ProcessSignal.sigkill);
-9
proc.signal(ProcessSignal.sigusr1);
-30
proc.signal(ProcessSignal.sigsegv);
-11
proc.signal(ProcessSignal.sigusr2);
-31
proc.signal(ProcessSignal.sigpipe);
-9
proc.signal(ProcessSignal.sigalrm);
-14
proc.signal(ProcessSignal.sigterm);
-15
proc.signal(ProcessSignal.sigchld);
-9
proc.signal(ProcessSignal.sigcont);
-9
proc.signal(ProcessSignal.sigstop);
-9
proc.signal(ProcessSignal.sigtstp);
-9
proc.signal(ProcessSignal.sigttin);
-9
proc.signal(ProcessSignal.sigttou);
-9
proc.signal(ProcessSignal.sigurg);
-9
proc.signal(ProcessSignal.sigxcpu);
-24
proc.signal(ProcessSignal.sigxfsz);
-25
proc.signal(ProcessSignal.sigvtalrm);
-26
proc.signal(ProcessSignal.sigprof);
-27
proc.signal(ProcessSignal.sigwinch);
-9
proc.signal(ProcessSignal.sigpoll);
-9
proc.signal(ProcessSignal.sigsys);
-12
I think this might be related to package test_process
about file test_process.dart#L205 which says that TestProcess.Signal is not supported in Windows, this might be not supported by macOS also.
EDIT:
Just found that before sending sigterm
I've put a print(proc.pid);
which shows PID of dart bin/server.dart, but it's different from after error what we got at lsof -i tcp:8080
that means server.dart is creating a secondary process to listen but it is not dealing with that process when sending signal to end.
I just tried creating a project with dartfn, and I can't get the generated code to pass its included tests:
Any idea what might be going wrong for me? Have I missed a step somewhere?
My Dart version is: