old_contents: import os
  
  from chalice.cli.filewatch import stat
  
  
  class FakeOSUtils(object):
      def __init__(self):
          self.initial_scan = True
  
      def walk(self, rootdir):
          yield 'rootdir', [], ['bad-file', 'baz']
          if self.initial_scan:
              self.initial_scan = False
  
      def joinpath(self, *parts):
          return os.path.join(*parts)
  
      def mtime(self, path):
          if self.initial_scan:
              return 1
          if path.endswith('bad-file'):
              raise OSError("Bad file")
          return 2
  
  
  def test_can_ignore_stat_errors():
      calls = []
  
      def callback(*args, **kwargs):
          calls.append((args, kwargs))
  
      watcher = stat.StatFileWatcher(FakeOSUtils())
      watcher.watch_for_file_changes('rootdir', callback)
      assert len(calls) == 1
  
new_contents: import os
  import time
  
  from chalice.cli.filewatch import stat
  
  
  class FakeOSUtils(object):
      def __init__(self):
          self.initial_scan = True
  
      def walk(self, rootdir):
          yield 'rootdir', [], ['bad-file', 'baz']
          if self.initial_scan:
              self.initial_scan = False
  
      def joinpath(self, *parts):
          return os.path.join(*parts)
  
      def mtime(self, path):
          if self.initial_scan:
              return 1
          if path.endswith('bad-file'):
              raise OSError("Bad file")
          return 2
  
  
  def test_can_ignore_stat_errors():
      calls = []
  
      def callback(*args, **kwargs):
          calls.append((args, kwargs))
  
      watcher = stat.StatFileWatcher(FakeOSUtils())
      watcher.watch_for_file_changes('rootdir', callback)
      for _ in range(10):
          if len(calls) == 1:
              break
          time.sleep(0.2)
      else:
          raise AssertionError("Expected callback to be invoked but was not.")
  
subject: Add polling loop to allow time for callback to be invoked