// Copyright (c) 2018 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 "net/third_party/quic/platform/impl/quic_test_output_impl.h"

#include <stdlib.h>
#include <time.h>

#include "base/environment.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "net/third_party/quic/platform/api/quic_str_cat.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace quic {

void QuicRecordTestOutputToFile(QuicStringPiece filename,
                                QuicStringPiece data) {
  std::string output_dir;
  if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR",
                                           &output_dir) ||
      output_dir.empty()) {
    return;
  }

  auto path = base::FilePath::FromUTF8Unsafe(output_dir)
                  .Append(base::FilePath::FromUTF8Unsafe(filename));

  int bytes_written = base::WriteFile(path, data.data(), data.size());
  if (bytes_written < 0) {
    LOG(WARNING) << "Failed to write into " << path;
    return;
  }
  LOG(INFO) << "Recorded test output into " << path;
}

void QuicRecordTestOutputImpl(QuicStringPiece identifier,
                              QuicStringPiece data) {
  const testing::TestInfo* test_info =
      testing::UnitTest::GetInstance()->current_test_info();

  // TODO(vasilvv): replace this with absl::Time once it's usable in Chromium.
  time_t now_ts = time(nullptr);
  tm now;
#ifdef OS_WIN
  gmtime_s(&now, &now_ts);
#else
  gmtime_r(&now_ts, &now);
#endif

  char timestamp[2048];
  strftime(timestamp, sizeof(timestamp), "%Y%m%d%H%M%S", &now);

  std::string filename = QuicStringPrintf("%s.%s.%s.%s.qtr", test_info->name(),
                                          test_info->test_case_name(),
                                          identifier.data(), timestamp);

  QuicRecordTestOutputToFile(filename, data);
}

}  // namespace quic
