// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gpu/khronos_glcts_support/khronos_glcts_test.h"

#include <string>

#include "base/at_exit.h"
#include "base/base_paths.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/process/launch.h"
#include "base/strings/string_util.h"
#include "gpu/config/gpu_test_config.h"
#include "gpu/config/gpu_test_expectations_parser.h"
#include "testing/gtest/include/gtest/gtest.h"

base::FilePath g_deqp_log_dir;

bool RunKhronosGLCTSTest(const char* test_name) {
  // Load test expectations, and return early if a test is marked as FAIL.
  base::FilePath src_path;
  PathService::Get(base::DIR_SOURCE_ROOT, &src_path);
  base::FilePath test_expectations_path =
      src_path.Append(FILE_PATH_LITERAL("gpu")).
      Append(FILE_PATH_LITERAL("khronos_glcts_support")).
      Append(FILE_PATH_LITERAL("khronos_glcts_test_expectations.txt"));
  if (!base::PathExists(test_expectations_path)) {
    LOG(ERROR) << "Fail to locate khronos_glcts_test_expectations.txt";
    return false;
  }
  gpu::GPUTestExpectationsParser test_expectations;
  if (!test_expectations.LoadTestExpectations(test_expectations_path)) {
    LOG(ERROR) << "Fail to load khronos_glcts_test_expectations.txt";
    return false;
  }
  gpu::GPUTestBotConfig bot_config;
  if (!bot_config.LoadCurrentConfig(NULL)) {
    LOG(ERROR) << "Fail to load bot configuration";
    return false;
  }
  if (!bot_config.IsValid()) {
    LOG(ERROR) << "Invalid bot configuration";
    return false;
  }

  const ::testing::TestInfo* const test_info =
      ::testing::UnitTest::GetInstance()->current_test_info();
  int32 expectation =
      test_expectations.GetTestExpectation(test_info->name(), bot_config);
  if (expectation != gpu::GPUTestExpectationsParser::kGpuTestPass) {
    LOG(WARNING) << "Test " << test_info->name() << " is bypassed";
    return true;
  }

  base::FilePath test_path;
  PathService::Get(base::DIR_EXE, &test_path);
  base::FilePath archive(test_path.Append(FILE_PATH_LITERAL(
      "khronos_glcts_data")));
  base::FilePath program(test_path.Append(FILE_PATH_LITERAL(
      "khronos_glcts_test_windowless")));
  base::FilePath log =
      g_deqp_log_dir.AppendASCII(test_info->name()).
      AddExtension(FILE_PATH_LITERAL(".log"));

  CommandLine cmdline(program);
  cmdline.AppendSwitchPath("--deqp-log-filename", log);
  cmdline.AppendSwitchPath("--deqp-archive-dir", archive);
  cmdline.AppendArg("--deqp-gl-config-id=-1");
  cmdline.AppendArg(std::string("--deqp-case=") + test_name);

  std::string output;
  bool success = base::GetAppOutput(cmdline, &output);
  if (success) {
    size_t success_index = output.find("Pass (Pass)");
    size_t failed_index = output.find("Fail (Fail)");
    success = (success_index != std::string::npos) &&
              (failed_index == std::string::npos);
  }
  if (!success) {
    LOG(ERROR) << output;
  }
  return success;
}

int main(int argc, char *argv[]) {
  base::AtExitManager at_exit;

  ::testing::InitGoogleTest(&argc, argv);

  if (argc == 2) {
    g_deqp_log_dir = base::FilePath::FromUTF8Unsafe(argv[1]);
  }
  else {
    base::GetTempDir(&g_deqp_log_dir);
  }

  return RUN_ALL_TESTS();
}

