// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/feedback/feedback_data.h" #include #include "base/bind.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "base/test/task_environment.h" #include "components/feedback/feedback_report.h" #include "components/feedback/feedback_uploader.h" #include "components/prefs/testing_pref_service.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace feedback { namespace { constexpr char kHistograms[] = "Histogram Data"; constexpr char kImageData[] = "Image Data"; constexpr char kFileData[] = "File Data"; class MockUploader : public FeedbackUploader { public: MockUploader( bool is_off_the_record, const base::FilePath& state_path, scoped_refptr url_loader_factory, base::OnceClosure on_report_sent) : FeedbackUploader(is_off_the_record, state_path, url_loader_factory), on_report_sent_(std::move(on_report_sent)) {} MockUploader(const MockUploader&) = delete; MockUploader& operator=(const MockUploader&) = delete; // feedback::FeedbackUploader: void StartDispatchingReport() override { std::move(on_report_sent_).Run(); } void QueueReport(std::unique_ptr data, bool has_email) override { report_had_email_ = has_email; called_queue_report_ = true; FeedbackUploader::QueueReport(std::move(data), has_email); } bool called_queue_report() const { return called_queue_report_; } bool report_had_email() const { return report_had_email_; } private: base::OnceClosure on_report_sent_; bool called_queue_report_ = false; bool report_had_email_ = false; }; } // namespace class FeedbackDataTest : public testing::Test { protected: FeedbackDataTest() : test_shared_loader_factory_( base::MakeRefCounted( &test_url_loader_factory_)) { EXPECT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); uploader_ = std::make_unique( /*is_off_the_record=*/false, scoped_temp_dir_.GetPath(), test_shared_loader_factory_, base::BindOnce(&FeedbackDataTest::set_send_report_callback, base::Unretained(this))); base::WeakPtr wkptr_uploader = base::AsWeakPtr(uploader_.get()); data_ = base::MakeRefCounted(std::move(wkptr_uploader), nullptr); } void Send() { bool attached_file_completed = data_->attached_file_uuid().empty(); bool screenshot_completed = data_->screenshot_uuid().empty(); if (screenshot_completed && attached_file_completed) { data_->OnFeedbackPageDataComplete(); } } void RunMessageLoop() { run_loop_ = std::make_unique(); quit_closure_ = run_loop_->QuitClosure(); Send(); run_loop_->Run(); } void set_send_report_callback() { std::move(quit_closure_).Run(); } base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::OnceClosure quit_closure_; std::unique_ptr run_loop_; base::ScopedTempDir scoped_temp_dir_; network::TestURLLoaderFactory test_url_loader_factory_; scoped_refptr test_shared_loader_factory_; std::unique_ptr uploader_; scoped_refptr data_; }; TEST_F(FeedbackDataTest, ReportSending) { data_->SetAndCompressHistograms(kHistograms); data_->set_image(kImageData); data_->AttachAndCompressFileData(kFileData); RunMessageLoop(); EXPECT_EQ(data_->user_email(), ""); EXPECT_TRUE(data_->IsDataComplete()); EXPECT_TRUE(uploader_->called_queue_report()); EXPECT_FALSE(uploader_->report_had_email()); } TEST_F(FeedbackDataTest, ReportSendingWithEmail) { data_->SetAndCompressHistograms(kHistograms); data_->set_image(kImageData); data_->AttachAndCompressFileData(kFileData); data_->set_user_email("foo@bar.com"); RunMessageLoop(); EXPECT_EQ(data_->user_email(), "foo@bar.com"); EXPECT_TRUE(data_->IsDataComplete()); EXPECT_TRUE(uploader_->called_queue_report()); EXPECT_TRUE(uploader_->report_had_email()); } } // namespace feedback