@Override
  protected void setUp() throws Exception {
    LOG.debug("================== setting up " + getName() + " ==================");

    super.setUp();

    myFileSystem = LocalFileSystem.getInstance();
    assertNotNull(myFileSystem);

    myWatcher = ((LocalFileSystemImpl) myFileSystem).getFileWatcher();
    assertNotNull(myWatcher);
    assertFalse(myWatcher.isOperational());
    myWatcher.startup(myNotifier);
    assertTrue(myWatcher.isOperational());

    myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, getProject());
    myTimeout = NATIVE_PROCESS_DELAY;

    myConnection = ApplicationManager.getApplication().getMessageBus().connect();
    myConnection.subscribe(
        VirtualFileManager.VFS_CHANGES,
        new BulkFileListener.Adapter() {
          @Override
          public void after(@NotNull List<? extends VFileEvent> events) {
            synchronized (myEvents) {
              myEvents.addAll(events);
            }
          }
        });

    ((LocalFileSystemImpl) myFileSystem).cleanupForNextTest();

    LOG = FileWatcher.getLog();
    LOG.debug("================== setting up " + getName() + " ==================");
  }
  @Override
  protected void setUp() throws Exception {
    super.setUp();

    MessageBusConnection connection =
        ApplicationManager.getApplication().getMessageBus().connect(myTestRootDisposable);
    connection.subscribe(
        VirtualFileManager.VFS_CHANGES,
        new BulkFileListener() {
          @Override
          public void before(@NotNull List<? extends VFileEvent> events) {
            checkFiles(events, true);
          }

          @Override
          public void after(@NotNull List<? extends VFileEvent> events) {
            checkFiles(events, false);
          }

          private void checkFiles(List<? extends VFileEvent> events, boolean before) {
            for (VFileEvent event : events) {
              VirtualFile file = event.getFile();
              if (file != null) {
                boolean shouldBeInvalid =
                    event instanceof VFileCreateEvent
                            && before
                            && !((VFileCreateEvent) event).isReCreation()
                        || event instanceof VFileDeleteEvent && !before;
                assertEquals(event.toString(), !shouldBeInvalid, file.isValid());
              }
            }
          }
        });
  }
  @Override
  protected void tearDown() throws Exception {
    LOG.debug("================== tearing down " + getName() + " ==================");

    try {
      myConnection.disconnect();
      myWatcher.shutdown();
      assertFalse(myWatcher.isOperational());
    } finally {
      myFileSystem = null;
      myWatcher = null;
      super.tearDown();
    }

    LOG.debug("================== tearing down " + getName() + " ==================");
  }