| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | 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 "base/debug/crash_logging.h" | 
|  | 6 | 
|  | 7 #include <map> | 
|  | 8 #include <string> | 
|  | 9 | 
|  | 10 #include "testing/gtest/include/gtest/gtest.h" | 
|  | 11 | 
|  | 12 namespace { | 
|  | 13 | 
|  | 14 std::map<std::string, std::string>* key_values_ = NULL; | 
|  | 15 | 
|  | 16 std::vector<std::string>* init_keys_ = NULL; | 
|  | 17 | 
|  | 18 }  // namespace | 
|  | 19 | 
|  | 20 class CrashLoggingTest : public testing::Test { | 
|  | 21  public: | 
|  | 22   virtual void SetUp() { | 
|  | 23     base::debug::SetCrashKeyReportingFunctions( | 
|  | 24         &CrashLoggingTest::SetKeyValue, | 
|  | 25         &CrashLoggingTest::ClearKeyValue); | 
|  | 26     key_values_ = new std::map<std::string, std::string>; | 
|  | 27   } | 
|  | 28 | 
|  | 29   virtual void TearDown() { | 
|  | 30     base::debug::ResetCrashLoggingForTesting(); | 
|  | 31 | 
|  | 32     delete key_values_; | 
|  | 33     key_values_ = NULL; | 
|  | 34 | 
|  | 35     delete init_keys_; | 
|  | 36     init_keys_ = NULL; | 
|  | 37   } | 
|  | 38 | 
|  | 39   static void InitFunc(const std::vector<std::string>& keys) { | 
|  | 40     init_keys_ = new std::vector<std::string>(keys); | 
|  | 41   } | 
|  | 42 | 
|  | 43  private: | 
|  | 44   static void SetKeyValue(const base::StringPiece& key, | 
|  | 45                           const base::StringPiece& value) { | 
|  | 46     (*key_values_)[key.as_string()] = value.as_string(); | 
|  | 47   } | 
|  | 48 | 
|  | 49   static void ClearKeyValue(const base::StringPiece& key) { | 
|  | 50     key_values_->erase(key.as_string()); | 
|  | 51   } | 
|  | 52 }; | 
|  | 53 | 
|  | 54 TEST_F(CrashLoggingTest, SetClearSingle) { | 
|  | 55   const char* kTestKey = "test-key"; | 
|  | 56   base::debug::CrashKey keys[1] = { { kTestKey, 1, 255 } }; | 
|  | 57   base::debug::InitCrashKeys(keys, 1, NULL); | 
|  | 58 | 
|  | 59   base::debug::SetCrashKeyValue(kTestKey, "value"); | 
|  | 60   EXPECT_EQ("value", (*key_values_)[kTestKey]); | 
|  | 61 | 
|  | 62   base::debug::ClearCrashKey(kTestKey); | 
|  | 63   EXPECT_EQ(key_values_->end(), key_values_->find(kTestKey)); | 
|  | 64 } | 
|  | 65 | 
|  | 66 TEST_F(CrashLoggingTest, SetChunked) { | 
|  | 67   const char* kTestKey = "chunky"; | 
|  | 68   const char* kChunk1 = "chunky-1"; | 
|  | 69   const char* kChunk2 = "chunky-2"; | 
|  | 70   const char* kChunk3 = "chunky-3"; | 
|  | 71   base::debug::CrashKey keys[] = { { kTestKey, 3, 5 } }; | 
|  | 72   base::debug::InitCrashKeys(keys, arraysize(keys), NULL); | 
|  | 73 | 
|  | 74   std::map<std::string, std::string>& values = *key_values_; | 
|  | 75 | 
|  | 76   // Fill only the first chunk. | 
|  | 77   base::debug::SetCrashKeyValue(kTestKey, "foo"); | 
|  | 78   EXPECT_EQ(1u, values.size()); | 
|  | 79   EXPECT_EQ("foo", values[kChunk1]); | 
|  | 80   EXPECT_EQ(values.end(), values.find(kChunk2)); | 
|  | 81   EXPECT_EQ(values.end(), values.find(kChunk3)); | 
|  | 82 | 
|  | 83   // Fill all three chunks with truncation. | 
|  | 84   base::debug::SetCrashKeyValue(kTestKey, "five four three two"); | 
|  | 85   EXPECT_EQ(3u, values.size()); | 
|  | 86   EXPECT_EQ("five ", values[kChunk1]); | 
|  | 87   EXPECT_EQ("four ", values[kChunk2]); | 
|  | 88   EXPECT_EQ("three", values[kChunk3]); | 
|  | 89 | 
|  | 90   // Fill only two chunks. | 
|  | 91   base::debug::SetCrashKeyValue(kTestKey, "allays"); | 
|  | 92   EXPECT_EQ(2u, values.size()); | 
|  | 93   EXPECT_EQ("allay", values[kChunk1]); | 
|  | 94   EXPECT_EQ("s", values[kChunk2]); | 
|  | 95   EXPECT_EQ(values.end(), values.find(kChunk3)); | 
|  | 96 | 
|  | 97   // Clear everything. | 
|  | 98   base::debug::ClearCrashKey(kTestKey); | 
|  | 99   EXPECT_EQ(0u, values.size()); | 
|  | 100   EXPECT_EQ(values.end(), values.find(kChunk1)); | 
|  | 101   EXPECT_EQ(values.end(), values.find(kChunk2)); | 
|  | 102   EXPECT_EQ(values.end(), values.find(kChunk3)); | 
|  | 103 } | 
|  | 104 | 
|  | 105 TEST_F(CrashLoggingTest, ScopedCrashKey) { | 
|  | 106   const char* kTestKey = "test-key"; | 
|  | 107   base::debug::CrashKey keys[] = { { kTestKey, 1, 255 } }; | 
|  | 108   base::debug::InitCrashKeys(keys, arraysize(keys), NULL); | 
|  | 109 | 
|  | 110   EXPECT_EQ(key_values_->end(), key_values_->find(kTestKey)); | 
|  | 111   { | 
|  | 112     base::debug::ScopedCrashKey scoped_crash_key(kTestKey, "value"); | 
|  | 113     EXPECT_EQ("value", (*key_values_)[kTestKey]); | 
|  | 114   } | 
|  | 115   EXPECT_EQ(key_values_->end(), key_values_->find(kTestKey)); | 
|  | 116 } | 
|  | 117 | 
|  | 118 TEST_F(CrashLoggingTest, InitFuncKeys) { | 
|  | 119   base::debug::CrashKey keys[] = { | 
|  | 120     { "chunked-3", 3, 255 }, | 
|  | 121     { "single", 1, 10 }, | 
|  | 122     { "chunked-6", 6, 200 }, | 
|  | 123   }; | 
|  | 124   base::debug::InitCrashKeys(keys, arraysize(keys), | 
|  | 125       &CrashLoggingTest::InitFunc); | 
|  | 126 | 
|  | 127   ASSERT_TRUE(init_keys_); | 
|  | 128   const std::vector<std::string>& key_names = *init_keys_; | 
|  | 129 | 
|  | 130   ASSERT_EQ(10u, key_names.size()); | 
|  | 131   EXPECT_EQ("chunked-3-1", key_names[0]); | 
|  | 132   EXPECT_EQ("chunked-3-2", key_names[1]); | 
|  | 133   EXPECT_EQ("chunked-3-3", key_names[2]); | 
|  | 134   EXPECT_EQ("single", key_names[3]); | 
|  | 135   EXPECT_EQ("chunked-6-1", key_names[4]); | 
|  | 136   EXPECT_EQ("chunked-6-2", key_names[5]); | 
|  | 137   EXPECT_EQ("chunked-6-3", key_names[6]); | 
|  | 138   EXPECT_EQ("chunked-6-4", key_names[7]); | 
|  | 139   EXPECT_EQ("chunked-6-5", key_names[8]); | 
|  | 140   EXPECT_EQ("chunked-6-6", key_names[9]); | 
|  | 141 | 
|  | 142   EXPECT_TRUE(base::debug::LookupCrashKey("chunked-3")); | 
|  | 143   EXPECT_TRUE(base::debug::LookupCrashKey("single")); | 
|  | 144   EXPECT_TRUE(base::debug::LookupCrashKey("chunked-6")); | 
|  | 145   EXPECT_FALSE(base::debug::LookupCrashKey("chunked-6-4")); | 
|  | 146 } | 
|  | 147 | 
|  | 148 TEST_F(CrashLoggingTest, ChunkValue) { | 
|  | 149   using base::debug::ChunkCrashKeyValue; | 
|  | 150 | 
|  | 151   // Test truncation. | 
|  | 152   base::debug::CrashKey key = { "chunky", 1, 10 }; | 
|  | 153   std::vector<std::string> results = ChunkCrashKeyValue(key, "hello world"); | 
|  | 154   ASSERT_EQ(1u, results.size()); | 
|  | 155   EXPECT_EQ("hello worl", results[0]); | 
|  | 156 | 
|  | 157   // Test short string. | 
|  | 158   results = ChunkCrashKeyValue(key, "hi"); | 
|  | 159   ASSERT_EQ(1u, results.size()); | 
|  | 160   EXPECT_EQ("hi", results[0]); | 
|  | 161 | 
|  | 162   // Test chunk pair. | 
|  | 163   key.num_chunks = 2; | 
|  | 164   key.max_length = 3; | 
|  | 165   results = ChunkCrashKeyValue(key, "foobar"); | 
|  | 166   ASSERT_EQ(2u, results.size()); | 
|  | 167   EXPECT_EQ("foo", results[0]); | 
|  | 168   EXPECT_EQ("bar", results[1]); | 
|  | 169 | 
|  | 170   // Test chunk pair truncation. | 
|  | 171   results = ChunkCrashKeyValue(key, "foobared"); | 
|  | 172   ASSERT_EQ(2u, results.size()); | 
|  | 173   EXPECT_EQ("foo", results[0]); | 
|  | 174   EXPECT_EQ("bar", results[1]); | 
|  | 175 | 
|  | 176   // Test extra chunks. | 
|  | 177   key.num_chunks = 100; | 
|  | 178   results = ChunkCrashKeyValue(key, "hello world"); | 
|  | 179   ASSERT_EQ(4u, results.size()); | 
|  | 180   EXPECT_EQ("hel", results[0]); | 
|  | 181   EXPECT_EQ("lo ", results[1]); | 
|  | 182   EXPECT_EQ("wor", results[2]); | 
|  | 183   EXPECT_EQ("ld",  results[3]); | 
|  | 184 } | 
| OLD | NEW | 
|---|