@@ -6,4 +6,55 @@ class PollingWatcherTest < Spring::Test::WatcherTest
6
6
def watcher_class
7
7
Spring ::Watcher ::Polling
8
8
end
9
+
10
+ test "skips staleness checks if already stale" do
11
+ class << watcher
12
+ attr_reader :checked_when_stale_count
13
+ attr_reader :checked_when_not_stale_count
14
+
15
+ def check_stale
16
+ @checked_when_stale_count = 0 unless defined? @checked_when_stale_count
17
+ @checked_when_not_stale_count = 0 unless defined? @checked_when_not_stale_count
18
+
19
+ if stale?
20
+ @checked_when_stale_count += 1
21
+ else
22
+ @checked_when_not_stale_count += 1
23
+ end
24
+
25
+ super
26
+ end
27
+
28
+ # Wait for the poller thread to finish.
29
+ def join
30
+ @poller . join if @poller
31
+ end
32
+ end
33
+
34
+ # Track when we're marked as stale.
35
+ on_stale_count = 0
36
+ watcher . on_stale { on_stale_count += 1 }
37
+
38
+ # Add a file to watch and start polling.
39
+ file = "#{ @dir } /omg"
40
+ touch file , Time . now - 2 . seconds
41
+ watcher . add file
42
+ watcher . start
43
+ assert watcher . running?
44
+
45
+ # First touch bumps mtime and marks as stale.
46
+ touch file , Time . now - 1 . second
47
+ Timeout . timeout ( 1 ) { watcher . join }
48
+ assert !watcher . running?
49
+ assert_equal 0 , watcher . checked_when_stale_count
50
+ assert_equal 1 , watcher . checked_when_not_stale_count
51
+ assert_equal 1 , on_stale_count
52
+
53
+ # Second touch skips mtime check because it's already stale.
54
+ touch file , Time . now
55
+ sleep 1
56
+ assert_equal 0 , watcher . checked_when_stale_count
57
+ assert_equal 1 , watcher . checked_when_not_stale_count
58
+ assert_equal 1 , on_stale_count
59
+ end
9
60
end
0 commit comments