/******************************************************************************
 *
 *  Copyright 2018 The Android Open Source Project
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

#include <base/command_line.h>
#include <base/logging.h>
#include <base/strings/string_piece.h>
#include <base/strings/string_util.h>
#include <gtest/gtest.h>

#include <string>

// Override LogMsg method so that we can output log via VLOG(1)
extern "C" void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {
  char buffer[256];
  va_list args;
  va_start(args, fmt_str);
  vsnprintf(buffer, 256, fmt_str, args);
  VLOG(1) << buffer;
  va_end(args);
}

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);

  if (base::CommandLine::InitializedForCurrentProcess()) {
    LOG(FATAL) << "base::CommandLine::Init should not be called twice";
    return 1;
  }

  const char* log_level_arg = nullptr;
  for (int i = 0; i < argc; ++i) {
    if (base::StartsWith(base::StringPiece(argv[i]), base::StringPiece("--v="),
                         base::CompareCase::INSENSITIVE_ASCII)) {
      log_level_arg = argv[i];
    }
  }
  if (log_level_arg == nullptr) {
    log_level_arg = "--v=0";
  }
  const char* logging_argv[] = {"bt_stack", log_level_arg};
  // Init command line object with logging switches
  if (!base::CommandLine::Init(2, logging_argv)) {
    LOG(FATAL) << "base::CommandLine::Init failed, arg0=" << logging_argv[0]
               << ", arg1=" << logging_argv[1];
    return 1;
  }

  logging::LoggingSettings log_settings;
  if (!logging::InitLogging(log_settings)) {
    LOG(ERROR) << "Failed to set up logging";
  }

  // Android already logs thread_id, proc_id, timestamp, so disable those.
  logging::SetLogItems(false, false, false, false);

  return RUN_ALL_TESTS();
}
