xref: /aosp_15_r20/external/cronet/base/debug/crash_logging_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/debug/crash_logging.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <map>
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker #include <sstream>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ref.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
14*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker using ::testing::ElementsAre;
17*6777b538SAndroid Build Coastguard Worker using ::testing::IsEmpty;
18*6777b538SAndroid Build Coastguard Worker using ::testing::Pair;
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace base {
21*6777b538SAndroid Build Coastguard Worker namespace debug {
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace {
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker class TestCrashKeyImplementation : public CrashKeyImplementation {
26*6777b538SAndroid Build Coastguard Worker  public:
TestCrashKeyImplementation(std::map<std::string,std::string> & data)27*6777b538SAndroid Build Coastguard Worker   explicit TestCrashKeyImplementation(std::map<std::string, std::string>& data)
28*6777b538SAndroid Build Coastguard Worker       : data_(data) {}
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker   TestCrashKeyImplementation(const TestCrashKeyImplementation&) = delete;
31*6777b538SAndroid Build Coastguard Worker   TestCrashKeyImplementation& operator=(const TestCrashKeyImplementation&) =
32*6777b538SAndroid Build Coastguard Worker       delete;
33*6777b538SAndroid Build Coastguard Worker 
Allocate(const char * name,CrashKeySize size)34*6777b538SAndroid Build Coastguard Worker   CrashKeyString* Allocate(const char* name, CrashKeySize size) override {
35*6777b538SAndroid Build Coastguard Worker     return new CrashKeyString(name, size);
36*6777b538SAndroid Build Coastguard Worker   }
37*6777b538SAndroid Build Coastguard Worker 
Set(CrashKeyString * crash_key,std::string_view value)38*6777b538SAndroid Build Coastguard Worker   void Set(CrashKeyString* crash_key, std::string_view value) override {
39*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(data_->emplace(crash_key->name, value).second);
40*6777b538SAndroid Build Coastguard Worker   }
41*6777b538SAndroid Build Coastguard Worker 
Clear(CrashKeyString * crash_key)42*6777b538SAndroid Build Coastguard Worker   void Clear(CrashKeyString* crash_key) override {
43*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(1u, data_->erase(crash_key->name));
44*6777b538SAndroid Build Coastguard Worker   }
45*6777b538SAndroid Build Coastguard Worker 
OutputCrashKeysToStream(std::ostream & out)46*6777b538SAndroid Build Coastguard Worker   void OutputCrashKeysToStream(std::ostream& out) override {
47*6777b538SAndroid Build Coastguard Worker     out << "Got " << data_->size() << " crash keys.";
48*6777b538SAndroid Build Coastguard Worker   }
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker  private:
51*6777b538SAndroid Build Coastguard Worker   const raw_ref<std::map<std::string, std::string>> data_;
52*6777b538SAndroid Build Coastguard Worker };
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker }  // namespace
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker class CrashLoggingTest : public ::testing::Test {
57*6777b538SAndroid Build Coastguard Worker  public:
CrashLoggingTest()58*6777b538SAndroid Build Coastguard Worker   CrashLoggingTest() {
59*6777b538SAndroid Build Coastguard Worker     SetCrashKeyImplementation(
60*6777b538SAndroid Build Coastguard Worker         std::make_unique<TestCrashKeyImplementation>(data_));
61*6777b538SAndroid Build Coastguard Worker   }
62*6777b538SAndroid Build Coastguard Worker 
~CrashLoggingTest()63*6777b538SAndroid Build Coastguard Worker   ~CrashLoggingTest() override { SetCrashKeyImplementation(nullptr); }
64*6777b538SAndroid Build Coastguard Worker 
data() const65*6777b538SAndroid Build Coastguard Worker   const std::map<std::string, std::string>& data() const { return data_; }
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker  private:
68*6777b538SAndroid Build Coastguard Worker   std::map<std::string, std::string> data_;
69*6777b538SAndroid Build Coastguard Worker };
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker // Should not crash.
TEST(UninitializedCrashLoggingTest,Basic)72*6777b538SAndroid Build Coastguard Worker TEST(UninitializedCrashLoggingTest, Basic) {
73*6777b538SAndroid Build Coastguard Worker   static auto* crash_key = AllocateCrashKeyString("test", CrashKeySize::Size32);
74*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(crash_key);
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   SetCrashKeyString(crash_key, "value");
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   ClearCrashKeyString(crash_key);
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker 
TEST_F(CrashLoggingTest,Basic)81*6777b538SAndroid Build Coastguard Worker TEST_F(CrashLoggingTest, Basic) {
82*6777b538SAndroid Build Coastguard Worker   static auto* crash_key = AllocateCrashKeyString("test", CrashKeySize::Size32);
83*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(crash_key);
84*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(data(), IsEmpty());
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   SetCrashKeyString(crash_key, "value");
87*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(data(), ElementsAre(Pair("test", "value")));
88*6777b538SAndroid Build Coastguard Worker   std::ostringstream stream;
89*6777b538SAndroid Build Coastguard Worker   OutputCrashKeysToStream(stream);
90*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Got 1 crash keys.", stream.str());
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   ClearCrashKeyString(crash_key);
93*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(data(), IsEmpty());
94*6777b538SAndroid Build Coastguard Worker   std::ostringstream stream2;
95*6777b538SAndroid Build Coastguard Worker   OutputCrashKeysToStream(stream2);
96*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Got 0 crash keys.", stream2.str());
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker // Verify that the macros are properly setting crash keys.
TEST_F(CrashLoggingTest,Macros)100*6777b538SAndroid Build Coastguard Worker TEST_F(CrashLoggingTest, Macros) {
101*6777b538SAndroid Build Coastguard Worker   {
102*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_BOOL("category", "bool-value", false);
103*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-bool-value", "false")));
104*6777b538SAndroid Build Coastguard Worker   }
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   {
107*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_BOOL("category", "bool-value", true);
108*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-bool-value", "true")));
109*6777b538SAndroid Build Coastguard Worker   }
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   {
112*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_NUMBER("category", "float-value", 0.5);
113*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-float-value", "0.5")));
114*6777b538SAndroid Build Coastguard Worker   }
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   {
117*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_NUMBER("category", "int-value", 1);
118*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-int-value", "1")));
119*6777b538SAndroid Build Coastguard Worker   }
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   {
122*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_STRING32("category", "string32-value", "餅");
123*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-string32-value", "餅")));
124*6777b538SAndroid Build Coastguard Worker   }
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   {
127*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_STRING64("category", "string64-value", "餅");
128*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-string64-value", "餅")));
129*6777b538SAndroid Build Coastguard Worker   }
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   {
132*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_STRING256("category", "string256-value", "餅");
133*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-string256-value", "餅")));
134*6777b538SAndroid Build Coastguard Worker   }
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   {
137*6777b538SAndroid Build Coastguard Worker     SCOPED_CRASH_KEY_STRING1024("category", "string1024-value", "餅");
138*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(data(), ElementsAre(Pair("category-string1024-value", "餅")));
139*6777b538SAndroid Build Coastguard Worker   }
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker // Test that the helper macros properly uniqify the internal variable used for
143*6777b538SAndroid Build Coastguard Worker // the scoper.
TEST_F(CrashLoggingTest,MultipleCrashKeysInSameScope)144*6777b538SAndroid Build Coastguard Worker TEST_F(CrashLoggingTest, MultipleCrashKeysInSameScope) {
145*6777b538SAndroid Build Coastguard Worker   SCOPED_CRASH_KEY_BOOL("category", "bool-value", false);
146*6777b538SAndroid Build Coastguard Worker   SCOPED_CRASH_KEY_NUMBER("category", "int-value", 1);
147*6777b538SAndroid Build Coastguard Worker 
148*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(data(), ElementsAre(Pair("category-bool-value", "false"),
149*6777b538SAndroid Build Coastguard Worker                                   Pair("category-int-value", "1")));
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker   std::ostringstream stream;
152*6777b538SAndroid Build Coastguard Worker   OutputCrashKeysToStream(stream);
153*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Got 2 crash keys.", stream.str());
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker }  // namespace debug
157*6777b538SAndroid Build Coastguard Worker }  // namespace base
158