teampoltergeist / poltergeist

A PhantomJS driver for Capybara
MIT License
2.5k stars 414 forks source link

Crashes with TTF fonts on OS X #44

Closed javierav closed 11 years ago

javierav commented 12 years ago

https://gist.github.com/2405155

I have a simple feature (see Gist) and when I run the test I get the error randomly (some times in one Scenario and other in another) . In the Gist example, if I run the failing test again, the tes pass correctly.

uname -a => Linux jarandapc 3.0.6-gentoo #2 SMP PREEMPT Wed Nov 9 21:42:08 CET 2011 x86_64 Intel(R) Pentium(R) CPU G860 @ 3.00GHz GenuineIntel GNU/Linux

Any idea?

jonleighton commented 12 years ago

Hmm, it sounds like phantomjs is segfaulting. Did you compile phantomjs yourself or install the binary? If you installed the binary, try compiling it yourself?

Ultimately probably there are going to be issues like this from time to time, so I should add some easy way to run phantomjs under gdb so that people can obtain stack traces and we can find/fix the issues.

sarmiena commented 12 years ago

I'm getting this error on a regular basis:

     Capybara::Poltergeist::DeadClient:
       The PhantomJS client died while processing {"name":"visit","args":["http://test.host:1337/plans"]}

capybara 1.1.2 poltergeist 0.6.0 phantomjs 1.5.0 (binary -- downloaded from site and all files inserted into rails application /spec/support/) OSX Lion

# spec_helper.rb
  Capybara.register_driver :poltergeist do |app|
    if RUBY_PLATFORM.downcase.include?("darwin")
      Capybara::Poltergeist::Driver.new(app, phantomjs: "#{Rails::root}/spec/support/darwin/phantomjs/bin/phantomjs")
    elsif RUBY_PLATFORM.downcase.include?("linux")
      Capybara::Poltergeist::Driver.new(app, phantomjs: "#{Rails::root}/spec/support/linux/phantomjs/bin/phantomjs")
    end
  end

Console errors: 4/20/12 11:32:42.672 PM ReportCrash: Failed to create CSSymbolicatorRef for phantomjs[18040] 4/20/12 11:32:42.780 PM ReportCrash: Failed to create dSYM-less CSSymbolicatorRef for phantomjs[18040]

jonleighton commented 12 years ago

@sarmiena does your crash happen every time on the same tests, or does it sometimes happen and sometimes not? does it happen on all tests or just some of them?

sarmiena commented 12 years ago

It happens on every other test (first one passes).

DouweM commented 12 years ago

I'm having the exact same problem:

Failure/Error: click_button "Log in"
Capybara::Poltergeist::DeadClient:
  The PhantomJS client died while processing {"name":"click","args":[4,2]}

with this extremely exciting code:

visit new_user_session_path
fill_in "Email",    with: current_user.email
fill_in "Password", with: current_user.password
click_button "Log in"

As with @sarmiena, it happens with every other test, so I'm seeing ".F.F", after which it halts until I ^C.

sarmiena commented 12 years ago

Any epiphanies?

DouweM commented 12 years ago

None on my part, I've started using capybara-webkit again.

sarmiena commented 12 years ago

same here

jonleighton commented 12 years ago

Hi guys,

Sorry you've had trouble. I've posted a message on the PhantomJS list here: http://groups.google.com/group/phantomjs/browse_thread/thread/2365cfca349018f8

Let's see if anyone has ideas on there - I don't know much about OS X issues but others on that list do.

Jon

sarmiena commented 12 years ago

cool. thanks

jonleighton commented 12 years ago

Hi guys,

Can those of you who are experiencing crashes try running ulimit -c unlimited before running your tests? This will allow your OS to generate a core file when it crashes. Which you can then send to me. On OS X the core file will be in /cores. On Linux it'll be in the current working directory.

Thanks

Update: please don't do this on OS X. I won't be able to analyse it. The next version of PhantomJS will include crash reporting capability which will help.

senny commented 12 years ago

I switchted to poltergeist some time ago and everything runs fine. This morning I did some gem upgrades and I noticed features tagged running with poltergeist started failing. I don't have much time to debug the issue but I would like to share the information I've got. I tracked the DeadClinet error down to the following commit:

