// Copyright 2020 The Chromium OS 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 "ml_benchmark/shared_library_benchmark.h"

#include <memory>
#include <string>

#include <base/logging.h>

namespace ml_benchmark {

SharedLibraryBenchmark::SharedLibraryBenchmark(
    std::unique_ptr<BenchmarkFunctions> functions)
    : functions_(std::move(functions)) {
  CHECK(functions_ != nullptr);
}

bool SharedLibraryBenchmark::ExecuteBenchmark(
    const chrome::ml_benchmark::CrOSBenchmarkConfig& config,
    chrome::ml_benchmark::BenchmarkResults* results) {
  std::string config_bytes;
  if (!config.SerializeToString(&config_bytes)) {
    LOG(ERROR) << "Unable to serialize configuration protobuf";
    return false;
  }

  void* results_buffer = nullptr;
  int32_t results_size = 0;
  auto ret = functions_->BenchmarkFunction(config_bytes.c_str(),
      config_bytes.size(),
      &results_buffer,
      &results_size);

  if (ret != chrome::ml_benchmark::OK) {
    LOG(ERROR) << "Benchmark did not successfully execute";
    return false;
  }

  auto deleter = [this](void* memory) {
    functions_->FreeBenchmarkResults(memory);
  };
  std::unique_ptr<void, decltype(deleter)> managed_results(
      results_buffer,
      deleter);

  if (results_buffer == nullptr || results_size == 0) {
    LOG(ERROR)  << "Cannot parse the results from the test driver: "
                << "Driver did not return a buffer or a correct size";
    return false;
  }

  if (!results->ParseFromArray(results_buffer, results_size)) {
    LOG(ERROR)  << "Cannot parse the results from the test driver: "
                << "Driver did not return a valid result";
    return false;
  }

  return true;
}

}  // namespace ml_benchmark
