// Copyright (c) 2012 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 "chromiumos-wide-profiling/perf_recorder.h"

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <vector>

#include "chromiumos-wide-profiling/perf_serializer.h"
#include "chromiumos-wide-profiling/quipper_string.h"
#include "chromiumos-wide-profiling/run_command.h"
#include "chromiumos-wide-profiling/scoped_temp_path.h"
#include "chromiumos-wide-profiling/utils.h"

namespace quipper {

namespace {
string IntToString(const int i) {
  stringstream ss;
  ss << i;
  return ss.str();
}
}  // namespace

bool PerfRecorder::RecordAndConvertToProtobuf(
    const std::vector<string>& perf_args,
    const int time,
    quipper::PerfDataProto* perf_data) {
  ScopedTempFile output_file;
  if (std::find(perf_args.begin(), perf_args.end(), "--") != perf_args.end()) {
    // Perf uses '--' to mark the end of arguments and the beginning of the
    // command to run and profile. We need to run sleep, so disallow this.
    LOG(ERROR) << "perf_args may contain a command. Refusing to run it!";
    return false;
  }
  std::vector<string> full_perf_args(perf_args.begin(), perf_args.end());
  full_perf_args.insert(full_perf_args.end(),
                        {"-o", output_file.path(),
                         "--",
                         "sleep", IntToString(time)});

  // The perf command writes the output to a file, so ignore stdout.
  if (!RunCommand(full_perf_args, nullptr)) {
    return false;
  }

  // Now convert it into a protobuf.
  PerfSerializer perf_serializer;
  PerfParser::Options options;
  // Make sure to remap address for security reasons.
  options.do_remap = true;
  // Discard unused perf events to reduce the protobuf size.
  options.discard_unused_events = true;

  perf_serializer.set_options(options);

  return perf_serializer.SerializeFromFile(output_file.path(), perf_data);
}

}  // namespace quipper
