Permalink
Browse files

Allow tests to proceed as soon as the payload changes, instead of alw…

…ays having to wait for a timeout
  • Loading branch information...
wycats committed Feb 20, 2011
1 parent 89e6b19 commit e984fd43d56797874c532b7d45af8240decfd5ba
Showing with 37 additions and 15 deletions.
  1. +37 −15 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 @@ def stop
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 @@ def setup
@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 @@ def teardown
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 @@ def test_multiple_state_changes
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 @@ def test_overlapping_watchers
payload = []
@watcher.watch %r{^app/assets/main\.scss$} do |pay|
payload << pay
+ trigger
end
change "app/assets/main.scss"

0 comments on commit e984fd4

Please sign in to comment.