#include "chrome/browser/error_reporting/chrome_js_error_report_processor.h"
#include <memory>
#include <utility>
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/run_loop.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/simple_test_clock.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/crash_upload_list/crash_upload_list.h"
#include "chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/testing_profile.h"
#include "components/crash/content/browser/error_reporting/javascript_error_report.h"
#include "components/crash/content/browser/error_reporting/mock_crash_endpoint.h"
#include "components/crash/core/app/crashpad.h"
#include "components/upload_list/upload_list.h"
#include "content/public/test/browser_task_environment.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/text/bytes_formatting.h"
AllOf;
EndsWith;
HasSubstr;
SizeIs;
StartsWith;
JavaScriptErrorReport MakeErrorReport(const std::string& message) { … }
std::string JoinStringPairs(const base::StringPairs& pairs) { … }
class ChromeJsErrorReportProcessorTest : public ::testing::Test { … };
constexpr time_t ChromeJsErrorReportProcessorTest::kFakeNow;
constexpr char ChromeJsErrorReportProcessorTest::kFirstMessage[];
constexpr char ChromeJsErrorReportProcessorTest::kFirstMessageQuery[];
constexpr char ChromeJsErrorReportProcessorTest::kSecondMessage[];
constexpr char ChromeJsErrorReportProcessorTest::kSecondMessageQuery[];
constexpr char ChromeJsErrorReportProcessorTest::kThirdMessage[];
constexpr char ChromeJsErrorReportProcessorTest::kThirdMessageQuery[];
constexpr char ChromeJsErrorReportProcessorTest::kProduct[];
constexpr char ChromeJsErrorReportProcessorTest::kSecondProduct[];
TEST_F(ChromeJsErrorReportProcessorTest, Basic) { … }
void ChromeJsErrorReportProcessorTest::TestAllFields() { … }
TEST_F(ChromeJsErrorReportProcessorTest, AllFields) { … }
#if !BUILDFLAG(IS_CHROMEOS)
TEST_F(ChromeJsErrorReportProcessorTest, NoConsent) { … }
#endif
TEST_F(ChromeJsErrorReportProcessorTest, StackTraceWithErrorMessage) { … }
TEST_F(ChromeJsErrorReportProcessorTest, RedactMessage) { … }
TEST_F(ChromeJsErrorReportProcessorTest, TruncateMessage) { … }
TEST_F(ChromeJsErrorReportProcessorTest, TruncateMessageWithEscapes) { … }
TEST_F(ChromeJsErrorReportProcessorTest, NoMoreThanOneDuplicatePerHour) { … }
TEST_F(ChromeJsErrorReportProcessorTest, MultipleDistinctReportsAllowed) { … }
TEST_F(ChromeJsErrorReportProcessorTest, DuplicatesAllowedAfterAnHour) { … }
TEST_F(ChromeJsErrorReportProcessorTest, DuplicateTimingIsIndependent) { … }
TEST_F(ChromeJsErrorReportProcessorTest,
BackwardsClockResetsAllDuplicateBlocks) { … }
TEST_F(ChromeJsErrorReportProcessorTest,
BackwardsClockResetsSomeDuplicateBlocks) { … }
TEST_F(ChromeJsErrorReportProcessorTest, DuplicateMapIsCleanedUpAfterAnHour) { … }
TEST_F(ChromeJsErrorReportProcessorTest, DifferentProductsAreDistinct) { … }
TEST_F(ChromeJsErrorReportProcessorTest, DifferentLineNumbersAreDistinct) { … }
TEST_F(ChromeJsErrorReportProcessorTest, DifferentColumnNumbersAreDistinct) { … }
#if !BUILDFLAG(IS_CHROMEOS)
static std::string UploadInfoStateToString(
UploadList::UploadInfo::State state) { … }
static std::string UploadInfoVectorToString(
const std::vector<const UploadList::UploadInfo*>& uploads) { … }
TEST_F(ChromeJsErrorReportProcessorTest, UpdatesUploadsLog) { … }
#endif
#if BUILDFLAG(IS_CHROMEOS)
TEST_F(ChromeJsErrorReportProcessorTest, WorksWithoutMemfdCreate) {
processor_->set_force_non_memfd_for_test();
TestAllFields();
}
#endif