diff --git a/Gemfile b/Gemfile
index 42b5a60..6895444 100644
--- a/Gemfile
+++ b/Gemfile
@@ -69,7 +69,7 @@ end
 # Gems used only for assets and not required
 # in production environments by default.
 group :assets do
-  gem 'twitter-bootstrap-rails', :git => 'https://github.com/seyhunak/twitter-bootstrap-rails.git' # bootst
+  gem 'twitter-bootstrap-rails', '~> 2.1.0'
   gem 'therubyracer'
   gem 'uglifier', '>= 1.0.3'
 end
diff --git a/Gemfile.lock b/Gemfile.lock
index e609e85..9a0ee2c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -12,16 +12,6 @@ GIT
       capybara

 GIT
-  remote: https://github.com/seyhunak/twitter-bootstrap-rails.git
-  revision: c646c2d31174f4d3b3bd01c715ea4a3e5587c85d
-  specs:
-    twitter-bootstrap-rails (2.0.8.1)
-      actionpack (>= 3.1)
-      less-rails (~> 2.2.2)
-      railties (>= 3.1)
-      therubyracer (~> 0.10.1)
-
-GIT
   remote: ssh://code@git.garaio.com:29418/ror/garaio/garaio_view_helpers
   revision: 75327969674d6a6d7ae556b6b4b61a3eacea1fdb
   branch: master
@@ -307,6 +297,11 @@ GEM
       polyglot
       polyglot (>= 0.3.1)
     ttfunk (1.0.3)
+    twitter-bootstrap-rails (2.1.0)
+      actionpack (>= 3.1)
+      less-rails (~> 2.2.2)
+      railties (>= 3.1)
+      therubyracer (~> 0.10.1)
     tzinfo (0.3.33)
     uglifier (1.2.3)
       execjs (>= 0.3.0)
@@ -352,7 +347,7 @@ DEPENDENCIES
   therubyracer
   thin
   timecop
-  twitter-bootstrap-rails!
+  twitter-bootstrap-rails (~> 2.1.0)
   uglifier (>= 1.0.3)
   virtus
   will_paginate

red works and green breaks features running with poltergeist randomly. I receive errors like:

The PhantomJS client died while processing {"name":"current_url","args":[]} (Capybara::Poltergeist::DeadClient)

I hope this helps somewhat. Feel free to ask if you need additional informations.

walski commented 12 years ago

Running into the same problem over here but the only thing I share with the above mentioned gems is actionpack :/

jonleighton commented 12 years ago

Just to let everyone in this ticket know, I have been working to add a crash reporter (google breakpad) to PhantomJS. This means that when the next release comes up we will have a good way of getting stack traces from crashes which should help a lot.

senny commented 12 years ago

@jonleighton thanks for the update and your efforts. I hope we get more insight to resolve these random crashes.

walski commented 12 years ago

:thumbsup:

I've managed to narrow the high level cause down a little bit in my case: I'm accessing a website with an iframe and the error happens when finally the iframe posts a message to the top window that leads to a change of the location of the top window. Interesting enough that does NOT happen when I try to "redirect" the top window to a not existing page but does happen when the page is delivered. It's a really simple page with just one h1 or whatever. Aaaalso I do see the crash when I return a 404 from my application server and the 404 is not delivered by the webserver itself. I've to investigate on the last finding a bit more, maybe there is some middleware doing strange things or whatever. Meh meh meh.

Skulli commented 12 years ago

Just noticed the same issue on my project. It happens after i upgrade the above mentioned gem twitter-bootstrap-rails from 2.0.8 to 2.1.0 and 2.0.9. A Downgrade helped. Though the problem only occurred on my mac with phantomjs installed via homebrew. My linux machine doesnt have that problem (binary install).

DouweM commented 12 years ago

Upgrading from 2.0.8 tot 2.0.9 causes the problem you say? In that case the culprit in somewhere in this string of commits. Could you try pointing your Gemfile to each of those commits, to see at what point exactly the problem appears?

You can specify a commit to point to like this:

gem 'twitter-bootstrap-rails', :github => "seyhunak/twitter-bootstrap-rails", :ref => "a1b2c3"
Skulli commented 12 years ago

