Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Upgrade bazlets to latest stable-2.14

Change-Id: I70238ffa74951463a4b99f6806858693125afd46
diff --git a/WORKSPACE b/WORKSPACE
index eac155f..ffecb2e 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "b07aa8462f2618a83f3b52d6150faa831b24d3e3",
+    commit = "ec949feac1b9dae6cc2c8c25d254f34924c54296",
     #local_path = "/home/<user>/projects/bazlets",
 )
 
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index 7e04095..ef666ef 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -3,8 +3,8 @@
 def external_plugin_deps():
     maven_jar(
         name = "mockito",
-        artifact = "org.mockito:mockito-core:2.27.0",
-        sha1 = "835fc3283b481f4758b8ef464cd560c649c08b00",
+        artifact = "org.mockito:mockito-core:2.28.2",
+        sha1 = "91110215a8cb9b77a46e045ee758f77d79167cc0",
         deps = [
             "@byte-buddy//jar",
             "@byte-buddy-agent//jar",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java
index 47ef932..5543961 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditions.java
@@ -19,6 +19,7 @@
 import static java.util.stream.Collectors.joining;
 
 import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.api.access.PluginPermission;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -26,10 +27,13 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.CapabilityControl;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.MergeOpRepoManager;
+import com.google.gerrit.server.git.SubmoduleException;
 import com.google.gerrit.server.git.SubmoduleOp;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.ListChildProjects;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.server.query.change.ChangeData;
@@ -59,6 +63,7 @@
   private final SubmoduleOp.Factory subOpFactory;
   private final Provider<CurrentUser> userProvider;
   private final ProtectedProjects protectedProjects;
+  private final PermissionBackend permissionBackend;
 
   @Inject
   public DeletePreconditions(
@@ -70,7 +75,8 @@
       GitRepositoryManager repoManager,
       SubmoduleOp.Factory subOpFactory,
       Provider<CurrentUser> userProvider,
-      ProtectedProjects protectedProjects) {
+      ProtectedProjects protectedProjects,
+      PermissionBackend permissionBackend) {
     this.config = config;
     this.listChildProjectsProvider = listChildProjectsProvider;
     this.mergeOpProvider = mergeOpProvider;
@@ -80,6 +86,7 @@
     this.subOpFactory = subOpFactory;
     this.userProvider = userProvider;
     this.protectedProjects = protectedProjects;
+    this.permissionBackend = permissionBackend;
   }
 
   void assertDeletePermission(ProjectResource rsrc) throws AuthException {
@@ -88,11 +95,12 @@
     }
   }
 
-  boolean canDelete(ProjectResource rsrc) {
-    CapabilityControl ctl = userProvider.get().getCapabilities();
-    return ctl.canAdministrateServer()
-        || ctl.canPerform(pluginName + "-" + DELETE_PROJECT)
-        || (ctl.canPerform(pluginName + "-" + DELETE_OWN_PROJECT) && rsrc.getControl().isOwner());
+  protected boolean canDelete(ProjectResource rsrc) {
+    PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider);
+    return userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER)
+        || userPermission.testOrFalse(new PluginPermission(pluginName, DELETE_PROJECT))
+        || (userPermission.testOrFalse(new PluginPermission(pluginName, DELETE_OWN_PROJECT))
+            && rsrc.getControl().isOwner());
   }
 
   void assertCanBeDeleted(ProjectResource rsrc, Input input) throws ResourceConflictException {
@@ -125,11 +133,16 @@
   }
 
   private void assertHasNoChildProjects(ProjectResource rsrc) throws CannotDeleteProjectException {
-    List<ProjectInfo> children = listChildProjectsProvider.get().apply(rsrc);
-    if (!children.isEmpty()) {
+    try {
+      List<ProjectInfo> children = listChildProjectsProvider.get().apply(rsrc);
+      if (!children.isEmpty()) {
+        throw new CannotDeleteProjectException(
+            "Cannot delete project because it has children: "
+                + children.stream().map(info -> info.name).collect(joining(",")));
+      }
+    } catch (PermissionBackendException e) {
       throw new CannotDeleteProjectException(
-          "Cannot delete project because it has children: "
-              + children.stream().map(info -> info.name).collect(joining(",")));
+          String.format("Unable to verify if '%s' has children projects.", rsrc.getName()));
     }
   }
 
