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/autofill/content/renderer/renderer_save_password_progress_logger.h"
6 
7 #include "base/optional.h"
8 #include "base/run_loop.h"
9 #include "base/test/task_environment.h"
10 #include "components/autofill/content/common/mojom/autofill_driver.mojom.h"
11 #include "mojo/public/cpp/bindings/pending_remote.h"
12 #include "mojo/public/cpp/bindings/receiver.h"
13 #include "mojo/public/cpp/bindings/remote.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 namespace autofill {
17 
18 namespace {
19 
20 const char kTestText[] = "test";
21 
22 class FakeContentPasswordManagerDriver : public mojom::PasswordManagerDriver {
23  public:
FakeContentPasswordManagerDriver()24   FakeContentPasswordManagerDriver() : called_record_save_(false) {}
~FakeContentPasswordManagerDriver()25   ~FakeContentPasswordManagerDriver() override {}
26 
27   mojo::PendingRemote<mojom::PasswordManagerDriver>
CreatePendingRemoteAndBind()28   CreatePendingRemoteAndBind() {
29     return receiver_.BindNewPipeAndPassRemote();
30   }
31 
GetLogMessage(std::string * log)32   bool GetLogMessage(std::string* log) {
33     if (!called_record_save_)
34       return false;
35 
36     EXPECT_TRUE(log_);
37     *log = *log_;
38     return true;
39   }
40 
41  private:
42   // autofill::mojom::PasswordManagerDriver:
PasswordFormsParsed(const std::vector<autofill::FormData> & form_data)43   void PasswordFormsParsed(
44       const std::vector<autofill::FormData>& form_data) override {}
45 
PasswordFormsRendered(const std::vector<autofill::FormData> & visible_forms_data,bool did_stop_loading)46   void PasswordFormsRendered(
47       const std::vector<autofill::FormData>& visible_forms_data,
48       bool did_stop_loading) override {}
49 
PasswordFormSubmitted(const autofill::FormData & form_data)50   void PasswordFormSubmitted(const autofill::FormData& form_data) override {}
51 
ShowManualFallbackForSaving(const autofill::FormData & form_data)52   void ShowManualFallbackForSaving(
53       const autofill::FormData& form_data) override {}
54 
HideManualFallbackForSaving()55   void HideManualFallbackForSaving() override {}
56 
SameDocumentNavigation(autofill::mojom::SubmissionIndicatorEvent submission_indication_event)57   void SameDocumentNavigation(autofill::mojom::SubmissionIndicatorEvent
58                                   submission_indication_event) override {}
59 
ShowPasswordSuggestions(base::i18n::TextDirection text_direction,const base::string16 & typed_username,int options,const gfx::RectF & bounds)60   void ShowPasswordSuggestions(base::i18n::TextDirection text_direction,
61                                const base::string16& typed_username,
62                                int options,
63                                const gfx::RectF& bounds) override {}
64 
ShowTouchToFill()65   void ShowTouchToFill() override {}
66 
RecordSavePasswordProgress(const std::string & log)67   void RecordSavePasswordProgress(const std::string& log) override {
68     called_record_save_ = true;
69     log_ = log;
70   }
71 
UserModifiedPasswordField()72   void UserModifiedPasswordField() override {}
73 
UserModifiedNonPasswordField(uint32_t renderer_id,const base::string16 & value)74   void UserModifiedNonPasswordField(uint32_t renderer_id,
75                                     const base::string16& value) override {}
76 
CheckSafeBrowsingReputation(const GURL & form_action,const GURL & frame_url)77   void CheckSafeBrowsingReputation(const GURL& form_action,
78                                    const GURL& frame_url) override {}
79 
FocusedInputChanged(autofill::mojom::FocusedFieldType focused_field_type)80   void FocusedInputChanged(
81       autofill::mojom::FocusedFieldType focused_field_type) override {}
LogFirstFillingResult(uint32_t form_renderer_id,int32_t result)82   void LogFirstFillingResult(uint32_t form_renderer_id,
83                              int32_t result) override {}
84 
85   // Records whether RecordSavePasswordProgress() gets called.
86   bool called_record_save_;
87   // Records data received via RecordSavePasswordProgress() call.
88   base::Optional<std::string> log_;
89 
90   mojo::Receiver<mojom::PasswordManagerDriver> receiver_{this};
91 };
92 
93 class TestLogger : public RendererSavePasswordProgressLogger {
94  public:
TestLogger(mojom::PasswordManagerDriver * driver)95   TestLogger(mojom::PasswordManagerDriver* driver)
96       : RendererSavePasswordProgressLogger(driver) {}
97 
98   using RendererSavePasswordProgressLogger::SendLog;
99 };
100 
101 }  // namespace
102 
TEST(RendererSavePasswordProgressLoggerTest,SendLog)103 TEST(RendererSavePasswordProgressLoggerTest, SendLog) {
104   base::test::SingleThreadTaskEnvironment task_environment;
105   FakeContentPasswordManagerDriver fake_driver;
106   mojo::Remote<mojom::PasswordManagerDriver> driver_remote(
107       fake_driver.CreatePendingRemoteAndBind());
108   TestLogger logger(driver_remote.get());
109   logger.SendLog(kTestText);
110 
111   base::RunLoop().RunUntilIdle();
112   std::string sent_log;
113   EXPECT_TRUE(fake_driver.GetLogMessage(&sent_log));
114   EXPECT_EQ(kTestText, sent_log);
115 }
116 
117 }  // namespace autofill
118