3

When I try to run my specs in parallel using the parallel_tests Gem, I am getting these error messages:

foo:~/Projects/cucumber-capybara-saucelabs/spec/requests [] ➜ rake parallel:spec
(in /Volumes/Storage/Projects/cucumber-capybara-saucelabs)
8 processes for 5 specs, ~ 0 specs per process
Starting Rails server on port 3001...
Starting Rails server on port 3001...
Starting Rails server on port 3001...
Starting Rails server on port 3001...
Starting Rails server on port 3001...
[2013-05-22 14:40:12] INFO  WEBrick 1.3.1
[2013-05-22 14:40:12] INFO  ruby 1.9.3 (2013-02-22) [x86_64-darwin12.3.0]
[2013-05-22 14:40:12] INFO  WEBrick::HTTPServer#start: pid=33256 port=3001
Rails server running!
Rails server running!
Rails server running!
Rails server running!
[2013-05-22 14:40:12] INFO  WEBrick 1.3.1
[2013-05-22 14:40:12] INFO  WEBrick 1.3.1
[2013-05-22 14:40:12] INFO  ruby 1.9.3 (2013-02-22) [x86_64-darwin12.3.0]
[2013-05-22 14:40:12] INFO  WEBrick 1.3.1
[2013-05-22 14:40:12] INFO  ruby 1.9.3 (2013-02-22) [x86_64-darwin12.3.0]
[2013-05-22 14:40:12] INFO  ruby 1.9.3 (2013-02-22) [x86_64-darwin12.3.0]
[2013-05-22 14:40:12] WARN  TCPServer Error: Address already in use - bind(2)
[2013-05-22 14:40:12] WARN  TCPServer Error: Address already in use - bind(2)
[2013-05-22 14:40:12] WARN  TCPServer Error: Address already in use - bind(2)
/Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `initialize': Address already in use - bind(2) (/Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `new'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `block in create_listeners'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:82:in `each'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:82:in `create_listeners'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/server.rb:82:in `listen'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/server.rb:70:in `initialize'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/httpserver.rb:45:in `initialize'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/rack-1.4.5/lib/rack/handler/webrick.rb:10:in `new'
    from /Users/foo/.rvm/Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/rack-1.4.5/lib/rack/server.rb:323:in `delete': No such file or directory - /Volumes/Storage/Projects/cucumber-capybara-saucelabs/tmp/pids/server.pid (Errno::ENOENT)
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/rack-1.4.5/lib/rack/server.rb:323:in `block in write_pid'
/Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `new'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:85:in `block in create_listeners'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:82:in `each'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/utils.rb:82:in `create_listeners'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/server.rb:82:in `listen'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/server.rb:70:in `initialize'
    from /Users/foo/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/httpserver.rb:45:in `initialize'
    from /Users/foo[2013-05-22 14:40:12] INFO  WEBrick 1.3.1
sa/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/rack-1.4.5/lib/rack/handler/webrick.rb:10:in `new'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/rack-1.4.5/lib/rack/handler/webrick.rb:10:in `run'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/rack-1.4.5/lib/rack/server.rb:268:in `start'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/railties-3.2.13/lib/rails/commands/server.rb:70:in `start'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/railties-3.2.13/lib/rails/commands.rb:55:in `block in <top (required)>'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/railties-3.2.13/lib/rails/commands.rb:50:in `tap'
    from /Users/foo/.rvm/gems/ruby-1.9.3-p392@rails-3/gems/railties-3.2.13/lib/rails/commands.rb:50:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Is there a way to avoid this?

TheFooProgrammer
  • 2,439
  • 5
  • 28
  • 43
  • I don't know the parallel_tests gem, but it's obvious if you are trying to start more than one capybara server on the same port, that the `TCPServer Error: Address already in use - bind(2)` error is thrown. You have to make sure in some way that every test thread is getting it's own and free port – 23tux May 22 '13 at 05:15
  • I know, but I can not find anything mentioned in parallel_tests scarce docs about how we can assign a distinct port to each testing process. I actually followed [this](https://saucelabs.com/ruby) with some minor changes, but the instructions look to be erroneous. – TheFooProgrammer May 22 '13 at 05:18
  • Have a look here (it's a 2010 answer, but maybe it helps) http://www.jeremydurham.com/posts/166-capybara-parallel_tests and you can configure the port from capybara using this http://stackoverflow.com/questions/6791601/cucumber-capybara-how-to-get-the-host-and-port-of-the-current-execution – 23tux May 22 '13 at 05:24

1 Answers1

4

As explained in the wiki, you need to do:

Capybara.server_port = 9887 + ENV['TEST_ENV_NUMBER'].to_i
Dan Kohn
  • 33,811
  • 9
  • 84
  • 100