// 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 "mojo/edk/test/test_support_impl.h"

#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#include <string>

#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/test/perf_log.h"

namespace mojo {
namespace edk {
namespace test {
namespace {

base::FilePath ResolveSourceRootRelativePath(const char* relative_path) {
  base::FilePath path;
  if (!PathService::Get(base::DIR_SOURCE_ROOT, &path))
    return base::FilePath();

  for (const base::StringPiece& component : base::SplitStringPiece(
           relative_path, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
    if (!component.empty())
      path = path.AppendASCII(component);
  }

  return path;
}

}  // namespace

TestSupportImpl::TestSupportImpl() {
}

TestSupportImpl::~TestSupportImpl() {
}

void TestSupportImpl::LogPerfResult(const char* test_name,
                                    const char* sub_test_name,
                                    double value,
                                    const char* units) {
  DCHECK(test_name);
  if (sub_test_name) {
    std::string name = base::StringPrintf("%s/%s", test_name, sub_test_name);
    base::LogPerfResult(name.c_str(), value, units);
  } else {
    base::LogPerfResult(test_name, value, units);
  }
}

FILE* TestSupportImpl::OpenSourceRootRelativeFile(const char* relative_path) {
  return base::OpenFile(ResolveSourceRootRelativePath(relative_path), "rb");
}

char** TestSupportImpl::EnumerateSourceRootRelativeDirectory(
    const char* relative_path) {
  std::vector<std::string> names;
  base::FileEnumerator e(ResolveSourceRootRelativePath(relative_path), false,
                         base::FileEnumerator::FILES);
  for (base::FilePath name = e.Next(); !name.empty(); name = e.Next())
    names.push_back(name.BaseName().AsUTF8Unsafe());

  // |names.size() + 1| for null terminator.
  char** rv = static_cast<char**>(calloc(names.size() + 1, sizeof(char*)));
  for (size_t i = 0; i < names.size(); ++i)
    rv[i] = base::strdup(names[i].c_str());
  return rv;
}

}  // namespace test
}  // namespace edk
}  // namespace mojo
