| // 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 <memory> |
| |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/functional/bind.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<network::SharedURLLoaderFactory> 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<std::string> 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<network::WeakWrapperSharedURLLoaderFactory>( |
| &test_url_loader_factory_)) { |
| EXPECT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
| uploader_ = std::make_unique<MockUploader>( |
| /*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<feedback::FeedbackUploader> wkptr_uploader = |
| base::AsWeakPtr(uploader_.get()); |
| data_ = |
| base::MakeRefCounted<FeedbackData>(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<base::RunLoop>(); |
| 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<base::RunLoop> run_loop_; |
| base::ScopedTempDir scoped_temp_dir_; |
| network::TestURLLoaderFactory test_url_loader_factory_; |
| scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; |
| std::unique_ptr<MockUploader> uploader_; |
| scoped_refptr<FeedbackData> 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 |