#include <iostream>
#include <getopt.h>

#include "gtest/gtest.h"

namespace aos {
namespace testing {

// Actually declared/defined in //aos/testing:test_logging.
void SetLogFileName(const char* filename) __attribute__((weak));
void ForcePrintLogsDuringTests() __attribute__((weak));

}  // namespace testing
}  // namespace aos

GTEST_API_ int main(int argc, char **argv) {
  static const struct option long_options[] = {
      {"help", no_argument, 0, 'h'},
      {"print-logs", no_argument, 0, 'p'},
      {"log-file", required_argument, 0, 'o'},
      {0, 0, 0, 0},
  };

  testing::InitGoogleTest(&argc, argv);

  // The gtest library modifies argc and argv to remove all of its own command
  // line switches etc. So after calling InitGoogleTest() we can parse our own
  // command line options.
  while (true) {
    int c = getopt_long(argc, argv, "pho:", long_options, nullptr);

    if (c == -1) {
      break;
    }

    switch (c) {
      case 'h':
        printf(
            "\nFRC971 options:\n"
            "  -p, --print-logs\n"
            "      Print the log messages as they are being generated.\n"
            "  -o, --log-file=FILE\n"
            "      Print all log messages to FILE instead of standard output.\n"
	    "      This implies -p.\n"
            );
        break;

      case 'p':
        if (::aos::testing::ForcePrintLogsDuringTests) {
          ::aos::testing::ForcePrintLogsDuringTests();
        }
        break;

      case 'o':
        if (::aos::testing::ForcePrintLogsDuringTests) {
          ::aos::testing::ForcePrintLogsDuringTests();
        }
        if (::aos::testing::SetLogFileName) {
          ::aos::testing::SetLogFileName(optarg);
        }
        break;

      case '?':
        abort();
    }
  }

  return RUN_ALL_TESTS();
}
