File: utility_classes.rb

package info (click to toggle)
ruby-directory-watcher 1.5.1-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 224 kB
  • ctags: 224
  • sloc: ruby: 1,411; makefile: 5
file content (117 lines) | stat: -rw-r--r-- 2,859 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
module DirectoryWatcherSpecs
  # EventObserver just hangs out and collects all the events that are sent to it
  # It is used by the Scenario
  class EventObserver
    attr_reader :events
    attr_reader :logger

    def initialize( logger )
      @logger = logger
      @events = []
    end

    def update( *event_list )
      logger.debug "got event #{event_list}"
      @events.concat event_list
    end
  end

  # Scenario is a utility to wrap up how to run a directory watcher scenario.
  # You would use it as such:
  #
  #   dws = Scenario.new( watcher )
  #   dws.do_after_events(2) do |scenario|
  #     # do something
  #   end.until_events(1)
  #
  # This will create a scenario, run the block after 2 events have been
  # collected, and then return again after 1 more event has been collected.
  #
  # You can then check the events with the custom matcher
  #
  #  dws.events.should be_events_like( ... )
  #
  class Scenario
    include DirectoryWatcher::Logable

    attr_reader :watcher
    def initialize( watcher )
      @watcher = watcher
      @config = watcher.config
      @observer = EventObserver.new( logger )
      @watcher.add_observer( @observer )
      reset
    end

    def run_and_wait_for_event_count(count, &block )
      before_count = @observer.events.size
      @watcher.resume
      logger.debug "Before yielding event_count = #{before_count}"
      logger.debug @observer.events.inspect
      yield self
      wait_for_events( before_count + count )
      return self
    end

    def run_and_wait_for_scan_count(count, &block)
      @watcher.resume
      yield self
      wait_for_scan_count( count )
      return self
    end

    def events
      @observer.events
    end

    def stop
      @watcher.stop
    end

    def pause
      @watcher.pause
    end

    def resume
      @watcher.resume
    end

    def reset
      @observer.events.clear
      @watcher.start
      @watcher.pause
      logger.debug "Scenario#reset with pause"
    end

    def run_once_and_wait_for_event_count( count, &block )
      @watcher.resume
      @watcher.stop
      before_count = @observer.events.size
      yield self
      @watcher.run_once
      wait_for_events( before_count + count )
      return self
    end

    private

    def wait_for_events( limit )
      #Thread.pass until @observer.events.size >= limit
      until @observer.events.size >= limit do
        Thread.pass
        sleep(0.01)
        logger.debug "Waiting for #{limit} events, I have #{@observer.events.size}"
      end
    end

    def wait_for_scan_count( limit )
      @watcher.maximum_iterations = limit
      #Thread.pass until @watcher.finished_scans?
      until @watcher.finished_scans?
        sleep(0.01)
        logger.debug "Waiting for scan count #{limit} got #{@watcher.scans} #{@watcher.maximum_iterations}"
      end
    end

  end
end