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