Make project creator an owner if not already by inheritance

Project creator must always be owner otherwise he will not be able to
configure access rights of project he just created.

Change-Id: I15d770ed205cb492e123215f6fbb5879a3e81eae
diff --git a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
index b911289..19b3be5 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
@@ -134,11 +134,15 @@
 
     if (allProjectsName.get().equals(parentCtrl.getProject().getNameKey())) {
       validateRootProject(name, args.permissionsOnly);
-      args.ownerIds.add(createGroup(name + "-admins"));
-      return;
+    } else {
+      validateProject(name, parentCtrl);
     }
 
-    validateProject(name, parentCtrl);
+    // If we reached that point, it means we allow project creation. Make the
+    // user an owner if not already by inheritance.
+    if (!parentCtrl.isOwner()) {
+      args.ownerIds.add(createGroup(name + "-admins"));
+    }
   }
 
   private AccountGroup.UUID createGroup(String name)
diff --git a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
index cd35085..e76f94b 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
@@ -228,6 +228,53 @@
   }
 
   @Test
+  public void shouldMakeUserOwnerIfNotAlreadyOwnerByInheritance()
+      throws Exception {
+    String parent = name("parentProject");
+    ProjectInput in = new ProjectInput();
+    in.permissionsOnly = true;
+    adminRestSession.put("/projects/" + parent, in).assertCreated();
+
+    String delegatingGroup = name("someGroup");
+    GroupApi dGroup = gApi.groups().create(delegatingGroup);
+    dGroup.addMembers(user.username);
+    Project.NameKey parentNameKey = new Project.NameKey(parent);
+    ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
+    String gId = gApi.groups().id(delegatingGroup).get().id;
+    cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
+        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    saveProjectConfig(parentNameKey, cfg);
+
+    // normal case, when <project-name>-admins group does not exist
+    in = new ProjectInput();
+    in.parent = parent;
+    String childProject = parent + "/childProject";
+    userRestSession.put("/projects/" + Url.encode(childProject), in)
+        .assertCreated();
+    ProjectState projectState =
+        projectCache.get(new Project.NameKey(childProject));
+    assertThat(projectState.getOwners().size()).isEqualTo(1);
+    assertThat(projectState.getOwners()).contains(
+        groupCache.get(new AccountGroup.NameKey(childProject + "-admins"))
+            .getGroupUUID());
+
+    // case when <project-name>-admins group already exists
+    String childProject2 = parent + "/childProject2";
+    String existingGroupName = childProject2 + "-admins";
+    gApi.groups().create(existingGroupName);
+    userRestSession.put("/projects/" + Url.encode(childProject2), in)
+        .assertCreated();
+    projectState = projectCache.get(new Project.NameKey(childProject2));
+    assertThat(projectState.getOwners().size()).isEqualTo(1);
+    String expectedOwnerGroup = existingGroupName + "-"
+        + Hashing.sha1().hashString(existingGroupName, Charsets.UTF_8)
+            .toString().substring(0, 7);
+    assertThat(projectState.getOwners()).contains(groupCache
+        .get(new AccountGroup.NameKey(expectedOwnerGroup)).getGroupUUID());
+  }
+
+  @Test
   public void shouldBlockCreationIfGroupRefIsNotUsed() throws Exception {
     String ownerGroup = name("groupA");
     gApi.groups().create(ownerGroup);