blob: 795e472a1a4ef86971c355d477329661b142ee6e [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2018 The Chromium Authors
Aga Wronskaf14a9322018-09-19 15:44:502// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Rebekah Potter5d34db12023-11-13 21:24:215#include "chrome/browser/ui/webui/about/about_ui.h"
Aga Wronskaf14a9322018-09-19 15:44:506
7#include <memory>
8#include <string>
Helmut Januschkafd2cc202024-04-25 00:53:199#include <string_view>
Aga Wronskaf14a9322018-09-19 15:44:5010
Aga Wronska5a5b7a652018-09-27 00:49:5211#include "base/base64.h"
Rebekah Potter184d9072023-11-14 20:38:1112#include "base/containers/contains.h"
Aga Wronskaf14a9322018-09-19 15:44:5013#include "base/files/file_path.h"
14#include "base/files/file_util.h"
Avi Drissman9269d4ed2023-01-07 01:38:0615#include "base/functional/bind.h"
16#include "base/functional/callback_helpers.h"
Aga Wronskaf14a9322018-09-19 15:44:5017#include "base/memory/ref_counted_memory.h"
Wei-Yin Chen (陳威尹)39f4ff32019-10-22 17:59:0918#include "base/strings/strcat.h"
Aga Wronskaf14a9322018-09-19 15:44:5019#include "base/strings/string_util.h"
Aga Wronskaf14a9322018-09-19 15:44:5020#include "chrome/common/url_constants.h"
21#include "chrome/common/webui_url_constants.h"
22#include "chrome/test/base/scoped_browser_locale.h"
Michael Thiessen2d864d92023-04-06 15:20:5623#include "content/public/browser/browser_thread.h"
Gabriel Charettec7108742019-08-23 03:31:4024#include "content/public/test/browser_task_environment.h"
Aga Wronskaf14a9322018-09-19 15:44:5025#include "testing/gmock/include/gmock/gmock.h"
26#include "testing/gtest/include/gtest/gtest.h"
27
Rebekah Potter184d9072023-11-14 20:38:1128#include "base/files/scoped_temp_dir.h"
29#include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
Rebekah Potter184d9072023-11-14 20:38:1130#include "chrome/browser/ash/login/wizard_controller.h"
Georg Neis3b552b312024-09-12 03:33:5631#include "chrome/browser/ui/ash/login/fake_login_display_host.h"
Rebekah Potter184d9072023-11-14 20:38:1132#include "chrome/browser/ui/webui/ash/login/demo_preferences_screen_handler.h"
33#include "chromeos/ash/components/dbus/dbus_thread_manager.h"
34#include "chromeos/ash/components/system/fake_statistics_provider.h"
35#include "chromeos/ash/components/system/statistics_provider.h"
Miriam Zimmermanff0c0812023-04-27 16:46:2736#include "third_party/zlib/google/compression_utils.h"
Miriam Zimmermanff0c0812023-04-27 16:46:2737
Aga Wronskaf14a9322018-09-19 15:44:5038namespace {
39
40class TestDataReceiver {
41 public:
42 TestDataReceiver() = default;
Peter Boström53c6c5952021-09-17 09:41:2643
44 TestDataReceiver(const TestDataReceiver&) = delete;
45 TestDataReceiver& operator=(const TestDataReceiver&) = delete;
46
Aga Wronskaf14a9322018-09-19 15:44:5047 virtual ~TestDataReceiver() = default;
48
49 bool data_received() const { return data_received_; }
50
51 std::string data() const { return data_; }
52
Aga Wronska5a5b7a652018-09-27 00:49:5253 std::string Base64DecodedData() const {
54 std::string decoded;
55 base::Base64Decode(data_, &decoded);
56 return decoded;
57 }
58
Aga Wronskaf14a9322018-09-19 15:44:5059 void OnDataReceived(scoped_refptr<base::RefCountedMemory> bytes) {
60 data_received_ = true;
Helmut Januschkafd2cc202024-04-25 00:53:1961 data_ = std::string(std::string_view(
Peter Kasting9eb10b02021-04-29 03:10:4862 reinterpret_cast<const char*>(bytes->front()), bytes->size()));
Aga Wronskaf14a9322018-09-19 15:44:5063 }
64
65 private:
66 bool data_received_ = false;
67 std::string data_;
Aga Wronskaf14a9322018-09-19 15:44:5068};
69
70} // namespace
71
Aga Wronska5a5b7a652018-09-27 00:49:5272// Base class for ChromeOS offline terms tests.
Aga Wronskaf14a9322018-09-19 15:44:5073class ChromeOSTermsTest : public testing::Test {
Peter Boströmc75681ac2021-09-24 16:58:4174 public:
75 ChromeOSTermsTest(const ChromeOSTermsTest&) = delete;
76 ChromeOSTermsTest& operator=(const ChromeOSTermsTest&) = delete;
77
Aga Wronskaf14a9322018-09-19 15:44:5078 protected:
Sorin Jianuadfd3bf2024-12-05 22:32:4379 ChromeOSTermsTest() = default;
Aga Wronskaf14a9322018-09-19 15:44:5080 ~ChromeOSTermsTest() override = default;
81
82 void SetUp() override {
83 // Create root tmp directory for fake ARC ToS data.
84 base::FilePath root_path;
85 base::CreateNewTempDirectory(FILE_PATH_LITERAL(""), &root_path);
Michael Giuffrida3c62f952019-01-13 12:16:2286 ASSERT_TRUE(preinstalled_offline_resources_dir_.Set(root_path));
87 arc_tos_dir_ =
88 preinstalled_offline_resources_dir_.GetPath().Append("arc_tos");
Aga Wronskaf14a9322018-09-19 15:44:5089 ASSERT_TRUE(base::CreateDirectory(arc_tos_dir_));
90
91 tested_html_source_ = std::make_unique<AboutUIHTMLSource>(
92 chrome::kChromeUITermsHost, nullptr);
Aga Wronskaf14a9322018-09-19 15:44:5093 }
94
95 // Creates directory for the given |locale| that contains terms.html. Writes
96 // the |locale| string to the created file.
97 bool CreateTermsForLocale(const std::string& locale) {
98 base::FilePath dir = arc_tos_dir_.Append(base::ToLowerASCII(locale));
Peter Kastinga4863242024-12-23 00:19:4399 if (!base::CreateDirectory(dir)) {
Aga Wronskaf14a9322018-09-19 15:44:50100 return false;
Peter Kastinga4863242024-12-23 00:19:43101 }
Aga Wronskaf14a9322018-09-19 15:44:50102
Lei Zhanga5bd23f12020-05-07 05:50:15103 return base::WriteFile(dir.AppendASCII("terms.html"), locale);
Aga Wronskaf14a9322018-09-19 15:44:50104 }
105
Aga Wronska5a5b7a652018-09-27 00:49:52106 // Creates directory for the given |locale| that contains privacy_policy.pdf.
107 // Writes the |locale| string to the created file.
108 bool CreatePrivacyPolicyForLocale(const std::string& locale) {
109 base::FilePath dir = arc_tos_dir_.Append(base::ToLowerASCII(locale));
Peter Kastinga4863242024-12-23 00:19:43110 if (!base::CreateDirectory(dir)) {
Aga Wronska5a5b7a652018-09-27 00:49:52111 return false;
Peter Kastinga4863242024-12-23 00:19:43112 }
Aga Wronska5a5b7a652018-09-27 00:49:52113
Lei Zhanga5bd23f12020-05-07 05:50:15114 return base::WriteFile(dir.AppendASCII("privacy_policy.pdf"), locale);
Aga Wronska5a5b7a652018-09-27 00:49:52115 }
116
Aga Wronskaf14a9322018-09-19 15:44:50117 // Sets device region in VPD.
118 void SetRegion(const std::string& region) {
Yeunjoo Choi462896712022-12-20 01:15:40119 statistics_provider_.SetMachineStatistic(ash::system::kRegionKey, region);
Aga Wronskaf14a9322018-09-19 15:44:50120 }
121
Aga Wronska5a5b7a652018-09-27 00:49:52122 // Starts data request with the |request_url|.
123 void StartRequest(const std::string& request_url,
124 TestDataReceiver* data_receiver) {
John Abd-El-Malek92bf3602019-07-31 02:25:48125 content::WebContents::Getter wc_getter;
Aga Wronskaf14a9322018-09-19 15:44:50126 tested_html_source_->StartDataRequest(
Wei-Yin Chen (陳威尹)39f4ff32019-10-22 17:59:09127 GURL(base::StrCat(
128 {"chrome://", chrome::kChromeUITermsHost, "/", request_url})),
129 std::move(wc_getter),
Jan Wilken Dörrie0c52d0e2020-04-20 15:01:56130 base::BindOnce(&TestDataReceiver::OnDataReceived,
131 base::Unretained(data_receiver)));
Gabriel Charette798fde72019-08-20 22:24:04132 task_environment_.RunUntilIdle();
Aga Wronskaf14a9322018-09-19 15:44:50133 }
134
Michael Giuffrida3c62f952019-01-13 12:16:22135 const base::FilePath& PreinstalledOfflineResourcesPath() {
136 return preinstalled_offline_resources_dir_.GetPath();
137 }
138
Aga Wronskaf14a9322018-09-19 15:44:50139 private:
Michael Giuffrida3c62f952019-01-13 12:16:22140 base::ScopedTempDir preinstalled_offline_resources_dir_;
Aga Wronskaf14a9322018-09-19 15:44:50141 base::FilePath arc_tos_dir_;
142
Gabriel Charette798fde72019-08-20 22:24:04143 content::BrowserTaskEnvironment task_environment_;
Aga Wronskaf14a9322018-09-19 15:44:50144
Yeunjoo Choi462896712022-12-20 01:15:40145 ash::system::ScopedFakeStatisticsProvider statistics_provider_;
Aga Wronskaf14a9322018-09-19 15:44:50146
147 std::unique_ptr<AboutUIHTMLSource> tested_html_source_;
Aga Wronskaf14a9322018-09-19 15:44:50148};
149
150TEST_F(ChromeOSTermsTest, NoData) {
151 SetRegion("ca");
152 ScopedBrowserLocale browser_locale("en-CA");
153
Aga Wronska5a5b7a652018-09-27 00:49:52154 TestDataReceiver terms_data_receiver;
155 StartRequest(chrome::kArcTermsURLPath, &terms_data_receiver);
Aga Wronskaf14a9322018-09-19 15:44:50156
Bowen Liec6278212022-02-12 00:04:16157 EXPECT_FALSE(terms_data_receiver.data_received());
Aga Wronska5a5b7a652018-09-27 00:49:52158 EXPECT_EQ("", terms_data_receiver.data());
159
160 TestDataReceiver privacy_policy_data_receiver;
161 StartRequest(chrome::kArcPrivacyPolicyURLPath, &privacy_policy_data_receiver);
162
Bowen Liec6278212022-02-12 00:04:16163 EXPECT_FALSE(privacy_policy_data_receiver.data_received());
Aga Wronska5a5b7a652018-09-27 00:49:52164 EXPECT_EQ("", privacy_policy_data_receiver.data());
Aga Wronskaf14a9322018-09-19 15:44:50165}
Miriam Zimmermanff0c0812023-04-27 16:46:27166
Miriam Zimmermanff0c0812023-04-27 16:46:27167// Base class for ChromeOS offline terms tests.
168class ChromeOSCreditsTest : public testing::Test {
169 public:
170 ChromeOSCreditsTest(const ChromeOSCreditsTest&) = delete;
171 ChromeOSCreditsTest& operator=(const ChromeOSCreditsTest&) = delete;
172
173 protected:
Sorin Jianuadfd3bf2024-12-05 22:32:43174 ChromeOSCreditsTest() = default;
Miriam Zimmermanff0c0812023-04-27 16:46:27175 ~ChromeOSCreditsTest() override = default;
176
177 void SetUp() override {
178 ASSERT_TRUE(resources_dir_.CreateUniqueTempDir());
179
180 tested_html_source_ = std::make_unique<AboutUIHTMLSource>(
181 chrome::kChromeUIOSCreditsHost, nullptr);
182 tested_html_source_->SetOSCreditsPrefixForTesting(resources_dir_.GetPath());
183 }
184
185 bool CreateHtmlCredits() {
186 return base::WriteFile(
187 resources_dir_.GetPath().Append(
188 base::FilePath(chrome::kChromeOSCreditsPath).BaseName()),
189 kTestHtml);
190 }
191
192 bool CreateCompressedHtmlCredits() {
193 std::string compressed;
194 if (!compression::GzipCompress(std::string(kTestHtml), &compressed)) {
195 return false;
196 }
197 return base::WriteFile(
198 resources_dir_.GetPath().Append(
199 base::FilePath(chrome::kChromeOSCreditsCompressedPath).BaseName()),
200 compressed);
201 }
202
203 // Starts data request with the |request_url|.
204 void StartRequest(TestDataReceiver* data_receiver) {
205 content::WebContents::Getter wc_getter;
206 tested_html_source_->StartDataRequest(
207 GURL(base::StrCat({"chrome://", chrome::kChromeUIOSCreditsHost, "/"})),
208 std::move(wc_getter),
209 base::BindOnce(&TestDataReceiver::OnDataReceived,
210 base::Unretained(data_receiver)));
211 task_environment_.RunUntilIdle();
212 }
213
214 protected:
215 static constexpr char kTestHtml[] = "<html><body>test</body></html>";
216
217 private:
218 base::ScopedTempDir resources_dir_;
219
220 content::BrowserTaskEnvironment task_environment_;
221
222 ash::system::ScopedFakeStatisticsProvider statistics_provider_;
223
224 std::unique_ptr<AboutUIHTMLSource> tested_html_source_;
225};
226
227// Verify that it reads decompressed html file
228TEST_F(ChromeOSCreditsTest, Decompressed) {
229 ASSERT_TRUE(CreateHtmlCredits());
230 TestDataReceiver data_receiver;
231 StartRequest(&data_receiver);
232
233 EXPECT_TRUE(data_receiver.data_received());
234 EXPECT_EQ(data_receiver.data(), kTestHtml);
235}
236
237// Verify that it reads compressed html file
238TEST_F(ChromeOSCreditsTest, Compressed) {
239 ASSERT_TRUE(CreateCompressedHtmlCredits());
240 TestDataReceiver data_receiver;
241 StartRequest(&data_receiver);
242
243 EXPECT_TRUE(data_receiver.data_received());
244 EXPECT_EQ(data_receiver.data(), kTestHtml);
245}
246
247// Verify that it falls back to a default
248TEST_F(ChromeOSCreditsTest, Neither) {
249 TestDataReceiver data_receiver;
250 StartRequest(&data_receiver);
251
252 EXPECT_TRUE(data_receiver.data_received());
253 EXPECT_NE(data_receiver.data(), kTestHtml);
254 EXPECT_FALSE(data_receiver.data().empty());
255}