Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: chrome/browser/safe_browsing/permission_reporter_browsertest.cc

Issue 2164513002: Add browsertest for permission action reporting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@add-hooks-to-permission-layer2
Patch Set: fix test due to rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 "chrome/browser/safe_browsing/permission_reporter.h"
6
7 #include "base/command_line.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/test/simple_test_clock.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/safe_browsing/ping_manager.h"
13 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/common/safe_browsing/permission_report.pb.h"
17 #include "chrome/test/base/in_process_browser_test.h"
18 #include "chrome/test/base/ui_test_utils.h"
19 #include "content/public/browser/browser_thread.h"
20 #include "net/url_request/report_sender.h"
21
22 #if !defined(OS_ANDROID)
kcarattini 2016/07/20 03:59:22 With all these directives it might make sense to h
stefanocs 2016/07/20 04:47:26 I think there would be too much intersecting code
23 #include "chrome/browser/permissions/permission_request_manager.h"
24 #include "chrome/browser/ui/tabs/tab_strip_model.h"
25 #include "chrome/browser/ui/website_settings/mock_permission_bubble_factory.h"
26 #endif
27
28 #if !defined(OS_CHROMEOS)
29 #include "chrome/browser/signin/signin_manager_factory.h"
30 #include "components/signin/core/browser/signin_manager.h"
31 #endif
32
33 namespace safe_browsing {
34
35 namespace {
36 #if !defined(OS_CHROMEOS)
37 constexpr char kTestingGaiaId[] = "gaia_id";
38 constexpr char kTestingUsername[] = "fake_username";
raymes 2016/07/25 04:31:40 nit: just move these down to the place where they
stefanocs 2016/07/25 12:44:05 Done.
39 #endif
40
41 // A mock ReportSender that keeps track of the last report sent.
42 class MockReportSender : public net::ReportSender {
raymes 2016/07/25 04:31:40 Can we factor this out into a separate file? It lo
stefanocs 2016/07/25 12:44:05 Where would be an appropriate place for this? net/
raymes 2016/07/26 00:45:02 chrome/browser/safe_browsing/ should be fine
stefanocs 2016/07/26 01:48:58 Done.
43 public:
44 MockReportSender() : net::ReportSender(nullptr, DO_NOT_SEND_COOKIES) {
45 number_of_reports_sent_ = 0;
46 }
47
48 ~MockReportSender() override {}
49
50 void Send(const GURL& report_uri, const std::string& report) override {
51 number_of_reports_sent_++;
52 latest_report_uri_ = report_uri;
53 latest_report_ = report;
54 }
55
56 int number_of_reports_sent() { return number_of_reports_sent_; }
57
58 const GURL& latest_report_uri() { return latest_report_uri_; }
59
60 const std::string& latest_report() { return latest_report_; }
61
62 private:
63 int number_of_reports_sent_;
64 GURL latest_report_uri_;
65 std::string latest_report_;
66
67 DISALLOW_COPY_AND_ASSIGN(MockReportSender);
68 };
69
70 } // namespace
71
72 class PermissionReporterBrowserTest : public InProcessBrowserTest {
raymes 2016/07/25 04:31:40 Can we have a base class PermissionReporterBrowser
stefanocs 2016/07/25 12:44:05 Done.
73 protected:
74 PermissionReporterBrowserTest() = default;
75 ~PermissionReporterBrowserTest() override = default;
raymes 2016/07/25 04:31:40 nit: are these actually needed?
stefanocs 2016/07/25 12:44:05 Done.
76
77 void SetUpOnMainThread() override {
78 InProcessBrowserTest::SetUpOnMainThread();
79
80 mock_report_sender_ = new MockReportSender;
raymes 2016/07/25 04:31:40 nit: perhaps create this in AttachMockReportSender
stefanocs 2016/07/25 12:44:05 Done.
81
82 base::RunLoop run_loop;
83 content::BrowserThread::PostTaskAndReply(
84 content::BrowserThread::IO, FROM_HERE,
85 base::Bind(
86 &PermissionReporterBrowserTest::AttachMockReportSenderOnIOThread,
87 this,
88 make_scoped_refptr(g_browser_process->safe_browsing_service())),
89 run_loop.QuitClosure());
90 run_loop.Run();
91
92 #if !defined(OS_ANDROID)
93 PermissionRequestManager* manager = GetPermissionRequestManager();
94 mock_permission_bubble_factory_.reset(
95 new MockPermissionBubbleFactory(manager));
96 manager->DisplayPendingRequests();
97 #else
98 InfoBarService::CreateForWebContents(
99 browser()->tab_strip_model()->GetActiveWebContents());
raymes 2016/07/25 04:31:40 Is this actually needed? I see it only in unittest
stefanocs 2016/07/25 12:44:05 I'm not sure. Actually I haven't tested this on An
100 #endif
101
102 #if !defined(OS_CHROMEOS)
103 SigninManager* signin_manager =
104 SigninManagerFactory::GetForProfile(browser()->profile());
105 signin_manager->SetAuthenticatedAccountInfo(kTestingGaiaId,
106 kTestingUsername);
107 #endif
108 }
109
110 void TearDownOnMainThread() override {
111 InProcessBrowserTest::TearDownOnMainThread();
112 #if !defined(OS_ANDROID)
113 mock_permission_bubble_factory_.reset();
114 #endif
115 }
116
117 void AttachMockReportSenderOnIOThread(
118 scoped_refptr<SafeBrowsingService> safe_browsing_service) {
119 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
120
121 safe_browsing_service->ping_manager()->permission_reporter_.reset(
122 new PermissionReporter(base::WrapUnique(mock_report_sender_),
123 base::WrapUnique(new base::SimpleTestClock)));
124 }
125
126 void SetUpCommandLine(base::CommandLine* command_line) override {
raymes 2016/07/25 04:31:40 nit: move this up closer to TearDown
stefanocs 2016/07/25 12:44:05 Done.
127 command_line->AppendSwitch(switches::kEnablePermissionActionReporting);
128 }
129
130 #if !defined(OS_ANDROID)
131 PermissionRequestManager* GetPermissionRequestManager() {
132 return PermissionRequestManager::FromWebContents(
133 browser()->tab_strip_model()->GetActiveWebContents());
134 }
135
136 MockPermissionBubbleFactory* bubble_factory() {
137 return mock_permission_bubble_factory_.get();
138 }
139 #else
140 InfoBarService* GetInfobarService() {
141 return InfoBarService::FromWebContents(
142 browser()->tab_strip_model()->GetActiveWebContents());
143 }
144 #endif
145
146 void AcceptRequest() {
147 #if !defined(OS_ANDROID)
148 GetPermissionRequestManager()->Accept();
149 #else
150 infobars::InfoBar* infobar = GetInfobarService()->infobar_at(
151 GetInfobarService()->GetActiveEntryID());
152 ConfirmInfoBarDelegate* infobar_delegate =
153 infobar->delegate()->AsConfirmInfoBarDelegate();
154 infobar_delegate->Accept();
155 #endif
156 }
157
158 MockReportSender* mock_report_sender() { return mock_report_sender_; }
159
160 private:
161 #if !defined(OS_ANDROID)
162 std::unique_ptr<MockPermissionBubbleFactory> mock_permission_bubble_factory_;
163 #endif
164
165 // Owned by permission reporter.
166 MockReportSender* mock_report_sender_;
167 };
168
169 // Test that permission action report will be sent if the user is opted into it.
170 IN_PROC_BROWSER_TEST_F(PermissionReporterBrowserTest,
171 PermissionActionReporting) {
raymes 2016/07/25 04:31:40 We can have separate tests for android/desktop. A
stefanocs 2016/07/25 12:44:05 Done.
172 ASSERT_TRUE(embedded_test_server()->Start());
173
174 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
175 browser(), embedded_test_server()->GetURL("/permissions/request.html"),
176 1);
177
178 #if !defined(OS_ANDROID)
179 bubble_factory()->WaitForPermissionBubble();
180 EXPECT_TRUE(bubble_factory()->is_visible());
181 #else
182 EXPECT_EQ(1U, GetInfobarService()->infobar_count());
183 #endif
184
185 AcceptRequest();
186
187 #if !defined(OS_ANDROID)
188 EXPECT_FALSE(bubble_factory()->is_visible());
189 #else
190 EXPECT_EQ(0U, GetInfobarService()->infobar_count());
191 #endif
192
193 EXPECT_EQ(1, mock_report_sender()->number_of_reports_sent());
194
195 PermissionReport permission_report;
196 ASSERT_TRUE(
197 permission_report.ParseFromString(mock_report_sender()->latest_report()));
198 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission());
199 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action());
200 EXPECT_EQ(embedded_test_server()->base_url().spec(),
201 permission_report.origin());
202 #if defined(OS_ANDROID)
203 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM,
204 permission_report.platform_type());
205 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \
206 defined(OS_LINUX)
207 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM,
208 permission_report.platform_type());
209 #endif
210 }
211
212 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « chrome/browser/safe_browsing/permission_reporter.h ('k') | chrome/browser/safe_browsing/ping_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698