blob: 603cc36c8b3028af11a774a6ccf01f5c6a94020d [file] [log] [blame]
// Copyright 2013 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 "components/crash/core/common/crash_keys.h"
#include <string>
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/debug/crash_logging.h"
#include "base/format_macros.h"
#include "base/strings/string_piece.h"
#include "base/strings/stringprintf.h"
#include "components/crash/core/common/crash_key.h"
#include "testing/gtest/include/gtest/gtest.h"
using crash_reporter::GetCrashKeyValue;
// The number of switch-N keys declared in SetSwitchesFromCommandLine().
constexpr int kSwitchesMaxCount = 15;
class CrashKeysTest : public testing::Test {
public:
void SetUp() override {
ResetData();
crash_reporter::InitializeCrashKeys();
}
void TearDown() override {
ResetData();
}
private:
void ResetData() {
crash_keys::ResetCommandLineForTesting();
crash_reporter::ResetCrashKeysForTesting();
}
};
TEST_F(CrashKeysTest, Switches) {
// Set three switches.
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
for (size_t i = 1; i <= 3; ++i)
command_line.AppendSwitch(base::StringPrintf("--flag-%" PRIuS, i));
crash_keys::SetSwitchesFromCommandLine(command_line, nullptr);
EXPECT_EQ("--flag-1", GetCrashKeyValue("switch-1"));
EXPECT_EQ("--flag-2", GetCrashKeyValue("switch-2"));
EXPECT_EQ("--flag-3", GetCrashKeyValue("switch-3"));
EXPECT_TRUE(GetCrashKeyValue("switch-4").empty());
}
// Set more than 15 switches.
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
const size_t kMax = kSwitchesMaxCount + 2;
EXPECT_GT(kMax, static_cast<size_t>(15));
for (size_t i = 1; i <= kMax; ++i)
command_line.AppendSwitch(base::StringPrintf("--many-%" PRIuS, i));
crash_keys::SetSwitchesFromCommandLine(command_line, nullptr);
EXPECT_EQ("--many-1", GetCrashKeyValue("switch-1"));
EXPECT_EQ("--many-9", GetCrashKeyValue("switch-9"));
EXPECT_EQ("--many-15", GetCrashKeyValue("switch-15"));
EXPECT_FALSE(GetCrashKeyValue("switch-16").empty());
EXPECT_FALSE(GetCrashKeyValue("switch-17").empty());
}
// Set fewer to ensure that old ones are erased.
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
for (int i = 1; i <= 5; ++i)
command_line.AppendSwitch(base::StringPrintf("--fewer-%d", i));
crash_keys::SetSwitchesFromCommandLine(command_line, nullptr);
EXPECT_EQ("--fewer-1", GetCrashKeyValue("switch-1"));
EXPECT_EQ("--fewer-2", GetCrashKeyValue("switch-2"));
EXPECT_EQ("--fewer-3", GetCrashKeyValue("switch-3"));
EXPECT_EQ("--fewer-4", GetCrashKeyValue("switch-4"));
EXPECT_EQ("--fewer-5", GetCrashKeyValue("switch-5"));
for (int i = 6; i < 20; ++i)
EXPECT_TRUE(GetCrashKeyValue(base::StringPrintf("switch-%d", i)).empty());
}
}
namespace {
bool IsBoringFlag(const std::string& flag) {
return flag.compare("--boring") == 0;
}
} // namespace
TEST_F(CrashKeysTest, FilterFlags) {
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
command_line.AppendSwitch("--not-boring-1");
command_line.AppendSwitch("--boring");
// Include the max number of non-boring switches, to make sure that only the
// switches actually included in the crash keys are counted.
for (size_t i = 2; i <= kSwitchesMaxCount; ++i)
command_line.AppendSwitch(base::StringPrintf("--not-boring-%" PRIuS, i));
crash_keys::SetSwitchesFromCommandLine(command_line, &IsBoringFlag);
// If the boring keys are filtered out, every single key should now be
// not-boring.
for (int i = 1; i <= kSwitchesMaxCount; ++i) {
std::string switch_name = base::StringPrintf("switch-%d", i);
std::string switch_value = base::StringPrintf("--not-boring-%d", i);
EXPECT_EQ(switch_value, GetCrashKeyValue(switch_name))
<< "switch_name is " << switch_name;
}
}