From e984fd43d56797874c532b7d45af8240decfd5ba Mon Sep 17 00:00:00 2001 From: wycats Date: Sun, 20 Feb 2011 01:37:37 -0800 Subject: Allow tests to proceed as soon as the payload changes, instead of always having to wait for a timeout --- activesupport/test/file_watcher_test.rb | 52 +++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 15 deletions(-) (limited to 'activesupport/test') diff --git a/activesupport/test/file_watcher_test.rb b/activesupport/test/file_watcher_test.rb index 1394c66d9f..027453f86a 100644 --- a/activesupport/test/file_watcher_test.rb +++ b/activesupport/test/file_watcher_test.rb @@ -1,6 +1,7 @@ require 'abstract_unit' require 'fssm' require "fileutils" +require "timeout" class FileWatcherTest < ActiveSupport::TestCase @@ -128,6 +129,9 @@ class FSSMFileWatcherTest < ActiveSupport::TestCase def setup Thread.abort_on_exception = true + @payload = [] + @triggered = false + @watcher = ActiveSupport::FileWatcher.new @path = path = File.expand_path("../tmp", __FILE__) @@ -140,13 +144,12 @@ class FSSMFileWatcherTest < ActiveSupport::TestCase @backend = FSSMBackend.new(path, @watcher) - @payload = [] - @watcher.watch %r{^app/assets/.*\.scss$} do |pay| pay.each do |status, files| files.sort! end @payload << pay + trigger end end @@ -156,22 +159,43 @@ class FSSMFileWatcherTest < ActiveSupport::TestCase end def create(path, past = false) - path = File.join(@path, path) - FileUtils.mkdir_p(File.dirname(path)) + wait(past) do + path = File.join(@path, path) + FileUtils.mkdir_p(File.dirname(path)) - FileUtils.touch(path) - File.utime(Time.now - 100, Time.now - 100, path) if past - sleep 0.1 unless past + FileUtils.touch(path) + File.utime(Time.now - 100, Time.now - 100, path) if past + end end def change(path) - FileUtils.touch(File.join(@path, path)) - sleep 0.1 + wait do + FileUtils.touch(File.join(@path, path)) + end end def delete(path) - FileUtils.rm(File.join(@path, path)) - sleep 0.1 + wait do + FileUtils.rm(File.join(@path, path)) + end + end + + def wait(past = false) + yield + return if past + + begin + Timeout.timeout(1) do + sleep 0.05 until @triggered + end + rescue Timeout::Error + end + + @triggered = false + end + + def trigger + @triggered = true end def test_one_change @@ -199,14 +223,11 @@ class FSSMFileWatcherTest < ActiveSupport::TestCase assert_equal([{:created => ["app/assets/new.scss"]}, {:changed => ["app/assets/print.scss"]}, {:deleted => ["app/assets/videos.scss"]}], @payload) end - def test_delete - - end - def test_more_blocks payload = [] @watcher.watch %r{^config/routes\.rb$} do |pay| payload << pay + trigger end create "config/routes.rb" @@ -218,6 +239,7 @@ class FSSMFileWatcherTest < ActiveSupport::TestCase payload = [] @watcher.watch %r{^app/assets/main\.scss$} do |pay| payload << pay + trigger end change "app/assets/main.scss" -- cgit v1.2.3