Okay, tried it out and it starts happening with commit "fc40fde" https://github.com/seyhunak/twitter-bootstrap-rails/commit/fc40fde93a3202899c66043406c5e3d8754cc8a1

DouweM commented 12 years ago

This is so weird, because there's literally nothing in there that I could imagine having any effect on the way Poltergeist behaves; it's just a bunch of edited CSS files. Granted, I don't know anything about the internals of Poltergeist, so @jonleighton should really take a look at this, but I'm stumped.

jonleighton commented 12 years ago

It's not really a poltergeist bug so much as a phantomjs/qt/webkit bug. Presumably that font is causing phantomjs to crash for some reason. The next version of phantomjs will be released this week - if somebody can produce a minimal test case for this crash that would be helpful and I will try to see if there is a fix possible in phantomjs.

jonleighton commented 12 years ago

Actually, please ignore the above, as I see that you said it only happens on a Mac. I don't have easy access to a Mac so I won't be able to debug the crash in this short time frame.

However, my main priority at the moment is adding proper crash reporting to PhantomJS to help with these situations. Linux support is already done and I hope/intend to work on OS X support tomorrow in time for the 1.6.0 release. So it should get easier after that.

mattgillooly commented 12 years ago

I encountered this error as well, and I was also able to resolve it by locking twitter-bootstrap-rails to version 2.0.8. Thanks @senny and @Skulli

jonleighton commented 12 years ago

Can someone try out the master branching with PhantomJS 1.6 and let me know if you still have the problem with twitter bootstrap? Thanks

Skulli commented 12 years ago

still crashing with the static 1.6 on mac os installed via brew. Will upload the dmp file later.

bcardarella commented 12 years ago

I had this issue the other day and was able to resolve it that one time by allowing ActiveRecord to work in multiple threads:

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end

RSpec.configure do |config|
  config.before(:suite) do
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
  end
end

But now I am running into this issue again and am not able to diagnose it properly. I do not believe this is poltergeist specific as capybara-webkit just hangs with no timeout at all.

bcardarella commented 12 years ago

It seems that TTF fonts are causing an issue here. The file cubano-regular-webfont.ttf, if we use other font formats we are OK.

dynjo commented 12 years ago

We are getting this error too, using Font Awesome via https://github.com/wbzyl/less-rails-fontawesome

Skulli commented 12 years ago

here is the crash dmp

http://www.file-upload.net/download-4538237/E98C5150-FD3F-46B7-A2BF-8B16FD55DADF.dmp.html (click "Datei herunterladen")

harrikauhanen commented 12 years ago

