blob: 44d52bba3ed4944b8818e3edc307fd0a21d74470 [file] [log] [blame]
Daichi Hirono37914162017-11-30 04:24:241// Copyright 2017 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/exo/data_source.h"
6
Fergus Dall9a9d37c2019-05-16 03:32:257#include "base/barrier_closure.h"
Daichi Hirono37914162017-11-30 04:24:248#include "base/bind.h"
Fergus Dall9a9d37c2019-05-16 03:32:259#include "base/bind_helpers.h"
Daichi Hirono37914162017-11-30 04:24:2410#include "base/files/file_util.h"
Gabriel Charettec7108742019-08-23 03:31:4011#include "base/test/task_environment.h"
Daichi Hirono37914162017-11-30 04:24:2412#include "components/exo/data_source_delegate.h"
13#include "components/exo/test/exo_test_base.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace exo {
17namespace {
18
19constexpr char kTestData[] = "Test Data";
20
21class DataSourceTest : public testing::Test {
22 protected:
Gabriel Charette61b078cd2019-08-21 22:09:4423 base::test::TaskEnvironment task_environment_{
Gabriel Charettedfa36042019-08-19 17:30:1124 base::test::TaskEnvironment::MainThreadType::DEFAULT,
25 base::test::TaskEnvironment::ThreadPoolExecutionMode::ASYNC};
Daichi Hirono37914162017-11-30 04:24:2426};
27
28class TestDataSourceDelegate : public DataSourceDelegate {
29 public:
30 TestDataSourceDelegate() {}
31 ~TestDataSourceDelegate() override {}
32
33 // Overridden from DataSourceDelegate:
34 void OnDataSourceDestroying(DataSource* source) override {}
Fergus Dall2bcca7c72019-08-21 04:22:4135 void OnTarget(const base::Optional<std::string>& mime_type) override {}
Daichi Hirono37914162017-11-30 04:24:2436 void OnSend(const std::string& mime_type, base::ScopedFD fd) override {
37 ASSERT_TRUE(
38 base::WriteFileDescriptor(fd.get(), kTestData, strlen(kTestData)));
39 }
40 void OnCancelled() override {}
41 void OnDndDropPerformed() override {}
42 void OnDndFinished() override {}
43 void OnAction(DndAction dnd_action) override {}
44};
45
Fergus Dall9a9d37c2019-05-16 03:32:2546void CheckMimeType(const std::string& expected,
47 base::OnceClosure counter,
48 const std::string& mime_type,
49 const std::vector<uint8_t>& data) {
50 EXPECT_FALSE(expected.empty());
51 EXPECT_EQ(mime_type, expected);
52 std::move(counter).Run();
53}
54
Fergus Dalla4293852019-07-26 07:13:4755void CheckTextMimeType(const std::string& expected,
56 base::OnceClosure counter,
57 const std::string& mime_type,
58 base::string16 data) {
59 EXPECT_FALSE(expected.empty());
60 EXPECT_EQ(mime_type, expected);
61 std::move(counter).Run();
62}
63
Fergus Dall9a9d37c2019-05-16 03:32:2564void IncrementCounter(base::RepeatingClosure counter) {
65 std::move(counter).Run();
66}
67
68void CheckMimeTypesRecieved(DataSource* data_source,
69 const std::string& text_mime,
70 const std::string& rtf_mime,
71 const std::string& html_mime,
72 const std::string& image_mime) {
73 base::RunLoop run_loop;
74 base::RepeatingClosure counter =
75 base::BarrierClosure(4, run_loop.QuitClosure());
76 data_source->GetDataForPreferredMimeTypes(
Fergus Dalla4293852019-07-26 07:13:4777 base::BindOnce(&CheckTextMimeType, text_mime, counter),
Fergus Dall9a9d37c2019-05-16 03:32:2578 base::BindOnce(&CheckMimeType, rtf_mime, counter),
Fergus Dalla4293852019-07-26 07:13:4779 base::BindOnce(&CheckTextMimeType, html_mime, counter),
Fergus Dall9a9d37c2019-05-16 03:32:2580 base::BindOnce(&CheckMimeType, image_mime, counter),
81 base::BindRepeating(&IncrementCounter, counter));
82 run_loop.Run();
83}
84
Daichi Hirono37914162017-11-30 04:24:2485TEST_F(DataSourceTest, ReadData) {
86 TestDataSourceDelegate delegate;
87 DataSource data_source(&delegate);
Fergus Dall9a9d37c2019-05-16 03:32:2588 std::string mime_type("text/plain;charset=utf-8");
89 data_source.Offer(mime_type.c_str());
90
91 data_source.ReadDataForTesting(
92 mime_type, base::BindOnce([](const std::string& mime_type,
93 const std::vector<uint8_t>& data) {
94 std::string string_data(data.begin(), data.end());
95 EXPECT_EQ(std::string(kTestData), string_data);
96 }));
Gabriel Charettedfa36042019-08-19 17:30:1197 task_environment_.RunUntilIdle();
Fergus Dall9a9d37c2019-05-16 03:32:2598}
99
100TEST_F(DataSourceTest, ReadDataArbitraryMimeType) {
101 TestDataSourceDelegate delegate;
102 DataSource data_source(&delegate);
103 std::string mime_type("abc/def;key=value");
104 data_source.Offer(mime_type.c_str());
105
106 data_source.ReadDataForTesting(
107 mime_type, base::BindOnce([](const std::string& mime_type,
108 const std::vector<uint8_t>& data) {
109 std::string string_data(data.begin(), data.end());
110 EXPECT_EQ(std::string(kTestData), string_data);
111 }));
Gabriel Charettedfa36042019-08-19 17:30:11112 task_environment_.RunUntilIdle();
Fergus Dall9a9d37c2019-05-16 03:32:25113}
114
115TEST_F(DataSourceTest, ReadData_UnknownMimeType) {
116 TestDataSourceDelegate delegate;
117 DataSource data_source(&delegate);
Daichi Hirono37914162017-11-30 04:24:24118 data_source.Offer("text/plain;charset=utf-8");
119
Fergus Dall9a9d37c2019-05-16 03:32:25120 std::string unknown_type("text/unknown");
121 data_source.ReadDataForTesting(
122 unknown_type, base::BindOnce([](const std::string& mime_type,
123 const std::vector<uint8_t>& data) {
124 FAIL() << "Callback should not be invoked when known "
125 "mimetype is not offerred";
126 }));
Gabriel Charettedfa36042019-08-19 17:30:11127 task_environment_.RunUntilIdle();
Daichi Hirono37914162017-11-30 04:24:24128}
129
130TEST_F(DataSourceTest, ReadData_Destroyed) {
131 TestDataSourceDelegate delegate;
132 {
133 DataSource data_source(&delegate);
Fergus Dall9a9d37c2019-05-16 03:32:25134 std::string mime_type("text/plain;charset=utf-8");
135 data_source.Offer(mime_type);
Daichi Hirono37914162017-11-30 04:24:24136
Fergus Dall9a9d37c2019-05-16 03:32:25137 data_source.ReadDataForTesting(
138 mime_type, base::BindOnce([](const std::string& mime_type,
139 const std::vector<uint8_t>& data) {
140 FAIL() << "Callback should not be invoked after "
141 "data source is destroyed";
142 }));
Daichi Hirono37914162017-11-30 04:24:24143 }
Gabriel Charettedfa36042019-08-19 17:30:11144 task_environment_.RunUntilIdle();
Daichi Hirono37914162017-11-30 04:24:24145}
146
147TEST_F(DataSourceTest, ReadData_Cancelled) {
148 TestDataSourceDelegate delegate;
149 DataSource data_source(&delegate);
Fergus Dall9a9d37c2019-05-16 03:32:25150 std::string mime_type("text/plain;charset=utf-8");
151 data_source.Offer(mime_type);
Daichi Hirono37914162017-11-30 04:24:24152
Fergus Dall9a9d37c2019-05-16 03:32:25153 data_source.ReadDataForTesting(
154 mime_type, base::BindOnce([](const std::string& mime_type,
155 const std::vector<uint8_t>& data) {
156 FAIL() << "Callback should not be invoked after cancelled";
157 }));
Daichi Hirono37914162017-11-30 04:24:24158 data_source.Cancelled();
Gabriel Charettedfa36042019-08-19 17:30:11159 task_environment_.RunUntilIdle();
Daichi Hirono37914162017-11-30 04:24:24160}
161
Fergus Dall9a9d37c2019-05-16 03:32:25162TEST_F(DataSourceTest, PreferredMimeTypeUTF16) {
163 TestDataSourceDelegate delegate;
164 DataSource data_source(&delegate);
165 data_source.Offer("text/plain;charset=utf-16");
166 data_source.Offer("text/plain;charset=UTF-8");
167 data_source.Offer("text/html;charset=UTF-16");
168 data_source.Offer("text/html;charset=utf-8");
169
170 CheckMimeTypesRecieved(
171 &data_source,
172 "text/plain;charset=utf-16",
173 "",
174 "text/html;charset=UTF-16",
175 "");
176}
177
178TEST_F(DataSourceTest, PreferredMimeTypeUTF16LE) {
179 TestDataSourceDelegate delegate;
180 DataSource data_source(&delegate);
181 data_source.Offer("text/plain;charset=utf-16le");
182 data_source.Offer("text/plain;charset=utf8");
183 data_source.Offer("text/html;charset=utf16le");
184 data_source.Offer("text/html;charset=utf-8");
185
186 CheckMimeTypesRecieved(
187 &data_source,
188 "text/plain;charset=utf-16le",
189 "",
190 "text/html;charset=utf16le",
191 "");
192}
193
194TEST_F(DataSourceTest, PreferredMimeTypeUTF16BE) {
195 TestDataSourceDelegate delegate;
196 DataSource data_source(&delegate);
197 data_source.Offer("text/plain;charset=utf-16be");
198 data_source.Offer("text/plain;charset=UTF8");
199 data_source.Offer("text/html;charset=UTF16be");
200 data_source.Offer("text/html;charset=utf-8");
201
202 CheckMimeTypesRecieved(
203 &data_source,
204 "text/plain;charset=utf-16be",
205 "",
206 "text/html;charset=UTF16be",
207 "");
208}
209
210TEST_F(DataSourceTest, PreferredMimeTypeUTFToOther) {
211 TestDataSourceDelegate delegate;
212 DataSource data_source(&delegate);
213 data_source.Offer("text/plain;charset=utf-8");
214 data_source.Offer("text/plain;charset=iso-8859-1");
215 data_source.Offer("text/html;charset=utf-8");
216 data_source.Offer("text/html;charset=iso-8859-1");
217
218 CheckMimeTypesRecieved(
219 &data_source,
220 "text/plain;charset=utf-8",
221 "",
222 "text/html;charset=utf-8",
223 "");
224}
225
226TEST_F(DataSourceTest, RecogniseUTF8Legaccy) {
227 TestDataSourceDelegate delegate;
228 DataSource data_source(&delegate);
229 data_source.Offer("UTF8_STRING");
230 data_source.Offer("text/plain;charset=iso-8859-1");
231
232 CheckMimeTypesRecieved(
233 &data_source,
234 "UTF8_STRING",
235 "",
236 "",
237 "");
238}
239
240TEST_F(DataSourceTest, PreferredMimeTypeOtherToAscii) {
241 TestDataSourceDelegate delegate;
242 DataSource data_source(&delegate);
243 data_source.Offer("text/plain;charset=iso-8859-1");
244 data_source.Offer("text/plain;charset=ASCII");
245 data_source.Offer("text/html;charset=iso-8859-1");
246 data_source.Offer("text/html;charset=ascii");
247
248 CheckMimeTypesRecieved(
249 &data_source,
250 "text/plain;charset=iso-8859-1",
251 "",
252 "text/html;charset=iso-8859-1",
253 "");
254}
255
256TEST_F(DataSourceTest, PreferredMimeTypeOtherToUnspecified) {
257 TestDataSourceDelegate delegate;
258 DataSource data_source(&delegate);
259 data_source.Offer("text/plain;charset=iso-8859-1");
260 data_source.Offer("text/plain");
261 data_source.Offer("text/html;charset=iso-8859-1");
262 data_source.Offer("text/html");
263
264 CheckMimeTypesRecieved(
265 &data_source,
266 "text/plain;charset=iso-8859-1",
267 "",
268 "text/html;charset=iso-8859-1",
269 "");
270}
271
272TEST_F(DataSourceTest, PreferredMimeTypeRTF) {
273 TestDataSourceDelegate delegate;
274 DataSource data_source(&delegate);
275 data_source.Offer("text/rtf");
276
277 CheckMimeTypesRecieved(
278 &data_source,
279 "",
280 "text/rtf",
281 "",
282 "");
283}
284
285TEST_F(DataSourceTest, PreferredMimeTypeBitmapToPNG) {
286 TestDataSourceDelegate delegate;
287 DataSource data_source(&delegate);
288 data_source.Offer("image/bmp");
289 data_source.Offer("image/png");
290
291 CheckMimeTypesRecieved(
292 &data_source,
293 "",
294 "",
295 "",
296 "image/bmp");
297}
298
299TEST_F(DataSourceTest, PreferredMimeTypePNGToJPEG) {
300 TestDataSourceDelegate delegate;
301 DataSource data_source(&delegate);
302 data_source.Offer("image/png");
303 data_source.Offer("image/jpeg");
304 data_source.Offer("image/jpg");
305
306 CheckMimeTypesRecieved(
307 &data_source,
308 "",
309 "",
310 "",
311 "image/png");
312}
313
Daichi Hirono37914162017-11-30 04:24:24314} // namespace
315} // namespace exo