// Copyright 2016 The Fuchsia 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 <benchmark/benchmark.h>
#include <fstream>
#include <libgen.h>
#include <spec_fixture.h>
#include <spec_utils.h>
#include <sys/stat.h>
#include <unistd.h>
#include <glog/logging.h>

namespace {

class MesaFixture : public SpecFixture {
 protected:
  MesaFixture() : SpecFixture("177.mesa") {}
};

class GzipFixture : public SpecFixture {
 protected:
  GzipFixture() : SpecFixture("164.gzip"){};
};

class ArtFixture : public SpecFixture {
 protected:
  ArtFixture() : SpecFixture("179.art"){};
};

}  // namespace

std::string executableDir;

// Where we will run benchmarks
std::string tmpDir;

BENCHMARK_F(MesaFixture, 177_Mesa)(benchmark::State& st) {
  while (st.KeepRunning()) {
    if (RunSpec(NULL, 0) != 0) {
      st.SkipWithError(
          (std::string("Error while running benchmark: ") + strerror(errno))
              .c_str());
    }
  }
}

BENCHMARK_F(GzipFixture, 164_Gzip)(benchmark::State& st) {
  while (st.KeepRunning()) {
    std::vector<std::string> inputs = {"input.source", "input.log",
                                       "input.graphic", "input.random",
                                       "input.program"};

    for (auto& it : inputs) {
      const char* args[] = {it.c_str(), "60"};
      if (RunSpec(args, 2) != 0) {
        st.SkipWithError(
            (std::string("Error while running benchmark: ") + strerror(errno))
                .c_str());
      }
    }
  }
}

BENCHMARK_F(ArtFixture, 179_Art)(benchmark::State& st) {
  while (st.KeepRunning()) {
    const char* args1[] = {
        "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-trainfile2",
        "hc.img",    "-stride",    "2",           "-startx", "110",
        "-starty",   "200",        "-endx",       "160",     "-endy",
        "240",       "-objects",   "10"};

    const char* args2[] = {
        "-scanfile", "c756hel.in", "-trainfile1", "a10.img", "-trainfile2",
        "hc.img",    "-stride",    "2",           "-startx", "470",
        "-starty",   "140",        "-endx",       "520",     "-endy",
        "180",       "-objects",   "10"};
    if (RunSpec(args1, 18) != 0 || RunSpec(args2, 18) != 0) {
      st.SkipWithError(
          (std::string("Error while running benchmark: ") + strerror(errno))
              .c_str());
    }
  }
}

int main(int argc, char* argv[]) {
  ::benchmark::Initialize(&argc, argv);
  google::InitGoogleLogging(argv[0]);
  char* cwd;
  CHECK_NOTNULL((cwd = get_current_dir_name()));
  executableDir = std::string(cwd) + "/" + dirname(argv[0]);

  char* c = tempnam(NULL, "speccpu2000");
  CHECK_NOTNULL(c);
  tmpDir = c;

  CHECK_EQ(mkdir(tmpDir.c_str(), 0700), 0)
      << "Error while creating tmp dir: " << tmpDir.c_str()
      << ", error:" << strerror(errno);

  ::benchmark::RunSpecifiedBenchmarks();

  // try deleting temp directory
  CHECK_EQ(DeleteDir(tmpDir), 0) << "Error while deleting tmp dir: " << tmpDir
                                 << ", error:" << strerror(errno);
  return 0;
}