Our tests also started passing (on Mac) when we disabled Font Awesome (https://github.com/littlebtc/font-awesome-sass-rails). Looks like a Mac+Font issue as it does not occur on Linux even with these font icons enabled.

almog commented 12 years ago

Just like @bcardarella I just had this issue with ttf font files (svg and otf didn't cause any problem).

bcardarella commented 12 years ago

It is strange because as long as the file is in the asset pipeline it errors out, even if the CSS does not reference the TTF file in anyway

jonleighton commented 12 years ago

Here is a (not very useful) stack trace generated from that dump: https://gist.github.com/3257935

jonleighton commented 12 years ago

Looks the same as https://code.google.com/p/phantomjs/issues/detail?id=690

ShogunPanda commented 12 years ago

In my case it happens only after the first example, then phantom get reinitialized and the next example goes through. To be more understandable, the odds test go through, the evens fail.

namxam commented 12 years ago

@ShogunPanda The reason why every second test works is due to the fact that poltergeist starts a new phantomjs browser after one dies.

mjtko commented 11 years ago

I have created a monkey patch to prevent PhantomJS from crashing by denying access to TTF files in the assets pipeline when doing Rails integration tests.

It's unpleasant. It works until we get a fix to PhantomJS/Webkit. YMMV.

I needed this, as I both need the font-awesome-sass-rails gem in test and I use @font-face declarations within the application itself.

"Enjoy".

https://gist.github.com/3946516

goosetav commented 11 years ago

instead of monkey patching to suppress TTF's from being served, you can use Rack::SimpleEndpoint from the rack-contrib gem to 403 any requests ending in .ttf in your test environment

https://gist.github.com/3996516

samgranieri commented 11 years ago

@goosetav your hack worked. unfuckingbelievable.

bcardarella commented 11 years ago

Very nice! Should this be pulled into Poltergeist or are we still treating this as a PhantomJS bug and waiting for a fix?

mjtko commented 11 years ago

Don't think it should be pulled in as it works fine under Linux, just not under OSX. TBH, this is very much a Webkit/PhantomJS bug anyway. Might be worth adding to a FAQ though.

mjtko commented 11 years ago

@goosetav Thanks for pointing out rack-contrib and that solution - I like that solution much better than monkey patching asset pipeline internals!

mjtko commented 11 years ago

I've reworked @goosetav's approach a little -- I prefer 'complex' middleware configurations like this as an explicit initalizer rather than code inside an environment configuration file. I've also added explicit detection of PhantomJS on OS X, passing the request on to the rest of the middleware stack otherwise. Thanks again for the inspiration @goosetav. :+1:

https://gist.github.com/4003597

goosetav commented 11 years ago

@mjtko thanks!

I'm not sure if this is fully PhantomJS's fault. I created a simple app to exploit the bug. I can reproduce it when using poltergeist via capybara+rspec but I cannot reproduce it using PhantomJS directly.

Of course, my test calls to PhantomJS are not 100% analogous to what's occurring when poltergeist / capybara is being used.

The bug is reproducible when visit is called a second time AND when that page contains a TrueType Font declaration. PhantomJS itself has no issue rendering the TrueType font - you can see this by hitting the page directly using the script in the root of the app and looking at the generated screenshot.

Looking over the debug output from poltergeist, I notice a reset() method is getting called but I don't see that in the PhantomJS 1.7 API. Should close() be called instead? Or is it possible the PhantomJS page object is getting used twice by mistake?

@jonleighton - any insights here? I know you don't have easy access to OSX -- I can try running some tests for you so we can properly report bugs upstream if necessary.

the repo is here: https://github.com/goosetav/true_type_bug

output from rspec (with poltergeist debug output) is here: https://gist.github.com/4004813

jonleighton commented 11 years ago

Perhaps someone can submit a PR to add an explanation of this to the troubleshooting section of the README?

I am hoping that the WebKIt updates in Qt 4.8.3 might fix this problem, but we'll have to wait and see when PhantomJS upgrades to that (it's currently on 4.8.2).

mjtko commented 11 years ago

Let me know if you think they need to be clearer and I'll modify and squash.

tsgautier commented 11 years ago

I seem to be having a very similar issue occurring on my centos 6 machine that is acting as my build server (running jenkins). Running visit just once from cucumber works, but running twice always fails with the exact same error listed here.

If anyone would like my puppet recipe that gets my centos machine in shape maybe they could load it up on a Vagrant box and try it out?

My app is using bootstrap, but I looked through the css and didn't see any reference to a TT font.

Strangely enough, it works fine on OS X for me.

I'm installing PhantomJS 1.7.0 in both cases.

tsgautier commented 11 years ago

Some more detail - as someone previously said, this really feels like a poltergeist issue not a PhantomJS issue.

This does not work:

Scenario: Viewing products

Given I am on the products page
Then I should see products
And one product is set as default

Scenario: Click on a product

Given I am on the products page
When I click on a product
Then I should see a list of rate plans

However, this does work:

Scenario: Viewing products

Given I am on the products page
Then I should see products
And one product is set as default

Given I am on the products page
When I click on a product
Then I should see a list of rate plans

Note that it is the "Given I am on the products page" step which fails when two scenarios are defined, this step is pretty basic, it's implemented as:

Given /^I am on the products page$/ do
    visit('/products')
end
jonleighton commented 11 years ago

@tsgautier sounds like a different issue if there is no TTF font. do you have a crash dump? if so please open a separate issue and provide the dump.

tgaff commented 11 years ago

@tsgautier I think I have the same CentOS issue. The font disabling solution in goosetav's gift does not resolve it. I filed it separately as #200. https://github.com/jonleighton/poltergeist/issues/200