1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/feedback/feedback_data.h"
6
7 #include <memory>
8
9 #include "base/bind.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/run_loop.h"
12 #include "components/feedback/feedback_report.h"
13 #include "components/feedback/feedback_uploader.h"
14 #include "components/feedback/feedback_uploader_factory.h"
15 #include "components/prefs/testing_pref_service.h"
16 #include "content/public/test/browser_task_environment.h"
17 #include "content/public/test/test_browser_context.h"
18 #include "services/network/public/cpp/shared_url_loader_factory.h"
19 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
20 #include "services/network/test/test_url_loader_factory.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 namespace feedback {
24
25 namespace {
26
27 constexpr char kHistograms[] = "Histogram Data";
28 constexpr char kImageData[] = "Image Data";
29 constexpr char kFileData[] = "File Data";
30
31 class MockUploader : public FeedbackUploader {
32 public:
MockUploader(scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,content::BrowserContext * context,base::OnceClosure on_report_sent)33 MockUploader(
34 scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
35 content::BrowserContext* context,
36 base::OnceClosure on_report_sent)
37 : FeedbackUploader(context,
38 FeedbackUploaderFactory::CreateUploaderTaskRunner()),
39 on_report_sent_(std::move(on_report_sent)) {
40 set_url_loader_factory_for_test(url_loader_factory);
41 }
~MockUploader()42 ~MockUploader() override {}
43
44 // feedback::FeedbackUploader:
StartDispatchingReport()45 void StartDispatchingReport() override { std::move(on_report_sent_).Run(); }
46
QueueReport(std::unique_ptr<std::string> data,bool has_email)47 void QueueReport(std::unique_ptr<std::string> data, bool has_email) override {
48 report_had_email_ = has_email;
49 called_queue_report_ = true;
50 FeedbackUploader::QueueReport(std::move(data), has_email);
51 }
52
called_queue_report() const53 bool called_queue_report() const { return called_queue_report_; }
report_had_email() const54 bool report_had_email() const { return report_had_email_; }
55
56 private:
57 base::OnceClosure on_report_sent_;
58 bool called_queue_report_ = false;
59 bool report_had_email_ = false;
60
61 DISALLOW_COPY_AND_ASSIGN(MockUploader);
62 };
63
64 } // namespace
65
66 class FeedbackDataTest : public testing::Test {
67 protected:
FeedbackDataTest()68 FeedbackDataTest()
69 : test_shared_loader_factory_(
70 base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
71 &test_url_loader_factory_)),
72 uploader_(test_shared_loader_factory_,
73 &context_,
74 base::BindOnce(&FeedbackDataTest::set_send_report_callback,
75 base::Unretained(this))),
76 data_(base::MakeRefCounted<FeedbackData>(&uploader_)) {}
77 ~FeedbackDataTest() override = default;
78
Send()79 void Send() {
80 bool attached_file_completed =
81 data_->attached_file_uuid().empty();
82 bool screenshot_completed =
83 data_->screenshot_uuid().empty();
84
85 if (screenshot_completed && attached_file_completed) {
86 data_->OnFeedbackPageDataComplete();
87 }
88 }
89
RunMessageLoop()90 void RunMessageLoop() {
91 run_loop_.reset(new base::RunLoop());
92 quit_closure_ = run_loop_->QuitClosure();
93 run_loop_->Run();
94 }
95
set_send_report_callback()96 void set_send_report_callback() { std::move(quit_closure_).Run(); }
97
98 base::OnceClosure quit_closure_;
99 std::unique_ptr<base::RunLoop> run_loop_;
100 content::BrowserTaskEnvironment task_environment_;
101 network::TestURLLoaderFactory test_url_loader_factory_;
102 scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
103 content::TestBrowserContext context_;
104 MockUploader uploader_;
105 scoped_refptr<FeedbackData> data_;
106 };
107
TEST_F(FeedbackDataTest,ReportSending)108 TEST_F(FeedbackDataTest, ReportSending) {
109 data_->SetAndCompressHistograms(kHistograms);
110 data_->set_image(kImageData);
111 data_->AttachAndCompressFileData(kFileData);
112 Send();
113 RunMessageLoop();
114 EXPECT_EQ(data_->user_email(), "");
115 EXPECT_TRUE(data_->IsDataComplete());
116 EXPECT_TRUE(uploader_.called_queue_report());
117 EXPECT_FALSE(uploader_.report_had_email());
118 }
119
TEST_F(FeedbackDataTest,ReportSendingWithEmail)120 TEST_F(FeedbackDataTest, ReportSendingWithEmail) {
121 data_->SetAndCompressHistograms(kHistograms);
122 data_->set_image(kImageData);
123 data_->AttachAndCompressFileData(kFileData);
124 data_->set_user_email("foo@bar.com");
125 Send();
126 RunMessageLoop();
127 EXPECT_EQ(data_->user_email(), "foo@bar.com");
128 EXPECT_TRUE(data_->IsDataComplete());
129 EXPECT_TRUE(uploader_.called_queue_report());
130 EXPECT_TRUE(uploader_.report_had_email());
131 }
132
133 } // namespace feedback
134