@@ -150,7 +163,7 @@
     } catch (RepositoryNotFoundException e) {
       // we're trying to delete the repository,
       // so this exception should not stop us
-    } catch (IOException e) {
+    } catch (IOException | SubmoduleException e) {
       throw new CannotDeleteProjectException("Project is subscribed by other projects.");
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
index 397a65c..8b60ae3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
@@ -24,6 +24,7 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.git.MetaDataUpdate;
 import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.project.CreateProject;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectResource;
@@ -88,7 +89,8 @@
       } catch (BadRequestException
           | UnprocessableEntityException
           | ResourceNotFoundException
-          | ConfigInvalidException e) {
+          | ConfigInvalidException
+          | PermissionBackendException e) {
         throw new ResourceConflictException(
             String.format("Failed to create project %s", projectName));
       }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
index 420a6d5..e15f913 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.deleteproject.database;
 
 import static java.util.Collections.singleton;
+import static java.util.stream.Collectors.toList;
 
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.reviewdb.client.Account;
@@ -29,7 +30,11 @@
 import com.google.gerrit.server.account.WatchConfig.Accessor;
 import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
 import com.google.gerrit.server.change.AccountPatchReviewStore;
+import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
+import com.google.gerrit.server.notedb.NotesMigration;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gwtorm.jdbc.JdbcSchema;
@@ -57,6 +62,9 @@
   private final ChangeIndexer indexer;
   private final Provider<InternalAccountQuery> accountQueryProvider;
   private final Provider<Accessor> watchConfig;
+  private final ChangeNotes.Factory schemaFactoryNoteDb;
+  private final GitRepositoryManager repoManager;
+  private final NotesMigration migration;
 
   @Inject
   public DatabaseDeleteHandler(
@@ -64,6 +72,9 @@
       StarredChangesUtil starredChangesUtil,
       DynamicItem<AccountPatchReviewStore> accountPatchReviewStore,
       ChangeIndexer indexer,
+      ChangeNotes.Factory schemaFactoryNoteDb,
+      NotesMigration migration,
+      GitRepositoryManager repoManager,
       Provider<InternalAccountQuery> accountQueryProvider,
       Provider<WatchConfig.Accessor> watchConfig) {
     this.accountQueryProvider = accountQueryProvider;
@@ -72,29 +83,40 @@
     this.starredChangesUtil = starredChangesUtil;
     this.accountPatchReviewStore = accountPatchReviewStore;
     this.indexer = indexer;
+    this.schemaFactoryNoteDb = schemaFactoryNoteDb;
+    this.repoManager = repoManager;
+    this.migration = migration;
   }
 
