Fix NPE if OWNERS file imports '/' instead of '/OWNERS'

An import in an OWNERS file must specify the file name of the imported
OWNERS file. This means to import the OWNERS file from the root
directory '/OWNERS' must be imported. Trying to attempt importing the
root folder '/' failed with a NPE because the file name of the path is
null in this case. Fix the NPE and return a proper error message in this
case.

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: Ib92dc40e007ce7a9693896cf394d57adc844db07
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
index 7f9d4c4..dff2506 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerConfigReference.java
@@ -72,7 +72,7 @@
 
   /** The name of the code owner config file. */
   public String fileName() {
-    return filePath().getFileName().toString();
+    return Optional.ofNullable(filePath().getFileName()).map(Path::toString).orElse("");
   }
 
   /** User-readable string representing this code owner config reference. */
diff --git a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java
index efa94d0..5291479 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/CodeOwnerConfigValidatorIT.java
@@ -1764,6 +1764,50 @@
   }
 
   @Test
+  public void cannotUploadConfigWithGlobalImportOfRootFolder() throws Exception {
+    testUploadConfigWithImportOfRootFolder(CodeOwnerConfigImportType.GLOBAL);
+  }
+
+  @Test
+  public void cannotUploadConfigWithPerFileImportOfRootFolder() throws Exception {
+    testUploadConfigWithImportOfRootFolder(CodeOwnerConfigImportType.PER_FILE);
+  }
+
+  private void testUploadConfigWithImportOfRootFolder(CodeOwnerConfigImportType importType)
+      throws Exception {
+    skipTestIfImportsNotSupportedByCodeOwnersBackend();
+
+    // Create a code owner config that wrongly imports the root folder instead of the '/OWNERS'
+    // file.
+    CodeOwnerConfig.Key keyOfImportingCodeOwnerConfig = createCodeOwnerConfigKey("/foo/");
+    CodeOwnerConfigReference codeOwnerConfigReference =
+        CodeOwnerConfigReference.builder(
+                CodeOwnerConfigImportMode.GLOBAL_CODE_OWNER_SETS_ONLY, /* filePath= */ "/")
+            .build();
+    CodeOwnerConfig codeOwnerConfig =
+        createCodeOwnerConfigWithImport(
+            keyOfImportingCodeOwnerConfig, importType, codeOwnerConfigReference);
+
+    PushOneCommit.Result r =
+        createChange(
+            user,
+            "Add code owners",
+            codeOwnerConfigOperations
+                .codeOwnerConfig(keyOfImportingCodeOwnerConfig)
+                .getJGitFilePath(),
+            format(codeOwnerConfig));
+    assertErrorWithMessages(
+        r,
+        "invalid code owner config files",
+        String.format(
+            "invalid %s import in '%s': '/' is not a code owner config file",
+            importType.getType(),
+            codeOwnerConfigOperations
+                .codeOwnerConfig(keyOfImportingCodeOwnerConfig)
+                .getFilePath()));
+  }
+
+  @Test
   public void
       forMergeCommitsNonResolvableGlobalImportsFromOtherProjectsAreReportedAsWarningsIfImportsDontSpecifyBranch()
           throws Exception {