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