-  public void delete(Project project) throws OrmException {
+  public void delete(Project project) throws OrmException, IOException {
     ReviewDb db = ReviewDbUtil.unwrapDb(dbProvider.get());
-    Connection conn = ((JdbcSchema) db).getConnection();
-    try {
-      conn.setAutoCommit(false);
+    if (isReviewDb()) {
+      Connection conn = ((JdbcSchema) db).getConnection();
       try {
-        atomicDelete(db, project, getChangesList(project, conn));
-        conn.commit();
-      } finally {
-        conn.setAutoCommit(true);
+        conn.setAutoCommit(false);
+        try {
+          atomicDelete(db, project, getChangesList(project, conn));
+          conn.commit();
+        } finally {
+          conn.setAutoCommit(true);
+        }
+      } catch (SQLException e) {
+        try {
+          conn.rollback();
+        } catch (SQLException ex) {
+          throw new OrmException(ex);
+        }
+        throw new OrmException(e);
       }
-    } catch (SQLException e) {
-      try {
-        conn.rollback();
-      } catch (SQLException ex) {
-        throw new OrmException(ex);
-      }
-      throw new OrmException(e);
+    } else {
+      atomicDelete(db, project, getChangesListFromNoteDb(project));
     }
   }
 
+  private boolean isReviewDb() {
+    return !migration.disableChangeReviewDb();
+  }
+
   private List<Change.Id> getChangesList(Project project, Connection conn) throws SQLException {
     try (PreparedStatement changesForProject =
         conn.prepareStatement("SELECT change_id FROM changes WHERE dest_project_name = ?")) {
@@ -111,6 +133,20 @@
     }
   }
 
+  private List<Change.Id> getChangesListFromNoteDb(Project project) throws IOException {
+    Project.NameKey projectKey = project.getNameKey();
+    List<Change.Id> changeIds =
+        schemaFactoryNoteDb
+            .scan(repoManager.openRepository(projectKey), dbProvider.get(), projectKey)
+            .map(ChangeNotesResult::id)
+            .collect(toList());
+    log.debug(
+        "Number of changes in noteDb related to project {} are {}",
+        projectKey.get(),
+        changeIds.size());
+    return changeIds;
+  }
+
   private void deleteChanges(ReviewDb db, Project.NameKey project, List<Change.Id> changeIds)
       throws OrmException {
 
@@ -120,18 +156,19 @@
       } catch (NoSuchChangeException e) {
         // we can ignore the exception during delete
       }
-      ResultSet<PatchSet> patchSets = db.patchSets().byChange(id);
-      if (patchSets != null) {
-        deleteFromPatchSets(db, patchSets);
+      if (isReviewDb()) {
+        ResultSet<PatchSet> patchSets = db.patchSets().byChange(id);
+        if (patchSets != null) {
+          deleteFromPatchSets(db, patchSets);
+        }
+
+        // In the future, use schemaVersion to decide what to delete.
+        db.patchComments().delete(db.patchComments().byChange(id));
+        db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
+
+        db.changeMessages().delete(db.changeMessages().byChange(id));
+        db.changes().deleteKeys(Collections.singleton(id));
       }
-
-      // In the future, use schemaVersion to decide what to delete.
-      db.patchComments().delete(db.patchComments().byChange(id));
-      db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
-
-      db.changeMessages().delete(db.changeMessages().byChange(id));
-      db.changes().deleteKeys(Collections.singleton(id));
-
       // Delete from the secondary index
       try {
         indexer.delete(id);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
index bd63e1f..ee44352 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
@@ -58,7 +58,7 @@
 
     /**
      * Newer trash folder name format. Besides the changes in TRASH_2, it uses a timestamp format
-     * (YYYYMMddHHmmss) instead of the epoch one for increased readability.
+     * (yyyyMMddHHmmss) instead of the epoch one for increased readability.
      */
     private static final Pattern TRASH_3 = Pattern.compile(".*\\.\\d{14}.%deleted%.git");
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
index 003f154..c73f450 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
@@ -43,7 +43,7 @@
 public class FilesystemDeleteHandler {
   private static final Logger log = LoggerFactory.getLogger(FilesystemDeleteHandler.class);
   private static final DateTimeFormatter FORMAT =
-      DateTimeFormatter.ofPattern("YYYYMMddHHmmss").withZone(ZoneId.of("UTC"));
+      DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("UTC"));
 
   private final GitRepositoryManager repoManager;
   private final DynamicSet<ProjectDeletedListener> deletedListeners;
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index b47afaa..a61ad8c 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -68,7 +68,7 @@
 To execute the tests run:
 
 ```
-  bazel test plugins/@PLUGIN@:delete_project_tests
+  bazel test plugins/@PLUGIN@:delete-project_tests
 ```
 
 or filtering using the comma separated tags:
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
index 125041a..b02763d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
@@ -23,15 +23,17 @@
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.api.access.PluginPermission;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.CapabilityControl;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.MergeOpRepoManager;
 import com.google.gerrit.server.git.SubmoduleOp;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.project.ListChildProjects;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
@@ -50,9 +52,6 @@
 @RunWith(MockitoJUnitRunner.class)
 public class DeletePreconditionsTest {
   private static final String PLUGIN_NAME = "delete-project";
-  private static final String DELETE_OWN_PROJECT_PERMISSION =
-      PLUGIN_NAME + "-" + DELETE_OWN_PROJECT;
-  private static final String DELETE_PROJECT_PERMISSION = PLUGIN_NAME + "-" + DELETE_PROJECT;
   private static final Project.NameKey PROJECT_NAMEKEY = new Project.NameKey("test-project");
 
   @Mock private Configuration config;
@@ -63,10 +62,9 @@
   @Mock private SubmoduleOp.Factory subOpFactory;
   @Mock private Provider<CurrentUser> userProvider;
   @Mock private ProtectedProjects protectedProjects;
-
   @Mock private ProjectControl control;
-  @Mock private CapabilityControl ctl;
-  @Mock private CurrentUser user;
+  @Mock private PermissionBackend permissionBackend;
+  @Mock private PermissionBackend.WithUser userPermission;
 
   @Rule public ExpectedException expectedException = ExpectedException.none();
 
@@ -86,44 +84,37 @@
             repoManager,
             subOpFactory,
             userProvider,
-            protectedProjects);
+            protectedProjects,
+            permissionBackend);
   }
 
   @Test
   public void testUserCanDeleteIfAdmin() {
-    when(ctl.canAdministrateServer()).thenReturn(true);
-    when(userProvider.get()).thenReturn(user);
-    when(user.getCapabilities()).thenReturn(ctl);
+    when(permissionBackend.user(userProvider)).thenReturn(userPermission);
+    when(userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER)).thenReturn(true);
     assertThat(preConditions.canDelete(rsrc)).isTrue();
   }
 
   @Test
   public void testUserCanDeleteIfHasDeletePermission() {
-    when(ctl.canAdministrateServer()).thenReturn(false);
-    when(ctl.canPerform(DELETE_PROJECT_PERMISSION)).thenReturn(true);
-    when(userProvider.get()).thenReturn(user);
-    when(user.getCapabilities()).thenReturn(ctl);
+    when(permissionBackend.user(userProvider)).thenReturn(userPermission);
+    when(userPermission.testOrFalse(new PluginPermission(PLUGIN_NAME, DELETE_PROJECT)))
+        .thenReturn(true);
     assertThat(preConditions.canDelete(rsrc)).isTrue();
   }
 
   @Test
   public void testUserCanDeleteIfIsOwnerAndHasDeleteOwnPermission() {
-    when(ctl.canAdministrateServer()).thenReturn(false);
-    when(ctl.canPerform(DELETE_PROJECT_PERMISSION)).thenReturn(false);
-    when(ctl.canPerform(DELETE_OWN_PROJECT_PERMISSION)).thenReturn(true);
-    when(userProvider.get()).thenReturn(user);
-    when(user.getCapabilities()).thenReturn(ctl);
+    when(permissionBackend.user(userProvider)).thenReturn(userPermission);
+    when(userPermission.testOrFalse(new PluginPermission(PLUGIN_NAME, DELETE_OWN_PROJECT)))
+        .thenReturn(true);
     when(control.isOwner()).thenReturn(true);
     assertThat(preConditions.canDelete(rsrc)).isTrue();
   }
 
   @Test
   public void testUserCannotDelete() throws Exception {
-    when(ctl.canAdministrateServer()).thenReturn(false);
-    when(ctl.canPerform(DELETE_PROJECT_PERMISSION)).thenReturn(false);
-    when(ctl.canPerform(DELETE_OWN_PROJECT_PERMISSION)).thenReturn(false);
-    when(userProvider.get()).thenReturn(user);
-    when(user.getCapabilities()).thenReturn(ctl);
+    when(permissionBackend.user(userProvider)).thenReturn(userPermission);
     expectedException.expect(AuthException.class);
     expectedException.expectMessage("not allowed to delete project");
     preConditions.assertDeletePermission(rsrc);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java
index af3ff0d..6629a14 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProjectIT.java
@@ -20,7 +20,6 @@
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 
 import com.google.common.base.Joiner;
-import com.google.common.base.MoreObjects;
 import com.google.gerrit.acceptance.GerritConfig;
 import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
 import com.google.gerrit.acceptance.RestResponse;
@@ -29,9 +28,11 @@
 import com.google.gerrit.acceptance.UseSsh;
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
 import com.googlesource.gerrit.plugins.deleteproject.DeleteProject.Input;
 import java.io.File;
 import java.io.IOException;
@@ -80,6 +81,7 @@
     RestResponse r = httpDeleteProjectHelper(true);
     r.assertNoContent();
     assertThat(projectDir.exists()).isFalse();
+    assertAllChangesDeletedInIndex();
   }
 
   @Test
@@ -94,10 +96,12 @@
   @Test
   @UseLocalDisk
   public void testHttpDeleteProjectWithWatches() throws Exception {
-    watch(project.get(), null);
+    watch(project.get());
     RestResponse r = httpDeleteProjectHelper(true);
     r.assertNoContent();
     assertThat(projectDir.exists()).isFalse();
+    assertAllChangesDeletedInIndex();
+    assertWatchRemoved();
   }
 
   @Test
@@ -140,6 +144,19 @@
     adminSshSession.exec(cmd);
     assertThat(adminSshSession.getError()).isNull();
     assertThat(projectDir.exists()).isFalse();
+    assertAllChangesDeletedInIndex();
+  }
+
+  @Test
+  @UseLocalDisk
+  public void testSshDeleteProjectWithWatches() throws Exception {
+    watch(project.get());
+    String cmd = createDeleteCommand(project.get());
+    adminSshSession.exec(cmd);
+    assertThat(adminSshSession.getError()).isNull();
+    assertThat(projectDir.exists()).isFalse();
+    assertAllChangesDeletedInIndex();
+    assertWatchRemoved();
   }
 
   @Test
