add -W<warning>/-Werror CLI options

-Weverything: enable all diagnotics
-Wfoo: enable "foo"
-Wno-foo: disable "foo"

-Werror: turn diagnostic warnings into errors
-Wno-error=foo: turn "foo" into a warning

For now, only -Winterface-name is available, which checks if interface
names start with "I".

Bug: 168028537
Test: aidl_unittests
Change-Id: I31516b337dd80b9833205bf769af40e49f88d15d
diff --git a/options_unittest.cpp b/options_unittest.cpp
index 377861b..83ab32a 100644
--- a/options_unittest.cpp
+++ b/options_unittest.cpp
@@ -24,6 +24,10 @@
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
+#include "diagnostics.h"
+
+using android::aidl::DiagnosticID;
+using android::aidl::DiagnosticSeverity;
 using std::cerr;
 using std::endl;
 using std::string;
@@ -344,5 +348,56 @@
   EXPECT_THAT(GetCapturedStderr(), testing::HasSubstr(expected_error));
 }
 
+TEST(OptionsTests, ParsesWarningEnableAll) {
+  const char* args[] = {
+      "aidl", "--lang=java", "-Weverything", "--out=out", "input.aidl", nullptr,
+  };
+  auto options = GetOptions(args);
+  EXPECT_TRUE(options->Ok());
+  auto warning_options = options->GetWarningOptions();
+  EXPECT_EQ(DiagnosticSeverity::WARNING, warning_options.Severity(DiagnosticID::interface_name));
+}
+
+TEST(OptionsTests, ParsesWarningEnableSpecificWarning) {
+  const char* args[] = {
+      "aidl", "--lang=java", "-Winterface-name", "--out=out", "input.aidl", nullptr,
+  };
+  auto options = GetOptions(args);
+  EXPECT_TRUE(options->Ok());
+  auto warning_options = options->GetWarningOptions();
+  EXPECT_EQ(DiagnosticSeverity::WARNING, warning_options.Severity(DiagnosticID::interface_name));
+}
+
+TEST(OptionsTests, ParsesWarningDisableSpecificWarning) {
+  const char* args[] = {
+      "aidl",      "--lang=java", "-Weverything", "-Wno-interface-name",
+      "--out=out", "input.aidl",  nullptr,
+  };
+  auto options = GetOptions(args);
+  EXPECT_TRUE(options->Ok());
+  auto warning_options = options->GetWarningOptions();
+  EXPECT_EQ(DiagnosticSeverity::DISABLED, warning_options.Severity(DiagnosticID::interface_name));
+}
+
+TEST(OptionsTests, ParsesWarningAsErrors) {
+  const char* args[] = {
+      "aidl", "--lang=java", "-Werror", "-Weverything", "--out=out", "input.aidl", nullptr,
+  };
+  auto options = GetOptions(args);
+  EXPECT_TRUE(options->Ok());
+  auto warning_options = options->GetWarningOptions();
+  EXPECT_EQ(DiagnosticSeverity::ERROR, warning_options.Severity(DiagnosticID::interface_name));
+}
+
+TEST(OptionsTests, RejectsUnknownWarning) {
+  const char* args[] = {
+      "aidl", "--lang=java", "-Wfoobar", "--out=out", "input.aidl", nullptr,
+  };
+  CaptureStderr();
+  auto options = GetOptions(args);
+  EXPECT_FALSE(options->Ok());
+  EXPECT_THAT(GetCapturedStderr(), testing::HasSubstr("unknown warning: foobar"));
+}
+
 }  // namespace aidl
 }  // namespace android