0

[Crash Uploader] Add switch to specify crash report product name

Add an option to specify crash report product name for the
crash_uploader binary. If not specified, will default to to use the
original name "Eureka".

Bug: 388822383
Test: build on eureka, on-device crash test
Change-Id: I2b838857ffc1258996cd7a6dff8c00c3a0de89e9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6490511
Commit-Queue: Jason Huang <hijason@google.com>
Reviewed-by: Shawn Quereshi <shawnq@google.com>
Reviewed-by: Yuchen Liu <yucliu@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1453045}
This commit is contained in:
Jason Huang
2025-04-28 18:47:45 -07:00
committed by Chromium LUCI CQ
parent 2e8d0cb5eb
commit 2d1f912b31
6 changed files with 40 additions and 16 deletions

@ -24,6 +24,10 @@ const char kCrashServerUrl[] = "crash-server-url";
// Switch to enable daemon-mode in crash_uploader.
const char kCrashUploaderDaemon[] = "daemon";
// Switch to specify product name used when crash_uploader uploads crash report.
// Default to "Eureka" if not specified.
const char kCrashReportProductName[] = "product-name";
// Switch to disable Crash reporting
const char kDisableCrashReporter[] = "disable-crash-reporter";

@ -19,6 +19,7 @@ extern const char kSwitchValueFalse[];
// Switches for crash_uploader
extern const char kCrashServerUrl[];
extern const char kCrashUploaderDaemon[];
extern const char kCrashReportProductName[];
// Disable Crash Reporting
extern const char kDisableCrashReporter[];

