[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:

committed by
Chromium LUCI CQ

parent
2e8d0cb5eb
commit
2d1f912b31
@ -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());
|
||||
|
Reference in New Issue
Block a user