@@ -211,8 +228,8 @@
   @UseLocalDisk
   @GerritConfig(name = "plugin.delete-project.allowDeletionOfReposWithTags", value = "false")
   public void testDeleteProjWithTags() throws Exception {
-    grant(Permission.CREATE, project, "refs/tags/*", false, REGISTERED_USERS);
-    pushTagOldCommitNotForce(Status.OK);
+    grant(project, "refs/tags/*", Permission.CREATE, false, REGISTERED_USERS);
+    pushTagOldCommitNotForce();
 
     String cmd = createDeleteCommand(project.get());
     adminSshSession.exec(cmd);
@@ -236,6 +253,7 @@
     assertThat(isEmpty(archiveFolder.toPath())).isFalse();
     assertThat(containsDeletedProject(archiveFolder.toPath(), project.get())).isTrue();
     assertThat(projectDir.exists()).isFalse();
+    assertAllChangesDeletedInIndex();
   }
 
   @Test
@@ -267,7 +285,7 @@
     assertThat(containsDeletedProject(archiveFolder.toPath().resolve(PARENT_FOLDER), name))
         .isTrue();
     assertThat(projectDir.exists()).isFalse();
-
+    assertAllChangesDeletedInIndex();
     assertThat(parentFolder.toFile().exists()).isFalse();
   }
 