@ -5,6 +5,7 @@
#include <sys/resource.h>
#include <memory>
#include <string>
#include <utility>
#include "base/at_exit.h"
@ -60,7 +61,11 @@ int main(int argc, char** argv) {
chromecast::GetSwitchValueBoolean(switches::kCrashUploaderDaemon, false);
LOG_IF(INFO, daemon) << "Running crash uploader in daemon-mode";
chromecast::MinidumpUploader uploader(sys_info.get(), server_url);
std::string crash_report_product_name(
command_line->GetSwitchValueASCII(switches::kCrashReportProductName));
chromecast::MinidumpUploader uploader(sys_info.get(), server_url,
crash_report_product_name);
do {
if (!uploader.UploadAllMinidumps())
LOG(ERROR) << "Failed to process minidumps";

@ -72,6 +72,7 @@ bool IsDumpObsolete(const DumpInfo& dump) {
MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
const std::string& server_url,
const std::string& crash_report_product_name,
CastCrashdumpUploader* const uploader,
PrefServiceGeneratorCallback callback)
: release_channel_(sys_info->GetSystemReleaseChannel()),
@ -83,15 +84,20 @@ MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
system_version_(sys_info->GetSystemBuildNumber()),
upload_location_(!server_url.empty() ? server_url
: kCrashServerProduction),
crash_report_product_name_(!crash_report_product_name.empty()
? crash_report_product_name
: kProductName),
reboot_scheduled_(false),
filestate_initialized_(false),
uploader_(uploader),
pref_service_generator_(std::move(callback)) {}
MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
const std::string& server_url)
const std::string& server_url,
const std::string& crash_report_product_name)
: MinidumpUploader(sys_info,
server_url,
crash_report_product_name,
nullptr,
base::BindRepeating(&CreatePrefService)) {}
@ -215,7 +221,7 @@ bool MinidumpUploader::DoWork() {
// attempt to upload
LOG(INFO) << "Uploading crash to " << upload_location_;
CastCrashdumpData crashdump_data;
crashdump_data.product = kProductName;
crashdump_data.product = crash_report_product_name_;
crashdump_data.version = GetVersionString(
dump.params().cast_release_version, dump.params().cast_build_number);
crashdump_data.guid = client_id;

@ -25,9 +25,12 @@ class MinidumpUploader : public SynchronizedMinidumpManager {
base::RepeatingCallback<std::unique_ptr<PrefService>()>;
// If |server_url| is empty, a default server url will be chosen.
MinidumpUploader(CastSysInfo* sys_info, const std::string& server_url);
MinidumpUploader(CastSysInfo* sys_info,
const std::string& server_url,
const std::string& crash_report_product_name);
MinidumpUploader(CastSysInfo* sys_info,
const std::string& server_url,
const std::string& crash_report_product_name,
CastCrashdumpUploader* const uploader,
PrefServiceGeneratorCallback callback);
@ -58,6 +61,11 @@ class MinidumpUploader : public SynchronizedMinidumpManager {
const std::string system_version_;
const std::string upload_location_;
// Not to be confused with |product_name_|, which is set to the real product
// name for the crash report, |crash_report_product_name_| should be set to
// the expected "product_name" field on go/crash to query the crash report,
// e.g. "Eureka".
const std::string crash_report_product_name_;
// Whether or not a reboot should be scheduled.
bool reboot_scheduled_;

@ -158,7 +158,7 @@ TEST_F(MinidumpUploaderTest, AvoidsLockingWithoutDumps) {
private:
MinidumpUploader* const minidump_uploader_;
};
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Will lock for the first run to initialize file state.
ASSERT_TRUE(uploader.UploadAllMinidumps());
@ -173,7 +173,7 @@ TEST_F(MinidumpUploaderTest, RemovesDumpsWithoutOptIn) {
// Write a dump info entry.
GenerateDumpWithFiles(minidump_path, logfile_path);
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, false));
// MinidumpUploader should not call upon CastCrashdumpUploader.
@ -195,7 +195,7 @@ TEST_F(MinidumpUploaderTest, SavesDumpInfoWithUploadFailure) {
// Write one entry with appropriate files.
std::unique_ptr<DumpInfo> dump(
GenerateDumpWithFiles(minidump_path, logfile_path));
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Induce an upload failure.
@ -227,7 +227,7 @@ TEST_F(MinidumpUploaderTest, SavesRemainingDumpInfoWithMidwayUploadFailure) {
GenerateDumpWithFiles(minidump_path2, logfile_path2));
{
MinidumpUploader uploader(
&sys_info_dummy(), "", &mock_crash_uploader(),
&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// First allow a successful upload, then induce failure.
@ -257,7 +257,7 @@ TEST_F(MinidumpUploaderTest, SavesRemainingDumpInfoWithMidwayUploadFailure) {
{
MinidumpUploader uploader(
&sys_info_dummy(), "", &mock_crash_uploader(),
&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Finally, upload successfully.
@ -285,7 +285,7 @@ TEST_F(MinidumpUploaderTest, FailsUploadWithMissingMinidumpFile) {
// Write one entry with appropriate files.
GenerateDumpWithFiles(minidump_path, logfile_path);
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// No CastCrashdumpUploader methods should be called.
@ -307,7 +307,7 @@ TEST_F(MinidumpUploaderTest, UploadsWithoutMissingLogFile) {
// Write one entry with appropriate files.
GenerateDumpWithFiles(minidump_path, logfile_path);
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Delete logfile, crash uploader should still work as intended.
@ -333,7 +333,7 @@ TEST_F(MinidumpUploaderTest, UploadsWithMultipleAttachments) {
// Write one entry with appropriate files.
GenerateDumpWithFiles(minidump_path, logfile_path, &attachments);
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Allow a successful upload.
@ -377,7 +377,7 @@ TEST_F(MinidumpUploaderTest, DeletesLingeringFiles) {
// Write a real entry.
GenerateDumpWithFiles(minidump_path, logfile_path);
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
EXPECT_CALL(mock_crash_uploader(),
@ -402,7 +402,7 @@ TEST_F(MinidumpUploaderTest, SchedulesRebootWhenRatelimited) {
const base::FilePath& minidump_path = minidump_dir_.Append("ayy");
const base::FilePath& logfile_path = minidump_dir_.Append("lmao");
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Generate max dumps.
for (int i = 0; i < SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps + 1;
@ -433,7 +433,7 @@ TEST_F(MinidumpUploaderTest, SchedulesRebootWhenRatelimited) {
// Generate one dump for a second pass.
GenerateDumpWithFiles(minidump_path, logfile_path);
MinidumpUploader uploader2(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader2(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
// Since a reboot was scheduled, the rate limit was cleared. New uploads
@ -455,7 +455,7 @@ TEST_F(MinidumpUploaderTest, SchedulesRebootWhenRatelimited) {
}
TEST_F(MinidumpUploaderTest, UploadInitializesFileState) {
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
base::BindRepeating(&CreateFakePrefService, true));
ASSERT_TRUE(base::IsDirectoryEmpty(minidump_dir_));
ASSERT_TRUE(uploader.UploadAllMinidumps());