diff --git a/tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator/Main.java b/tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator/Main.java
index cd2ca7d..4e50e29 100644
--- a/tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator/Main.java
+++ b/tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator/Main.java
@@ -47,12 +47,22 @@
   private static final Logger logger = Logger.getLogger(Main.class.getName());
 
   public static void main(String... args) {
+    try {
+      int exitCode = runWithArgs(args);
+      System.exit(exitCode);
+    } catch (Exception e) {
+      logger.log(Level.SEVERE, "Unhandled exception on lcov tool: " + e.getMessage());
+      System.exit(1);
+    }
+  }
+
+  static int runWithArgs(String... args) {
     LcovMergerFlags flags = null;
     try {
       flags = LcovMergerFlags.parseFlags(args);
     } catch (IllegalArgumentException e) {
       logger.log(Level.SEVERE, e.getMessage());
-      System.exit(1);
+      return 1;
     }
 
     File outputFile = new File(flags.outputFile());
@@ -80,8 +90,19 @@
     if (coverage.isEmpty()) {
       int exitStatus = 0;
       if (profdataFile == null) {
-        logger.log(Level.WARNING, "There was no coverage found.");
-        exitStatus = 0;
+        try {
+          logger.log(Level.WARNING, "There was no coverage found.");
+          Files.createFile(outputFile.toPath()); // Generate empty declared output
+          exitStatus = 0;
+        } catch (IOException e) {
+          logger.log(
+              Level.SEVERE,
+              "Could not create empty output file "
+                  + outputFile.getName()
+                  + " due to: "
+                  + e.getMessage());
+          exitStatus = 1;
+        }
       } else {
         // Bazel doesn't support yet converting profdata files to lcov. We still want to output a
         // coverage report so we copy the content of the profdata file to the output file. This is
@@ -102,7 +123,7 @@
           exitStatus = 1;
         }
       }
-      System.exit(exitStatus);
+      return exitStatus;
     }
 
     if (!coverage.isEmpty() && profdataFile != null) {
@@ -112,7 +133,7 @@
       logger.log(
           Level.WARNING,
           "Bazel doesn't support LLVM profdata coverage amongst other coverage formats.");
-      System.exit(0);
+      return 0;
     }
 
     if (!flags.filterSources().isEmpty()) {
@@ -129,8 +150,19 @@
     }
 
     if (coverage.isEmpty()) {
-      logger.log(Level.WARNING, "There was no coverage found.");
-      System.exit(0);
+      try {
+        logger.log(Level.WARNING, "There was no coverage found.");
+        Files.createFile(outputFile.toPath()); // Generate empty declared output
+        return 0;
+      } catch (IOException e) {
+        logger.log(
+            Level.SEVERE,
+            "Could not create empty output file "
+                + outputFile.getName()
+                + " due to: "
+                + e.getMessage());
+        return 1;
+      }
     }
 
     int exitStatus = 0;
@@ -143,7 +175,7 @@
           "Could not write to output file " + outputFile + " due to " + e.getMessage());
       exitStatus = 1;
     }
-    System.exit(exitStatus);
+    return exitStatus;
   }
 
   /**
diff --git a/tools/test/CoverageOutputGenerator/javatests/com/google/devtools/coverageoutputgenerator/MainTest.java b/tools/test/CoverageOutputGenerator/javatests/com/google/devtools/coverageoutputgenerator/MainTest.java
index 84b650a..370458f 100644
--- a/tools/test/CoverageOutputGenerator/javatests/com/google/devtools/coverageoutputgenerator/MainTest.java
+++ b/tools/test/CoverageOutputGenerator/javatests/com/google/devtools/coverageoutputgenerator/MainTest.java
@@ -22,11 +22,13 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.junit.rules.TestName;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
@@ -35,6 +37,7 @@
 public class MainTest {
 
   @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
+  @Rule public TestName testName = new TestName();
   private Path coverageDir;
 
   @Before
@@ -70,6 +73,37 @@
     assertParallelParse(4, 1024, 1024);
   }
 
+  @Test
+  public void testEmptyInputProducesEmptyOutput() throws IOException {
+    Path output =
+        Paths.get(
+            temporaryFolder.getRoot().getAbsolutePath(),
+            testName.getMethodName() + ".coverage.dat");
+    int exitCode =
+        Main.runWithArgs(
+            "--coverage_dir", coverageDir.toAbsolutePath().toString(),
+            "--output_file", output.toAbsolutePath().toString());
+    assertThat(exitCode).isEqualTo(0);
+    assertThat(output.toFile().exists()).isTrue();
+    assertThat(output.toFile().length()).isEqualTo(0L);
+  }
+
+  @Test
+  public void testNonEmptyInputProducesNonEmptyOutput() throws IOException {
+    LcovMergerTestUtils.generateLcovFiles("test_data/simple_test", 8, 8, 8, coverageDir);
+    Path output =
+        Paths.get(
+            temporaryFolder.getRoot().getAbsolutePath(),
+            testName.getMethodName() + ".coverage.dat");
+    int exitCode =
+        Main.runWithArgs(
+            "--coverage_dir", coverageDir.toAbsolutePath().toString(),
+            "--output_file", output.toAbsolutePath().toString());
+    assertThat(exitCode).isEqualTo(0);
+    assertThat(output.toFile().exists()).isTrue();
+    assertThat(output.toFile().length()).isGreaterThan(0L);
+  }
+
   private void assertParallelParse(int numLcovFiles, int numSourceFiles, int numLinesPerSourceFile)
       throws IOException {
 
