Search code examples
ruby-on-railsrspeccucumberautotest

How do I troubleshoot autotest infinite loop problems?


I'm using cucumber, rails3, rspec2 and autotest. I'm trying to figure out why my features are infinitely looping. I suspect it some file being changed during the tests but I'm not sure which one. I've added some exceptions to my .autotest with no dice.

Are there any steps I can take to troubleshoot this problem?

It'd be cool if I could see what files are triggering a rerun or, at run time, what files are being watched/not watched.

here's my .autotest contents

require 'autotest/growl'

Autotest::Growl::clear_terminal = false

# Skip some paths
Autotest.add_hook :initialize do |autotest|
    %w{.git .DS_store db log tmp rerun.txt}.each { |e| autotest.add_exception(e) }
end

Solution

  • Ok, so I figured it out. I dove into autotest's source to get a better understanding of what was going on. It creates a Regexp.union out of all the exceptions and ignores files who's relative paths match the complied expression.

    To better understand the bug I added everything in my project's directory to .autotest except ./app, ./lib, ./public, ./script, ./spec and ./features. Something like this:

    # .autotest - to troubleshoot
    Autotest.add_hook :initialize do |at|
      at.add_exception(%r{^\./\.git})
      ...
      at.add_exception(%r{^\./db})
      ...
      at.add_exception(%r{^\./rerun.txt})
      ...
    end
    

    When I did this I didn't get an infinite loop. After that I just began to comment out each exception. Turns out, the only file I had to manually ignore was Gemfile.lock. For some reason this is either being changed or confusing autotest to the point where it makes cucumber loop.

    Thus, this .autotest solved the problem:

    # .autotest - to fix
    Autotest.add_hook :initialize do |at|
      # Gemfile.lock is causing cucumber to run infinitely. Don't watch it.
      at.add_exception(%r{^\./Gemfile.lock})
    end
    

    I'm going to report on the cucumber list to let them know they should add that to the built in autotest exceptions.