lessless

lessless

Network Programming in Elixir and Erlang: Chat integration tests are failing at random

Title: Network Programming in Elixir and Erlang (p. 56)

Hi,
Thanks for the amazing book, first and foremost.

I found that Chat app integration tests, as they are provided on page 56, are randomly failing when I’m running them multiple times.

For example, all mix test runs were executed against the same codebase, with no modifications. Some runs succeeded, some failed and failed in different tests.

mix test
Compiling 1 file (.ex)
Generated chat app

16:48:32.613 [info] Started chat server on port 4101
Running ExUnit with seed: 621706, max_cases: 20

.........
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 0 failures
mix test

16:48:34.200 [info] Started chat server on port 4101
Running ExUnit with seed: 208381, max_cases: 20

.........
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 0 failures
mix test

16:48:35.467 [info] Started chat server on port 4101
Running ExUnit with seed: 474408, max_cases: 20

.........
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 0 failures
mix test

16:48:36.701 [info] Started chat server on port 4101
Running ExUnit with seed: 709368, max_cases: 20

......
16:48:36.961 [error] GenServer #PID<0.180.0> terminating
** (FunctionClauseError) no function clause matching in Chat.Connection.handle_info/2
    (chat 0.1.0) lib/chat/connection.ex:19: Chat.Connection.handle_info({:tcp_closed, #Port<0.11>}, %Chat.Connection{socket: #Port<0.11>, username: "amy", buffer: ""})
    (stdlib 6.2.2.2) gen_server.erl:2345: :gen_server.try_handle_info/3
    (stdlib 6.2.2.2) gen_server.erl:2433: :gen_server.handle_msg/6
    (stdlib 6.2.2.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: {:tcp_closed, #Port<0.11>}
State: %Chat.Connection{socket: #Port<0.11>, username: "amy", buffer: ""}

16:48:36.961 [error] GenServer #PID<0.181.0> terminating
** (FunctionClauseError) no function clause matching in Chat.Connection.handle_info/2
    (chat 0.1.0) lib/chat/connection.ex:19: Chat.Connection.handle_info({:tcp_closed, #Port<0.12>}, %Chat.Connection{socket: #Port<0.12>, username: "bern", buffer: ""})
    (stdlib 6.2.2.2) gen_server.erl:2345: :gen_server.try_handle_info/3
    (stdlib 6.2.2.2) gen_server.erl:2433: :gen_server.handle_msg/6
    (stdlib 6.2.2.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: {:tcp_closed, #Port<0.12>}
State: %Chat.Connection{socket: #Port<0.12>, username: "bern", buffer: ""}

16:48:36.961 [error] GenServer #PID<0.179.0> terminating
** (FunctionClauseError) no function clause matching in Chat.Connection.handle_info/2
    (chat 0.1.0) lib/chat/connection.ex:19: Chat.Connection.handle_info({:tcp_closed, #Port<0.8>}, %Chat.Connection{socket: #Port<0.8>, username: "jd", buffer: ""})
    (stdlib 6.2.2.2) gen_server.erl:2345: :gen_server.try_handle_info/3
    (stdlib 6.2.2.2) gen_server.erl:2433: :gen_server.handle_msg/6
    (stdlib 6.2.2.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: {:tcp_closed, #Port<0.8>}
State: %Chat.Connection{socket: #Port<0.8>, username: "jd", buffer: ""}


  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:48:55.294 [info] Started chat server on port 4101
Running ExUnit with seed: 303579, max_cases: 20

......

  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:48:57.808 [info] Started chat server on port 4101
Running ExUnit with seed: 817244, max_cases: 20

......

  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:48:59.453 [info] Started chat server on port 4101
Running ExUnit with seed: 461426, max_cases: 20

......

  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:49:00.937 [info] Started chat server on port 4101
Running ExUnit with seed: 944586, max_cases: 20

......
16:49:01.205 [error] GenServer #PID<0.180.0> terminating
** (FunctionClauseError) no function clause matching in Chat.Connection.handle_info/2
    (chat 0.1.0) lib/chat/connection.ex:19: Chat.Connection.handle_info({:tcp_closed, #Port<0.10>}, %Chat.Connection{socket: #Port<0.10>, username: "amy", buffer: ""})
    (stdlib 6.2.2.2) gen_server.erl:2345: :gen_server.try_handle_info/3
    (stdlib 6.2.2.2) gen_server.erl:2433: :gen_server.handle_msg/6
    (stdlib 6.2.2.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: {:tcp_closed, #Port<0.10>}
State: %Chat.Connection{socket: #Port<0.10>, username: "amy", buffer: ""}

16:49:01.205 [error] GenServer #PID<0.181.0> terminating
** (FunctionClauseError) no function clause matching in Chat.Connection.handle_info/2
    (chat 0.1.0) lib/chat/connection.ex:19: Chat.Connection.handle_info({:tcp_closed, #Port<0.12>}, %Chat.Connection{socket: #Port<0.12>, username: "bern", buffer: ""})
    (stdlib 6.2.2.2) gen_server.erl:2345: :gen_server.try_handle_info/3
    (stdlib 6.2.2.2) gen_server.erl:2433: :gen_server.handle_msg/6
    (stdlib 6.2.2.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: {:tcp_closed, #Port<0.12>}
State: %Chat.Connection{socket: #Port<0.12>, username: "bern", buffer: ""}

16:49:01.205 [error] GenServer #PID<0.179.0> terminating
** (FunctionClauseError) no function clause matching in Chat.Connection.handle_info/2
    (chat 0.1.0) lib/chat/connection.ex:19: Chat.Connection.handle_info({:tcp_closed, #Port<0.8>}, %Chat.Connection{socket: #Port<0.8>, username: "jd", buffer: ""})
    (stdlib 6.2.2.2) gen_server.erl:2345: :gen_server.try_handle_info/3
    (stdlib 6.2.2.2) gen_server.erl:2433: :gen_server.handle_msg/6
    (stdlib 6.2.2.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: {:tcp_closed, #Port<0.8>}
State: %Chat.Connection{socket: #Port<0.8>, username: "jd", buffer: ""}


  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:49:02.370 [info] Started chat server on port 4101
Running ExUnit with seed: 378187, max_cases: 20

......

  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:49:04.997 [info] Started chat server on port 4101
Running ExUnit with seed: 5948, max_cases: 20

......

  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:49:08.565 [info] Started chat server on port 4101
Running ExUnit with seed: 573340, max_cases: 20

......

  1) test server closes connection ficlient sends register message twice (Chat.IntegrationTest)
     test/chat/integration_test.exs:9
     Assertion with =~ failed
     code:  assert log =~ "Invalid Register message"
     left:  ""
     right: "Invalid Register message"
     stacktrace:
       test/chat/integration_test.exs:21: (test)

..
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 1 failure
mix test

16:49:16.089 [info] Started chat server on port 4101
Running ExUnit with seed: 98240, max_cases: 20

.........
Finished in 0.2 seconds (0.2s async, 0.00s sync)
1 doctest, 8 tests, 0 failures

The repo to reproduce the issue is available at GitHub - lessless/chat: Errata for

Where Next?

Popular Pragmatic Bookshelf topics Top

johnp
Running the examples in chapter 5 c under pytest 5.4.1 causes an AttributeError: ‘module’ object has no attribute ‘config’. In particula...
New
Alexandr
Hi everyone! There is an error on the page 71 in the book “Programming machine learning from coding to depp learning” P. Perrotta. You c...
New
gilesdotcodes
In case this helps anyone, I’ve had issues setting up the rails source code. Here were the solutions: In Gemfile, change gem 'rails' t...
New
swlaschin
The book has the same “Problem space/Solution space” diagram on page 18 as is on page 17. The correct Problem/Solution space diagrams ar...
New
jskubick
I’m running Android Studio “Arctic Fox” 2020.3.1 Patch 2, and I’m embarrassed to admit that I only made it to page 8 before running into ...
New
fynn
This is as much a suggestion as a question, as a note for others. Locally the SGP30 wasn’t available, so I ordered a SGP40. On page 53, ...
New
brunogirin
When installing Cards as an editable package, I get the following error: ERROR: File “setup.py” not found. Directory cannot be installe...
New
AufHe
I’m a newbie to Rails 7 and have hit an issue with the bin/Dev script mentioned on pages 112-113. Iteration A1 - Seeing the list of prod...
New
ggerico
I got this error when executing the plot files on macOS Ventura 13.0.1 with Python 3.10.8 and matplotlib 3.6.1: programming_ML/code/03_...
New
New

Other popular topics Top

PragmaticBookshelf
Brace yourself for a fun challenge: build a photorealistic 3D renderer from scratch! In just a couple of weeks, build a ray tracer that r...
New
DevotionGeo
I know that these benchmarks might not be the exact picture of real-world scenario, but still I expect a Rust web framework performing a ...
New
PragmaticBookshelf
Tailwind CSS is an exciting new CSS framework that allows you to design your site by composing simple utility classes to create complex e...
New
Maartz
Hi folks, I don’t know if I saw this here but, here’s a new programming language, called Roc Reminds me a bit of Elm and thus Haskell. ...
New
mafinar
This is going to be a long an frequently posted thread. While talking to a friend of mine who has taken data structure and algorithm cou...
New
AstonJ
Was just curious to see if any were around, found this one: I got 51/100: Not sure if it was meant to buy I am sure at times the b...
New
PragmaticBookshelf
Author Spotlight: Peter Ullrich @PJUllrich Data is at the core of every business, but it is useless if nobody can access and analyze ...
New
New
PragmaticBookshelf
Build modern server-driven web applications using htmx. Whatever programming language you use, you’ll write less (and cleaner) code. ...
New
PragmaticBookshelf
Explore the power of Ash Framework by modeling and building the domain for a real-world web application. Rebecca Le @sevenseacat and ...
New

Sub Categories: