1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.h"
6
7 #include <stdlib.h>
8 #include <time.h>
9
10 #include "base/environment.h"
11 #include "base/files/file_path.h"
12 #include "base/files/file_util.h"
13 #include "base/strings/stringprintf.h"
14 #include "build/build_config.h"
15 #include "net/third_party/quiche/src/quiche/quic/platform/api/quic_logging.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace quiche {
19
QuicheRecordTestOutputToFile(std::string_view filename,std::string_view data)20 void QuicheRecordTestOutputToFile(std::string_view filename,
21 std::string_view data) {
22 std::string output_dir;
23 if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR",
24 &output_dir) ||
25 output_dir.empty()) {
26 return;
27 }
28
29 auto path = base::FilePath::FromUTF8Unsafe(output_dir)
30 .Append(base::FilePath::FromUTF8Unsafe(filename));
31
32 int bytes_written = base::WriteFile(path, data.data(), data.size());
33 if (bytes_written < 0) {
34 QUIC_LOG(WARNING) << "Failed to write into " << path;
35 return;
36 }
37 QUIC_LOG(INFO) << "Recorded test output into " << path;
38 }
39
QuicheSaveTestOutputImpl(std::string_view filename,std::string_view data)40 void QuicheSaveTestOutputImpl(std::string_view filename,
41 std::string_view data) {
42 QuicheRecordTestOutputToFile(filename, data);
43 }
44
QuicheLoadTestOutputImpl(std::string_view filename,std::string * data)45 bool QuicheLoadTestOutputImpl(std::string_view filename, std::string* data) {
46 std::string output_dir;
47 if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR",
48 &output_dir) ||
49 output_dir.empty()) {
50 QUIC_LOG(WARNING) << "Failed to load " << filename
51 << " because QUIC_TEST_OUTPUT_DIR is not set";
52 return false;
53 }
54
55 auto path = base::FilePath::FromUTF8Unsafe(output_dir)
56 .Append(base::FilePath::FromUTF8Unsafe(filename));
57
58 return base::ReadFileToString(path, data);
59 }
60
QuicheRecordTraceImpl(std::string_view identifier,std::string_view data)61 void QuicheRecordTraceImpl(std::string_view identifier, std::string_view data) {
62 const testing::TestInfo* test_info =
63 testing::UnitTest::GetInstance()->current_test_info();
64
65 // TODO(vasilvv): replace this with absl::Time once it's usable in Chromium.
66 time_t now_ts = time(nullptr);
67 tm now;
68 #if BUILDFLAG(IS_WIN)
69 gmtime_s(&now, &now_ts);
70 #else
71 gmtime_r(&now_ts, &now);
72 #endif
73
74 char timestamp[2048];
75 strftime(timestamp, sizeof(timestamp), "%Y%m%d%H%M%S", &now);
76
77 std::string filename = base::StringPrintf(
78 "%s.%s.%s.%s.qtr", test_info->name(), test_info->test_suite_name(),
79 identifier.data(), timestamp);
80
81 QuicheRecordTestOutputToFile(filename, data);
82 }
83
84 } // namespace quiche
85