/*
 * Copyright (C) 2017 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.
 */

#pragma once

#include <poll.h>
#include <stdint.h>
#include <sys/types.h>

#include <map>
#include <memory>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <vector>

#include "Color.h"
#include "Options.h"
#include "Test.h"

namespace android {
namespace gtest_extras {

class Isolate {
 public:
  Isolate(const Options& options, const std::vector<const char*>& child_args)
      : options_(options), child_args_(child_args) {}

  void EnumerateTests();

  int Run();

 private:
  struct ResultsType {
    const char* color;
    const char* prefix;
    const char* list_desc;
    const char* title;
    bool (*match_func)(const Test&);
    void (*print_func)(const Options&, const Test&);
  };

  size_t CheckTestsFinished();

  void CheckTestsTimeout();

  int ChildProcessFn(const std::tuple<std::string, std::string>& test);

  void HandleSignals();

  void LaunchTests();

  void ReadTestsOutput();

  void RunAllTests();

  void PrintFooter(uint64_t elapsed_time_ns);

  void PrintResults(size_t total, const ResultsType& results, std::string* footer);

  void WriteXmlResults(uint64_t elapsed_time_ns, time_t start_time);

  static std::string GetTestName(const std::tuple<std::string, std::string>& test) {
    return std::get<0>(test) + std::get<1>(test);
  }

  const Options& options_;
  const std::vector<const char*>& child_args_;

  size_t total_cases_ = 0;
  size_t total_tests_ = 0;
  size_t total_disable_tests_ = 0;
  size_t total_pass_tests_;
  size_t total_xpass_tests_;
  size_t total_fail_tests_;
  size_t total_xfail_tests_;
  size_t total_timeout_tests_;
  size_t total_slow_tests_;
  size_t cur_test_index_ = 0;

  uint64_t slow_threshold_ns_;
  uint64_t deadline_threshold_ns_;
  std::vector<std::tuple<std::string, std::string>> tests_;

  std::vector<Test*> running_;
  std::vector<pollfd> running_pollfds_;
  std::vector<size_t> running_indices_;
  std::unordered_map<pid_t, std::unique_ptr<Test>> running_by_pid_;
  std::map<size_t, Test*> running_by_test_index_;

  std::map<size_t, std::unique_ptr<Test>> finished_;

  static constexpr useconds_t MIN_USECONDS_WAIT = 1000;

  static ResultsType SlowResults;
  static ResultsType XpassFailResults;
  static ResultsType FailResults;
  static ResultsType TimeoutResults;
};

}  // namespace gtest_extras
}  // namespace android
