Generate a dependency file for C++ output

Bug: 23600457
Test: unittests, added another

Change-Id: Ic1834badc396d444057a58f3868bcf343dcc933d
diff --git a/aidl.cpp b/aidl.cpp
index 9ba25d1..7459f8f 100644
--- a/aidl.cpp
+++ b/aidl.cpp
@@ -596,7 +596,11 @@
     return err;
   }
 
-  // TODO(wiley) b/23600457 generate a dependency file if requested with -b
+  string dep_file_name = options.DependencyFilePath();
+  if (!dep_file_name.empty()) {
+    generate_dep_file(dep_file_name, options.InputFileName(),
+                      options.OutputCppFilePath(), imports, io_delegate);
+  }
 
   return (cpp::GenerateCpp(options, *types, *interface, io_delegate)) ? 0 : 1;
 }
diff --git a/options.h b/options.h
index 7d503f4..c5a1f9c 100644
--- a/options.h
+++ b/options.h
@@ -80,7 +80,7 @@
   std::string OutputCppFilePath() const { return output_file_name_; }
 
   std::vector<std::string> ImportPaths() const { return import_paths_; }
-  std::string DependencyFilepath() const { return dep_file_name_; }
+  std::string DependencyFilePath() const { return dep_file_name_; }
 
  private:
   CppOptions() = default;
diff --git a/tests/end_to_end_tests.cpp b/tests/end_to_end_tests.cpp
index c03247c..7ea5bc8 100644
--- a/tests/end_to_end_tests.cpp
+++ b/tests/end_to_end_tests.cpp
@@ -88,7 +88,7 @@
   // Check that we parse correctly.
   EXPECT_EQ(android::aidl::compile_aidl_to_java(options, io_delegate_), 0);
   CheckFileContents(kJavaOutputPath, kExpectedJavaOutput);
-  CheckFileContents(options.dep_file_name_, kExpectedJavaDepsOutput);
+  CheckFileContents(options.DependencyFilePath(), kExpectedJavaDepsOutput);
 }
 
 TEST_F(EndToEndTest, IPingResponderCpp) {
@@ -96,16 +96,17 @@
 
   const string input_path =
       CanonicalNameToPath(kCanonicalName, ".aidl").value();
-  const string output_file = "path/to/output_file.cpp";
-  const size_t argc = 5;
+  const string output_file = kCppOutputPath;
+  const size_t argc = 6;
   const char* cmdline[argc + 1] = {
-      "aidl-cpp", "-I.", input_path.c_str(), kGenHeaderDir,
+      "aidl-cpp", "-ddeps.P", "-I.", input_path.c_str(), kGenHeaderDir,
       output_file.c_str(), nullptr
   };
   auto options = CppOptions::Parse(argc, cmdline);
 
   // Set up input paths.
   io_delegate_.SetFileContents(input_path, kInterfaceDefinition);
+  AddStubAidls(kImportedParcelables, kImportedInterfaces);
 
   // Check that we parse and generate code correctly.
   EXPECT_EQ(android::aidl::compile_aidl_to_cpp(*options, io_delegate_), 0);
@@ -113,6 +114,7 @@
   CheckFileContents(kGenInterfaceHeaderPath, kExpectedIHeaderOutput);
   CheckFileContents(kGenClientHeaderPath, kExpectedBpHeaderOutput);
   CheckFileContents(kGenServerHeaderPath, kExpectedBnHeaderOutput);
+  CheckFileContents(options->DependencyFilePath(), kExpectedCppDepsOutput);
 }
 
 }  // namespace android
diff --git a/tests/test_data.h b/tests/test_data.h
index f72d9d7..83448bd 100644
--- a/tests/test_data.h
+++ b/tests/test_data.h
@@ -39,11 +39,17 @@
 extern const char kCanonicalName[];
 extern const char kInterfaceDefinition[];
 
+extern const char kCppOutputPath[];
+extern const char* kImportedParcelables[];
+extern const char* kImportedInterfaces[];
+
 extern const char kGenHeaderDir[];
 extern const char kGenInterfaceHeaderPath[];
 extern const char kGenClientHeaderPath[];
 extern const char kGenServerHeaderPath[];
 
+extern const char kExpectedCppDepsOutput[];
+
 extern const char kExpectedCppOutput[];
 extern const char kExpectedIHeaderOutput[];
 extern const char kExpectedBpHeaderOutput[];
diff --git a/tests/test_data_ping_responder.cpp b/tests/test_data_ping_responder.cpp
index 6c0487c..f15bb97 100644
--- a/tests/test_data_ping_responder.cpp
+++ b/tests/test_data_ping_responder.cpp
@@ -25,16 +25,38 @@
 const char kInterfaceDefinition[] = R"(
 package android.os;
 
+import bar.Unused;
+
 interface IPingResponder {
   int Ping(int token);
 }
 )";
 
+const char kCppOutputPath[] = "some/path/to/output.cpp";
+
+const char* kImportedParcelables[] = {
+  "bar.Unused",
+  nullptr,
+};
+
+const char* kImportedInterfaces[] = {
+  nullptr,
+};
+
 const char kGenHeaderDir[] = "some/path";
 const char kGenInterfaceHeaderPath[] = "some/path/android/os/IPingResponder.h";
 const char kGenClientHeaderPath[] = "some/path/android/os/BpPingResponder.h";
 const char kGenServerHeaderPath[] = "some/path/android/os/BnPingResponder.h";
 
+const char kExpectedCppDepsOutput[] =
+R"(some/path/to/output.cpp: \
+  android/os/IPingResponder.aidl \
+  ./bar/Unused.aidl
+
+android/os/IPingResponder.aidl :
+./bar/Unused.aidl :
+)";
+
 const char kExpectedCppOutput[] =
 R"(#include <android/os/IPingResponder.h>
 #include <android/os/BpPingResponder.h>