@@ -295,19 +313,18 @@
         .join(PLUGIN, "delete", "--yes-really-delete", cmd, Joiner.on(" ").join(params));
   }
 
-  private String pushTagOldCommitNotForce(Status expectedStatus) throws Exception {
+  private void pushTagOldCommitNotForce() throws Exception {
     testRepo = cloneProject(project, user);
     commitBuilder().ident(user.getIdent()).message("subject (" + System.nanoTime() + ")").create();
-    String tagName = MoreObjects.firstNonNull(null, "v1_" + System.nanoTime());
+    String tagName = "v1_" + System.nanoTime();
 
-    grant(Permission.SUBMIT, project, "refs/for/refs/heads/master", false, REGISTERED_USERS);
+    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT, false, REGISTERED_USERS);
     pushHead(testRepo, "refs/for/master%submit");
 
     String tagRef = RefNames.REFS_TAGS + tagName;
     PushResult r = pushHead(testRepo, tagRef, false, false);
     RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef);
-    assertThat(refUpdate.getStatus()).named("LIGHTWEIGHT").isEqualTo(expectedStatus);
-    return tagName;
+    assertThat(refUpdate.getStatus()).named("LIGHTWEIGHT").isEqualTo(Status.OK);
   }
 
   private boolean isEmpty(Path dir) throws IOException {
@@ -321,4 +338,12 @@
       return dirStream.anyMatch(d -> d.toString().contains(projectName));
     }
   }
+
+  private void assertAllChangesDeletedInIndex() throws OrmException {
+    assertThat(queryProvider.get().byProject(project)).isEmpty();
+  }
+
+  private void assertWatchRemoved() throws RestApiException {
+    assertThat(gApi.accounts().self().getWatchedProjects()).isEmpty();
+  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/ArchiveRepositoryRemoverTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/ArchiveRepositoryRemoverTest.java
index bd976ab..64634b9 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/ArchiveRepositoryRemoverTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/ArchiveRepositoryRemoverTest.java
@@ -28,7 +28,6 @@
 
 import com.google.common.base.Joiner;
 import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.WorkQueue.Executor;
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.deleteproject.Configuration;
 import com.googlesource.gerrit.plugins.deleteproject.TimeMachine;
@@ -38,6 +37,7 @@
 import java.nio.file.Path;
 import java.time.Instant;
 import java.util.List;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.StreamSupport;
@@ -59,7 +59,7 @@
   private static final int NUMBER_OF_REPOS = 10;
   private static final String PLUGIN_NAME = "delete-project";
 
-  @Mock private Executor executorMock;
+  @Mock private ScheduledExecutorService executorMock;
   @Mock private ScheduledFuture<?> scheduledFutureMock;
   @Mock private WorkQueue workQueueMock;
   @Mock private Provider<RepositoryCleanupTask> cleanupTaskProviderMock;