app_service_types_mojom_traits_unittest.cc 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214
  1. // Copyright 2021 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. #include <utility>
  5. #include <vector>
  6. #include "base/test/task_environment.h"
  7. #include "chromeos/crosapi/mojom/app_service_types.mojom.h"
  8. #include "chromeos/crosapi/mojom/app_service_types_mojom_traits.h"
  9. #include "components/services/app_service/public/cpp/app_launch_util.h"
  10. #include "components/services/app_service/public/cpp/app_types.h"
  11. #include "components/services/app_service/public/cpp/icon_types.h"
  12. #include "components/services/app_service/public/cpp/intent_filter.h"
  13. #include "components/services/app_service/public/cpp/intent_filter_util.h"
  14. #include "components/services/app_service/public/cpp/permission.h"
  15. #include "components/services/app_service/public/cpp/shortcut.h"
  16. #include "components/services/app_service/public/mojom/types.mojom.h"
  17. #include "mojo/public/cpp/test_support/test_utils.h"
  18. #include "testing/gtest/include/gtest/gtest.h"
  19. #include "third_party/abseil-cpp/absl/types/variant.h"
  20. #include "ui/gfx/image/image_unittest_util.h"
  21. // Test that every field in apps::App in correctly converted.
  22. TEST(AppServiceTypesMojomTraitsTest, RoundTrip) {
  23. auto input = std::make_unique<apps::App>(apps::AppType::kWeb, "abcdefg");
  24. input->readiness = apps::Readiness::kReady;
  25. input->name = "lacros test name";
  26. input->short_name = "lacros test name";
  27. input->publisher_id = "publisher_id";
  28. input->description = "description";
  29. input->version = "version";
  30. input->additional_search_terms = {"1", "2"};
  31. input->icon_key = apps::IconKey(
  32. /*timeline=*/1, apps::IconKey::kInvalidResourceId, /*icon_effects=*/2);
  33. input->last_launch_time = base::Time() + base::Days(1);
  34. input->install_time = base::Time() + base::Days(2);
  35. input->install_reason = apps::InstallReason::kUser;
  36. input->policy_id = "https://app.site/alpha";
  37. input->recommendable = true;
  38. input->searchable = true;
  39. input->show_in_launcher = true;
  40. input->show_in_shelf = true;
  41. input->show_in_search = true;
  42. input->show_in_management = true;
  43. input->has_badge = absl::nullopt;
  44. input->paused = false;
  45. auto intent_filter = std::make_unique<apps::IntentFilter>();
  46. intent_filter->AddSingleValueCondition(apps::ConditionType::kScheme, "https",
  47. apps::PatternMatchType::kLiteral);
  48. intent_filter->activity_name = "activity_name";
  49. intent_filter->activity_label = "activity_label";
  50. input->intent_filters.push_back(std::move(intent_filter));
  51. input->window_mode = apps::WindowMode::kWindow;
  52. input->permissions.push_back(std::make_unique<apps::Permission>(
  53. apps::PermissionType::kCamera,
  54. std::make_unique<apps::PermissionValue>(/*bool_value=*/true),
  55. /*is_managed=*/true));
  56. input->allow_uninstall = true;
  57. input->handles_intents = true;
  58. input->shortcuts.push_back(
  59. std::make_unique<apps::Shortcut>("test_id", "test_name", /*position*/ 1));
  60. input->is_platform_app = true;
  61. apps::AppPtr output;
  62. ASSERT_TRUE(
  63. mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(input, output));
  64. EXPECT_EQ(output->app_type, apps::AppType::kWeb);
  65. EXPECT_EQ(output->app_id, "abcdefg");
  66. EXPECT_EQ(output->readiness, apps::Readiness::kReady);
  67. EXPECT_EQ(output->name, "lacros test name");
  68. EXPECT_EQ(output->short_name, "lacros test name");
  69. EXPECT_EQ(output->publisher_id, "publisher_id");
  70. EXPECT_EQ(output->description, "description");
  71. EXPECT_EQ(output->version, "version");
  72. EXPECT_EQ(output->additional_search_terms, input->additional_search_terms);
  73. EXPECT_EQ(output->icon_key->timeline, 1U);
  74. EXPECT_EQ(output->icon_key->icon_effects, 2U);
  75. EXPECT_EQ(output->last_launch_time, base::Time() + base::Days(1));
  76. EXPECT_EQ(output->install_time, base::Time() + base::Days(2));
  77. EXPECT_EQ(output->install_reason, apps::InstallReason::kUser);
  78. EXPECT_EQ(output->policy_id, "https://app.site/alpha");
  79. EXPECT_TRUE(output->recommendable.value());
  80. EXPECT_TRUE(output->searchable.value());
  81. EXPECT_TRUE(output->show_in_launcher.value());
  82. EXPECT_TRUE(output->show_in_shelf.value());
  83. EXPECT_TRUE(output->show_in_search.value());
  84. EXPECT_TRUE(output->show_in_management.value());
  85. EXPECT_FALSE(output->has_badge.has_value());
  86. EXPECT_FALSE(output->paused.value());
  87. ASSERT_EQ(output->intent_filters.size(), 1U);
  88. auto& filter = output->intent_filters[0];
  89. ASSERT_EQ(filter->conditions.size(), 1U);
  90. auto& condition = filter->conditions[0];
  91. EXPECT_EQ(condition->condition_type, apps::ConditionType::kScheme);
  92. ASSERT_EQ(condition->condition_values.size(), 1U);
  93. EXPECT_EQ(condition->condition_values[0]->value, "https");
  94. EXPECT_EQ(condition->condition_values[0]->match_type,
  95. apps::PatternMatchType::kLiteral);
  96. EXPECT_EQ(filter->activity_name, "activity_name");
  97. EXPECT_EQ(filter->activity_label, "activity_label");
  98. EXPECT_EQ(output->window_mode, apps::WindowMode::kWindow);
  99. ASSERT_EQ(output->permissions.size(), 1U);
  100. auto& out_permission = output->permissions[0];
  101. EXPECT_EQ(out_permission->permission_type, apps::PermissionType::kCamera);
  102. ASSERT_TRUE(absl::holds_alternative<bool>(out_permission->value->value));
  103. EXPECT_TRUE(absl::get<bool>(out_permission->value->value));
  104. EXPECT_TRUE(out_permission->is_managed);
  105. EXPECT_TRUE(output->allow_uninstall.value());
  106. EXPECT_TRUE(output->handles_intents.value());
  107. ASSERT_EQ(output->shortcuts.size(), 1U);
  108. auto& shortcut = output->shortcuts[0];
  109. EXPECT_EQ(shortcut->shortcut_id, "test_id");
  110. EXPECT_EQ(shortcut->name, "test_name");
  111. EXPECT_EQ(shortcut->position, 1);
  112. EXPECT_TRUE(output->is_platform_app.value());
  113. }
  114. // Test that serialization and deserialization works with optional fields that
  115. // doesn't fill up.
  116. TEST(AppServiceTypesMojomTraitsTest, RoundTripNoOptional) {
  117. auto input = std::make_unique<apps::App>(apps::AppType::kWeb, "abcdefg");
  118. input->readiness = apps::Readiness::kReady;
  119. input->additional_search_terms = {"1", "2"};
  120. input->install_reason = apps::InstallReason::kUser;
  121. input->recommendable = true;
  122. input->searchable = true;
  123. input->show_in_launcher = true;
  124. input->show_in_shelf = true;
  125. input->show_in_search = true;
  126. input->show_in_management = true;
  127. input->has_badge = absl::nullopt;
  128. input->paused = false;
  129. auto intent_filter = std::make_unique<apps::IntentFilter>();
  130. intent_filter->AddSingleValueCondition(apps::ConditionType::kScheme, "https",
  131. apps::PatternMatchType::kLiteral);
  132. input->intent_filters.push_back(std::move(intent_filter));
  133. input->window_mode = apps::WindowMode::kBrowser;
  134. input->allow_uninstall = true;
  135. input->handles_intents = true;
  136. input->is_platform_app = absl::nullopt;
  137. apps::AppPtr output;
  138. ASSERT_TRUE(
  139. mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(input, output));
  140. EXPECT_EQ(output->app_type, apps::AppType::kWeb);
  141. EXPECT_EQ(output->app_id, "abcdefg");
  142. EXPECT_EQ(output->readiness, apps::Readiness::kReady);
  143. EXPECT_EQ(output->additional_search_terms, input->additional_search_terms);
  144. EXPECT_EQ(output->install_reason, apps::InstallReason::kUser);
  145. EXPECT_FALSE(output->policy_id.has_value());
  146. EXPECT_TRUE(output->recommendable.value());
  147. EXPECT_TRUE(output->searchable.value());
  148. EXPECT_TRUE(output->show_in_launcher.value());
  149. EXPECT_TRUE(output->show_in_shelf.value());
  150. EXPECT_TRUE(output->show_in_search.value());
  151. EXPECT_TRUE(output->show_in_management.value());
  152. EXPECT_FALSE(output->has_badge.has_value());
  153. EXPECT_FALSE(output->paused.value());
  154. ASSERT_EQ(output->intent_filters.size(), 1U);
  155. auto& filter = output->intent_filters[0];
  156. ASSERT_EQ(filter->conditions.size(), 1U);
  157. auto& condition = filter->conditions[0];
  158. EXPECT_EQ(condition->condition_type, apps::ConditionType::kScheme);
  159. ASSERT_EQ(condition->condition_values.size(), 1U);
  160. EXPECT_EQ(condition->condition_values[0]->value, "https");
  161. EXPECT_EQ(condition->condition_values[0]->match_type,
  162. apps::PatternMatchType::kLiteral);
  163. EXPECT_EQ(output->window_mode, apps::WindowMode::kBrowser);
  164. EXPECT_TRUE(output->allow_uninstall);
  165. EXPECT_TRUE(output->handles_intents);
  166. EXPECT_FALSE(output->is_platform_app.has_value());
  167. }
  168. // Test that serialization and deserialization works with updating app type.
  169. TEST(AppServiceTypesMojomTraitsTest, RoundTripAppType) {
  170. {
  171. auto input =
  172. std::make_unique<apps::App>(apps::AppType::kUnknown, "abcdefg");
  173. apps::AppPtr output;
  174. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  175. input, output));
  176. EXPECT_EQ(output->app_type, apps::AppType::kUnknown);
  177. }
  178. {
  179. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  180. apps::AppPtr output;
  181. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  182. input, output));
  183. EXPECT_EQ(output->app_type, apps::AppType::kArc);
  184. }
  185. {
  186. auto input = std::make_unique<apps::App>(apps::AppType::kWeb, "abcdefg");
  187. apps::AppPtr output;
  188. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  189. input, output));
  190. EXPECT_EQ(output->app_type, apps::AppType::kWeb);
  191. }
  192. {
  193. auto input =
  194. std::make_unique<apps::App>(apps::AppType::kSystemWeb, "abcdefg");
  195. apps::AppPtr output;
  196. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  197. input, output));
  198. EXPECT_EQ(output->app_type, apps::AppType::kSystemWeb);
  199. }
  200. }
  201. // Test that serialization and deserialization works with updating readiness.
  202. TEST(AppServiceTypesMojomTraitsTest, RoundTripReadiness) {
  203. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  204. {
  205. input->readiness = apps::Readiness::kUnknown;
  206. apps::AppPtr output;
  207. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  208. input, output));
  209. EXPECT_EQ(output->readiness, apps::Readiness::kUnknown);
  210. }
  211. {
  212. input->readiness = apps::Readiness::kReady;
  213. apps::AppPtr output;
  214. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  215. input, output));
  216. EXPECT_EQ(output->readiness, apps::Readiness::kReady);
  217. }
  218. {
  219. input->readiness = apps::Readiness::kDisabledByBlocklist;
  220. apps::AppPtr output;
  221. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  222. input, output));
  223. EXPECT_EQ(output->readiness, apps::Readiness::kDisabledByBlocklist);
  224. }
  225. {
  226. input->readiness = apps::Readiness::kDisabledByPolicy;
  227. apps::AppPtr output;
  228. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  229. input, output));
  230. EXPECT_EQ(output->readiness, apps::Readiness::kDisabledByPolicy);
  231. }
  232. {
  233. input->readiness = apps::Readiness::kDisabledByUser;
  234. apps::AppPtr output;
  235. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  236. input, output));
  237. EXPECT_EQ(output->readiness, apps::Readiness::kDisabledByUser);
  238. }
  239. {
  240. input->readiness = apps::Readiness::kTerminated;
  241. apps::AppPtr output;
  242. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  243. input, output));
  244. EXPECT_EQ(output->readiness, apps::Readiness::kTerminated);
  245. }
  246. {
  247. input->readiness = apps::Readiness::kUninstalledByUser;
  248. apps::AppPtr output;
  249. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  250. input, output));
  251. EXPECT_EQ(output->readiness, apps::Readiness::kUninstalledByUser);
  252. }
  253. {
  254. input->readiness = apps::Readiness::kRemoved;
  255. apps::AppPtr output;
  256. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  257. input, output));
  258. EXPECT_EQ(output->readiness, apps::Readiness::kRemoved);
  259. }
  260. }
  261. // Test that serialization and deserialization works with updating install
  262. // reason.
  263. TEST(AppServiceTypesMojomTraitsTest, RoundTripInstallReason) {
  264. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  265. {
  266. input->install_reason = apps::InstallReason::kUnknown;
  267. apps::AppPtr output;
  268. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  269. input, output));
  270. EXPECT_EQ(output->install_reason, apps::InstallReason::kUnknown);
  271. }
  272. {
  273. input->install_reason = apps::InstallReason::kSystem;
  274. apps::AppPtr output;
  275. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  276. input, output));
  277. EXPECT_EQ(output->install_reason, apps::InstallReason::kSystem);
  278. }
  279. {
  280. input->install_reason = apps::InstallReason::kPolicy;
  281. apps::AppPtr output;
  282. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  283. input, output));
  284. EXPECT_EQ(output->install_reason, apps::InstallReason::kPolicy);
  285. }
  286. {
  287. input->install_reason = apps::InstallReason::kOem;
  288. apps::AppPtr output;
  289. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  290. input, output));
  291. EXPECT_EQ(output->install_reason, apps::InstallReason::kOem);
  292. }
  293. {
  294. input->install_reason = apps::InstallReason::kDefault;
  295. apps::AppPtr output;
  296. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  297. input, output));
  298. EXPECT_EQ(output->install_reason, apps::InstallReason::kDefault);
  299. }
  300. {
  301. input->install_reason = apps::InstallReason::kSync;
  302. apps::AppPtr output;
  303. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  304. input, output));
  305. EXPECT_EQ(output->install_reason, apps::InstallReason::kSync);
  306. }
  307. {
  308. input->install_reason = apps::InstallReason::kUser;
  309. apps::AppPtr output;
  310. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  311. input, output));
  312. EXPECT_EQ(output->install_reason, apps::InstallReason::kUser);
  313. }
  314. }
  315. // Test that serialization and deserialization works with updating
  316. // recommendable.
  317. TEST(AppServiceTypesMojomTraitsTest, RoundTripRecommendable) {
  318. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  319. {
  320. input->recommendable = absl::nullopt;
  321. apps::AppPtr output;
  322. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  323. input, output));
  324. EXPECT_FALSE(output->recommendable.has_value());
  325. }
  326. {
  327. input->recommendable = false;
  328. apps::AppPtr output;
  329. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  330. input, output));
  331. EXPECT_FALSE(output->recommendable.value());
  332. }
  333. {
  334. input->recommendable = true;
  335. apps::AppPtr output;
  336. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  337. input, output));
  338. EXPECT_TRUE(output->recommendable.value());
  339. }
  340. }
  341. // Test that serialization and deserialization works with updating searchable.
  342. TEST(AppServiceTypesMojomTraitsTest, RoundTripSearchable) {
  343. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  344. {
  345. input->searchable = absl::nullopt;
  346. apps::AppPtr output;
  347. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  348. input, output));
  349. EXPECT_FALSE(output->searchable.has_value());
  350. }
  351. {
  352. input->searchable = false;
  353. apps::AppPtr output;
  354. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  355. input, output));
  356. EXPECT_FALSE(output->searchable.value());
  357. }
  358. {
  359. input->searchable = true;
  360. apps::AppPtr output;
  361. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  362. input, output));
  363. EXPECT_TRUE(output->searchable.value());
  364. }
  365. }
  366. // Test that serialization and deserialization works with updating
  367. // show_in_launcher.
  368. TEST(AppServiceTypesMojomTraitsTest, RoundTripShowInLauncher) {
  369. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  370. {
  371. input->show_in_launcher = absl::nullopt;
  372. apps::AppPtr output;
  373. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  374. input, output));
  375. EXPECT_FALSE(output->show_in_launcher.has_value());
  376. }
  377. {
  378. input->show_in_launcher = false;
  379. apps::AppPtr output;
  380. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  381. input, output));
  382. EXPECT_FALSE(output->show_in_launcher.value());
  383. }
  384. {
  385. input->show_in_launcher = true;
  386. apps::AppPtr output;
  387. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  388. input, output));
  389. EXPECT_TRUE(output->show_in_launcher.value());
  390. }
  391. }
  392. // Test that serialization and deserialization works with updating
  393. // show_in_shelf.
  394. TEST(AppServiceTypesMojomTraitsTest, RoundTripShowInShelf) {
  395. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  396. {
  397. input->show_in_shelf = absl::nullopt;
  398. apps::AppPtr output;
  399. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  400. input, output));
  401. EXPECT_FALSE(output->show_in_shelf.has_value());
  402. }
  403. {
  404. input->show_in_shelf = false;
  405. apps::AppPtr output;
  406. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  407. input, output));
  408. EXPECT_FALSE(output->show_in_shelf.value());
  409. }
  410. {
  411. input->show_in_shelf = true;
  412. apps::AppPtr output;
  413. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  414. input, output));
  415. EXPECT_TRUE(output->show_in_shelf.value());
  416. }
  417. }
  418. // Test that serialization and deserialization works with updating
  419. // show_in_search.
  420. TEST(AppServiceTypesMojomTraitsTest, RoundTripShowInSearch) {
  421. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  422. {
  423. input->show_in_search = absl::nullopt;
  424. apps::AppPtr output;
  425. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  426. input, output));
  427. EXPECT_FALSE(output->show_in_search.has_value());
  428. }
  429. {
  430. input->show_in_search = false;
  431. apps::AppPtr output;
  432. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  433. input, output));
  434. EXPECT_FALSE(output->show_in_search.value());
  435. }
  436. {
  437. input->show_in_search = true;
  438. apps::AppPtr output;
  439. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  440. input, output));
  441. EXPECT_TRUE(output->show_in_search.value());
  442. }
  443. }
  444. // Test that serialization and deserialization works with updating
  445. // show_in_management.
  446. TEST(AppServiceTypesMojomTraitsTest, RoundTripShowInManagement) {
  447. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  448. {
  449. input->show_in_management = absl::nullopt;
  450. apps::AppPtr output;
  451. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  452. input, output));
  453. EXPECT_FALSE(output->show_in_management.has_value());
  454. }
  455. {
  456. input->show_in_management = false;
  457. apps::AppPtr output;
  458. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  459. input, output));
  460. EXPECT_FALSE(output->show_in_management.value());
  461. }
  462. {
  463. input->show_in_management = true;
  464. apps::AppPtr output;
  465. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  466. input, output));
  467. EXPECT_TRUE(output->show_in_management.value());
  468. }
  469. }
  470. // Test that serialization and deserialization works with updating has_badge.
  471. TEST(AppServiceTypesMojomTraitsTest, RoundTripHasBadge) {
  472. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  473. {
  474. input->has_badge = absl::nullopt;
  475. apps::AppPtr output;
  476. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  477. input, output));
  478. EXPECT_FALSE(output->has_badge.has_value());
  479. }
  480. {
  481. input->has_badge = false;
  482. apps::AppPtr output;
  483. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  484. input, output));
  485. EXPECT_FALSE(output->has_badge.value());
  486. }
  487. {
  488. input->has_badge = true;
  489. apps::AppPtr output;
  490. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  491. input, output));
  492. EXPECT_TRUE(output->has_badge.value());
  493. }
  494. }
  495. // Test that serialization and deserialization works with updating paused.
  496. TEST(AppServiceTypesMojomTraitsTest, RoundTripPaused) {
  497. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  498. {
  499. input->paused = absl::nullopt;
  500. apps::AppPtr output;
  501. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  502. input, output));
  503. EXPECT_FALSE(output->paused.has_value());
  504. }
  505. {
  506. input->paused = false;
  507. apps::AppPtr output;
  508. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  509. input, output));
  510. EXPECT_FALSE(output->paused.value());
  511. }
  512. {
  513. input->paused = true;
  514. apps::AppPtr output;
  515. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(
  516. input, output));
  517. EXPECT_TRUE(output->paused.value());
  518. }
  519. }
  520. // Test that serialization and deserialization works with updating
  521. // intent_filters.
  522. TEST(AppServiceTypesMojomTraitsTest, RoundTripIntentFilters) {
  523. auto input = std::make_unique<apps::App>(apps::AppType::kArc, "abcdefg");
  524. auto intent_filter = std::make_unique<apps::IntentFilter>();
  525. intent_filter->AddSingleValueCondition(apps::ConditionType::kScheme, "1",
  526. apps::PatternMatchType::kLiteral);
  527. intent_filter->AddSingleValueCondition(apps::ConditionType::kHost, "2",
  528. apps::PatternMatchType::kLiteral);
  529. intent_filter->AddSingleValueCondition(apps::ConditionType::kPath, "3",
  530. apps::PatternMatchType::kPrefix);
  531. intent_filter->AddSingleValueCondition(apps::ConditionType::kAction, "4",
  532. apps::PatternMatchType::kGlob);
  533. intent_filter->AddSingleValueCondition(apps::ConditionType::kMimeType, "5",
  534. apps::PatternMatchType::kMimeType);
  535. intent_filter->AddSingleValueCondition(apps::ConditionType::kFile, "6",
  536. apps::PatternMatchType::kMimeType);
  537. intent_filter->AddSingleValueCondition(
  538. apps::ConditionType::kFile, "7", apps::PatternMatchType::kFileExtension);
  539. intent_filter->AddSingleValueCondition(apps::ConditionType::kHost, "8",
  540. apps::PatternMatchType::kSuffix);
  541. input->intent_filters.push_back(std::move(intent_filter));
  542. apps::AppPtr output;
  543. ASSERT_TRUE(
  544. mojo::test::SerializeAndDeserialize<crosapi::mojom::App>(input, output));
  545. ASSERT_EQ(output->intent_filters.size(), 1U);
  546. auto& filter = output->intent_filters[0];
  547. ASSERT_EQ(filter->conditions.size(), 8U);
  548. {
  549. auto& condition = filter->conditions[0];
  550. EXPECT_EQ(condition->condition_type, apps::ConditionType::kScheme);
  551. ASSERT_EQ(condition->condition_values.size(), 1U);
  552. EXPECT_EQ(condition->condition_values[0]->match_type,
  553. apps::PatternMatchType::kLiteral);
  554. EXPECT_EQ(condition->condition_values[0]->value, "1");
  555. }
  556. {
  557. auto& condition = filter->conditions[1];
  558. EXPECT_EQ(condition->condition_type, apps::ConditionType::kHost);
  559. ASSERT_EQ(condition->condition_values.size(), 1U);
  560. EXPECT_EQ(condition->condition_values[0]->match_type,
  561. apps::PatternMatchType::kLiteral);
  562. EXPECT_EQ(condition->condition_values[0]->value, "2");
  563. }
  564. {
  565. auto& condition = filter->conditions[2];
  566. EXPECT_EQ(condition->condition_type, apps::ConditionType::kPath);
  567. ASSERT_EQ(condition->condition_values.size(), 1U);
  568. EXPECT_EQ(condition->condition_values[0]->match_type,
  569. apps::PatternMatchType::kPrefix);
  570. EXPECT_EQ(condition->condition_values[0]->value, "3");
  571. }
  572. {
  573. auto& condition = filter->conditions[3];
  574. EXPECT_EQ(condition->condition_type, apps::ConditionType::kAction);
  575. ASSERT_EQ(condition->condition_values.size(), 1U);
  576. EXPECT_EQ(condition->condition_values[0]->match_type,
  577. apps::PatternMatchType::kGlob);
  578. EXPECT_EQ(condition->condition_values[0]->value, "4");
  579. }
  580. {
  581. auto& condition = filter->conditions[4];
  582. EXPECT_EQ(condition->condition_type, apps::ConditionType::kMimeType);
  583. ASSERT_EQ(condition->condition_values.size(), 1U);
  584. EXPECT_EQ(condition->condition_values[0]->match_type,
  585. apps::PatternMatchType::kMimeType);
  586. EXPECT_EQ(condition->condition_values[0]->value, "5");
  587. }
  588. {
  589. auto& condition = filter->conditions[5];
  590. EXPECT_EQ(condition->condition_type, apps::ConditionType::kFile);
  591. ASSERT_EQ(condition->condition_values.size(), 1U);
  592. EXPECT_EQ(condition->condition_values[0]->match_type,
  593. apps::PatternMatchType::kMimeType);
  594. EXPECT_EQ(condition->condition_values[0]->value, "6");
  595. }
  596. {
  597. auto& condition = filter->conditions[6];
  598. EXPECT_EQ(condition->condition_type, apps::ConditionType::kFile);
  599. ASSERT_EQ(condition->condition_values.size(), 1U);
  600. EXPECT_EQ(condition->condition_values[0]->match_type,
  601. apps::PatternMatchType::kFileExtension);
  602. EXPECT_EQ(condition->condition_values[0]->value, "7");
  603. }
  604. {
  605. auto& condition = filter->conditions[7];
  606. EXPECT_EQ(condition->condition_type, apps::ConditionType::kHost);
  607. ASSERT_EQ(condition->condition_values.size(), 1U);
  608. EXPECT_EQ(condition->condition_values[0]->match_type,
  609. apps::PatternMatchType::kSuffix);
  610. EXPECT_EQ(condition->condition_values[0]->value, "8");
  611. }
  612. }
  613. // Test that serialization and deserialization works with uninstall source.
  614. TEST(AppServiceTypesMojomTraitsTest, RoundTripUninstallSource) {
  615. apps::UninstallSource input;
  616. {
  617. input = apps::UninstallSource::kUnknown;
  618. apps::UninstallSource output;
  619. ASSERT_TRUE(
  620. mojo::test::SerializeAndDeserialize<crosapi::mojom::UninstallSource>(
  621. input, output));
  622. EXPECT_EQ(output, apps::UninstallSource::kUnknown);
  623. }
  624. {
  625. input = apps::UninstallSource::kAppList;
  626. apps::UninstallSource output;
  627. ASSERT_TRUE(
  628. mojo::test::SerializeAndDeserialize<crosapi::mojom::UninstallSource>(
  629. input, output));
  630. EXPECT_EQ(output, apps::UninstallSource::kAppList);
  631. }
  632. {
  633. input = apps::UninstallSource::kAppManagement;
  634. apps::UninstallSource output;
  635. ASSERT_TRUE(
  636. mojo::test::SerializeAndDeserialize<crosapi::mojom::UninstallSource>(
  637. input, output));
  638. EXPECT_EQ(output, apps::UninstallSource::kAppManagement);
  639. }
  640. {
  641. input = apps::UninstallSource::kShelf;
  642. apps::UninstallSource output;
  643. ASSERT_TRUE(
  644. mojo::test::SerializeAndDeserialize<crosapi::mojom::UninstallSource>(
  645. input, output));
  646. EXPECT_EQ(output, apps::UninstallSource::kShelf);
  647. }
  648. {
  649. input = apps::UninstallSource::kMigration;
  650. apps::UninstallSource output;
  651. ASSERT_TRUE(
  652. mojo::test::SerializeAndDeserialize<crosapi::mojom::UninstallSource>(
  653. input, output));
  654. EXPECT_EQ(output, apps::UninstallSource::kMigration);
  655. }
  656. }
  657. // Test that serialization and deserialization works with icon type.
  658. TEST(AppServiceTypesMojomTraitsTest, RoundTripIconType) {
  659. apps::IconType input;
  660. {
  661. input = apps::IconType::kUnknown;
  662. apps::IconType output;
  663. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconType>(
  664. input, output));
  665. EXPECT_EQ(output, apps::IconType::kUnknown);
  666. }
  667. {
  668. input = apps::IconType::kUncompressed;
  669. apps::IconType output;
  670. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconType>(
  671. input, output));
  672. EXPECT_EQ(output, apps::IconType::kUncompressed);
  673. }
  674. {
  675. input = apps::IconType::kCompressed;
  676. apps::IconType output;
  677. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconType>(
  678. input, output));
  679. EXPECT_EQ(output, apps::IconType::kCompressed);
  680. }
  681. {
  682. input = apps::IconType::kStandard;
  683. apps::IconType output;
  684. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconType>(
  685. input, output));
  686. EXPECT_EQ(output, apps::IconType::kStandard);
  687. }
  688. }
  689. // Test that serialization and deserialization works with icon value.
  690. TEST(AppServiceTypesMojomTraitsTest, RoundTripIconValue) {
  691. {
  692. auto input = std::make_unique<apps::IconValue>();
  693. input->icon_type = apps::IconType::kUnknown;
  694. std::vector<float> scales;
  695. scales.push_back(1.0f);
  696. gfx::ImageSkia::SetSupportedScales(scales);
  697. gfx::ImageSkia image = gfx::test::CreateImageSkia(1, 2);
  698. input->uncompressed = image;
  699. input->compressed = {1u, 2u};
  700. input->is_placeholder_icon = true;
  701. auto output = std::make_unique<apps::IconValue>();
  702. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconValue>(
  703. input, output));
  704. EXPECT_EQ(output->icon_type, apps::IconType::kUnknown);
  705. EXPECT_TRUE(gfx::test::AreImagesEqual(gfx::Image(output->uncompressed),
  706. gfx::Image(image)));
  707. EXPECT_EQ(output->compressed, std::vector<uint8_t>({1u, 2u}));
  708. EXPECT_TRUE(output->is_placeholder_icon);
  709. }
  710. {
  711. auto input = std::make_unique<apps::IconValue>();
  712. input->icon_type = apps::IconType::kUncompressed;
  713. std::vector<float> scales;
  714. scales.push_back(1.0f);
  715. gfx::ImageSkia::SetSupportedScales(scales);
  716. gfx::ImageSkia image = gfx::test::CreateImageSkia(3, 4);
  717. input->uncompressed = image;
  718. input->is_placeholder_icon = false;
  719. auto output = std::make_unique<apps::IconValue>();
  720. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconValue>(
  721. input, output));
  722. EXPECT_EQ(output->icon_type, apps::IconType::kUncompressed);
  723. EXPECT_TRUE(gfx::test::AreImagesEqual(gfx::Image(output->uncompressed),
  724. gfx::Image(image)));
  725. EXPECT_FALSE(output->is_placeholder_icon);
  726. }
  727. {
  728. auto input = std::make_unique<apps::IconValue>();
  729. input->icon_type = apps::IconType::kCompressed;
  730. input->compressed = {3u, 4u};
  731. input->is_placeholder_icon = true;
  732. auto output = std::make_unique<apps::IconValue>();
  733. ;
  734. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::IconValue>(
  735. input, output));
  736. EXPECT_EQ(output->icon_type, apps::IconType::kCompressed);
  737. EXPECT_EQ(output->compressed, std::vector<uint8_t>({3u, 4u}));
  738. EXPECT_TRUE(output->is_placeholder_icon);
  739. }
  740. }
  741. // Test that serialization and deserialization works with window mode.
  742. TEST(AppServiceTypesMojomTraitsTest, RoundTripWindowMode) {
  743. apps::WindowMode input;
  744. {
  745. input = apps::WindowMode::kUnknown;
  746. apps::WindowMode output;
  747. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::WindowMode>(
  748. input, output));
  749. EXPECT_EQ(output, apps::WindowMode::kUnknown);
  750. }
  751. {
  752. input = apps::WindowMode::kWindow;
  753. apps::WindowMode output;
  754. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::WindowMode>(
  755. input, output));
  756. EXPECT_EQ(output, apps::WindowMode::kWindow);
  757. }
  758. {
  759. input = apps::WindowMode::kBrowser;
  760. apps::WindowMode output;
  761. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::WindowMode>(
  762. input, output));
  763. EXPECT_EQ(output, apps::WindowMode::kBrowser);
  764. }
  765. {
  766. input = apps::WindowMode::kTabbedWindow;
  767. apps::WindowMode output;
  768. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::WindowMode>(
  769. input, output));
  770. EXPECT_EQ(output, apps::WindowMode::kTabbedWindow);
  771. }
  772. }
  773. // Test that serialization and deserialization works with launch source.
  774. TEST(AppServiceTypesMojomTraitsTest, RoundTripLaunchSource) {
  775. apps::LaunchSource input;
  776. {
  777. input = apps::LaunchSource::kUnknown;
  778. apps::LaunchSource output;
  779. ASSERT_TRUE(
  780. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  781. input, output));
  782. EXPECT_EQ(output, input);
  783. }
  784. {
  785. input = apps::LaunchSource::kFromAppListGrid;
  786. apps::LaunchSource output;
  787. ASSERT_TRUE(
  788. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  789. input, output));
  790. EXPECT_EQ(output, input);
  791. }
  792. {
  793. input = apps::LaunchSource::kFromAppListGridContextMenu;
  794. apps::LaunchSource output;
  795. ASSERT_TRUE(
  796. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  797. input, output));
  798. EXPECT_EQ(output, input);
  799. }
  800. {
  801. input = apps::LaunchSource::kFromAppListQuery;
  802. apps::LaunchSource output;
  803. ASSERT_TRUE(
  804. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  805. input, output));
  806. EXPECT_EQ(output, input);
  807. }
  808. {
  809. input = apps::LaunchSource::kFromAppListQueryContextMenu;
  810. apps::LaunchSource output;
  811. ASSERT_TRUE(
  812. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  813. input, output));
  814. EXPECT_EQ(output, input);
  815. }
  816. {
  817. input = apps::LaunchSource::kFromAppListRecommendation;
  818. apps::LaunchSource output;
  819. ASSERT_TRUE(
  820. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  821. input, output));
  822. EXPECT_EQ(output, input);
  823. }
  824. {
  825. input = apps::LaunchSource::kFromParentalControls;
  826. apps::LaunchSource output;
  827. ASSERT_TRUE(
  828. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  829. input, output));
  830. EXPECT_EQ(output, input);
  831. }
  832. {
  833. input = apps::LaunchSource::kFromShelf;
  834. apps::LaunchSource output;
  835. ASSERT_TRUE(
  836. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  837. input, output));
  838. EXPECT_EQ(output, input);
  839. }
  840. {
  841. input = apps::LaunchSource::kFromFileManager;
  842. apps::LaunchSource output;
  843. ASSERT_TRUE(
  844. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  845. input, output));
  846. EXPECT_EQ(output, input);
  847. }
  848. {
  849. input = apps::LaunchSource::kFromLink;
  850. apps::LaunchSource output;
  851. ASSERT_TRUE(
  852. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  853. input, output));
  854. EXPECT_EQ(output, input);
  855. }
  856. {
  857. input = apps::LaunchSource::kFromOmnibox;
  858. apps::LaunchSource output;
  859. ASSERT_TRUE(
  860. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  861. input, output));
  862. EXPECT_EQ(output, input);
  863. }
  864. {
  865. input = apps::LaunchSource::kFromChromeInternal;
  866. apps::LaunchSource output;
  867. ASSERT_TRUE(
  868. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  869. input, output));
  870. EXPECT_EQ(output, input);
  871. }
  872. {
  873. input = apps::LaunchSource::kFromKeyboard;
  874. apps::LaunchSource output;
  875. ASSERT_TRUE(
  876. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  877. input, output));
  878. EXPECT_EQ(output, input);
  879. }
  880. {
  881. input = apps::LaunchSource::kFromOtherApp;
  882. apps::LaunchSource output;
  883. ASSERT_TRUE(
  884. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  885. input, output));
  886. EXPECT_EQ(output, input);
  887. }
  888. {
  889. input = apps::LaunchSource::kFromMenu;
  890. apps::LaunchSource output;
  891. ASSERT_TRUE(
  892. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  893. input, output));
  894. EXPECT_EQ(output, input);
  895. }
  896. {
  897. input = apps::LaunchSource::kFromInstalledNotification;
  898. apps::LaunchSource output;
  899. ASSERT_TRUE(
  900. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  901. input, output));
  902. EXPECT_EQ(output, input);
  903. }
  904. {
  905. input = apps::LaunchSource::kFromTest;
  906. apps::LaunchSource output;
  907. ASSERT_TRUE(
  908. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  909. input, output));
  910. EXPECT_EQ(output, input);
  911. }
  912. {
  913. input = apps::LaunchSource::kFromArc;
  914. apps::LaunchSource output;
  915. ASSERT_TRUE(
  916. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  917. input, output));
  918. EXPECT_EQ(output, input);
  919. }
  920. {
  921. input = apps::LaunchSource::kFromSharesheet;
  922. apps::LaunchSource output;
  923. ASSERT_TRUE(
  924. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  925. input, output));
  926. EXPECT_EQ(output, input);
  927. }
  928. {
  929. input = apps::LaunchSource::kFromReleaseNotesNotification;
  930. apps::LaunchSource output;
  931. ASSERT_TRUE(
  932. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  933. input, output));
  934. EXPECT_EQ(output, input);
  935. }
  936. {
  937. input = apps::LaunchSource::kFromFullRestore;
  938. apps::LaunchSource output;
  939. ASSERT_TRUE(
  940. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  941. input, output));
  942. EXPECT_EQ(output, input);
  943. }
  944. {
  945. input = apps::LaunchSource::kFromSmartTextContextMenu;
  946. apps::LaunchSource output;
  947. ASSERT_TRUE(
  948. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  949. input, output));
  950. EXPECT_EQ(output, input);
  951. }
  952. {
  953. input = apps::LaunchSource::kFromDiscoverTabNotification;
  954. apps::LaunchSource output;
  955. ASSERT_TRUE(
  956. mojo::test::SerializeAndDeserialize<crosapi::mojom::LaunchSource>(
  957. input, output));
  958. EXPECT_EQ(output, input);
  959. }
  960. }
  961. TEST(AppServiceTypesMojomTraitsTest, RoundTripPermissions) {
  962. {
  963. auto permission = std::make_unique<apps::Permission>(
  964. apps::PermissionType::kUnknown,
  965. std::make_unique<apps::PermissionValue>(true),
  966. /*is_managed=*/false);
  967. apps::PermissionPtr output;
  968. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  969. permission, output));
  970. EXPECT_EQ(*permission, *output);
  971. }
  972. {
  973. auto permission = std::make_unique<apps::Permission>(
  974. apps::PermissionType::kCamera,
  975. std::make_unique<apps::PermissionValue>(true),
  976. /*is_managed=*/true);
  977. apps::PermissionPtr output;
  978. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  979. permission, output));
  980. EXPECT_EQ(*permission, *output);
  981. }
  982. {
  983. auto permission = std::make_unique<apps::Permission>(
  984. apps::PermissionType::kLocation,
  985. std::make_unique<apps::PermissionValue>(apps::TriState::kAllow),
  986. /*is_managed=*/false);
  987. apps::PermissionPtr output;
  988. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  989. permission, output));
  990. EXPECT_EQ(*permission, *output);
  991. }
  992. {
  993. auto permission = std::make_unique<apps::Permission>(
  994. apps::PermissionType::kMicrophone,
  995. std::make_unique<apps::PermissionValue>(apps::TriState::kBlock),
  996. /*is_managed=*/true);
  997. apps::PermissionPtr output;
  998. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  999. permission, output));
  1000. EXPECT_EQ(*permission, *output);
  1001. }
  1002. {
  1003. auto permission = std::make_unique<apps::Permission>(
  1004. apps::PermissionType::kNotifications,
  1005. std::make_unique<apps::PermissionValue>(apps::TriState::kAsk),
  1006. /*is_managed=*/false);
  1007. apps::PermissionPtr output;
  1008. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  1009. permission, output));
  1010. EXPECT_EQ(*permission, *output);
  1011. }
  1012. {
  1013. auto permission = std::make_unique<apps::Permission>(
  1014. apps::PermissionType::kContacts,
  1015. std::make_unique<apps::PermissionValue>(apps::TriState::kAllow),
  1016. /*is_managed=*/true);
  1017. apps::PermissionPtr output;
  1018. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  1019. permission, output));
  1020. EXPECT_EQ(*permission, *output);
  1021. }
  1022. {
  1023. auto permission = std::make_unique<apps::Permission>(
  1024. apps::PermissionType::kStorage,
  1025. std::make_unique<apps::PermissionValue>(apps::TriState::kBlock),
  1026. /*is_managed=*/false);
  1027. apps::PermissionPtr output;
  1028. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  1029. permission, output));
  1030. EXPECT_EQ(*permission, *output);
  1031. }
  1032. {
  1033. auto permission = std::make_unique<apps::Permission>(
  1034. apps::PermissionType::kFileHandling,
  1035. std::make_unique<apps::PermissionValue>(true),
  1036. /*is_managed=*/false);
  1037. apps::PermissionPtr output;
  1038. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Permission>(
  1039. permission, output));
  1040. EXPECT_EQ(*permission, *output);
  1041. }
  1042. }
  1043. // Test that serialization and deserialization works with updating
  1044. // preferred app.
  1045. TEST(AppServiceTypesMojomTraitsTest, PreferredApp) {
  1046. auto intent_filter = std::make_unique<apps::IntentFilter>();
  1047. intent_filter->AddSingleValueCondition(apps::ConditionType::kScheme, "1",
  1048. apps::PatternMatchType::kLiteral);
  1049. auto input =
  1050. std::make_unique<apps::PreferredApp>(std::move(intent_filter), "abcdefg");
  1051. apps::PreferredAppPtr output;
  1052. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::PreferredApp>(
  1053. input, output));
  1054. EXPECT_EQ(*input, *output);
  1055. }
  1056. // Test that serialization and deserialization works with updating
  1057. // PreferredAppChanges.
  1058. TEST(AppServiceTypesMojomTraitsTest, PreferredAppChanges) {
  1059. apps::IntentFilters added_filters;
  1060. auto intent_filter1 = std::make_unique<apps::IntentFilter>();
  1061. intent_filter1->AddSingleValueCondition(apps::ConditionType::kScheme, "1",
  1062. apps::PatternMatchType::kLiteral);
  1063. auto intent_filter2 = std::make_unique<apps::IntentFilter>();
  1064. intent_filter2->AddSingleValueCondition(apps::ConditionType::kHost, "2",
  1065. apps::PatternMatchType::kLiteral);
  1066. added_filters.push_back(std::move(intent_filter1));
  1067. added_filters.push_back(std::move(intent_filter2));
  1068. apps::IntentFilters removed_filters;
  1069. auto intent_filter3 = std::make_unique<apps::IntentFilter>();
  1070. intent_filter3->AddSingleValueCondition(apps::ConditionType::kPath, "3",
  1071. apps::PatternMatchType::kPrefix);
  1072. auto intent_filter4 = std::make_unique<apps::IntentFilter>();
  1073. intent_filter4->AddSingleValueCondition(apps::ConditionType::kAction, "4",
  1074. apps::PatternMatchType::kGlob);
  1075. removed_filters.push_back(std::move(intent_filter3));
  1076. removed_filters.push_back(std::move(intent_filter4));
  1077. auto input = std::make_unique<apps::PreferredAppChanges>();
  1078. input->added_filters["a"] = std::move(added_filters);
  1079. input->removed_filters["b"] = std::move(removed_filters);
  1080. apps::PreferredAppChangesPtr output;
  1081. ASSERT_TRUE(
  1082. mojo::test::SerializeAndDeserialize<crosapi::mojom::PreferredAppChanges>(
  1083. input, output));
  1084. EXPECT_EQ(input->added_filters.size(), output->added_filters.size());
  1085. for (const auto& added_filters : input->added_filters) {
  1086. EXPECT_TRUE(IsEqual(added_filters.second,
  1087. output->added_filters[added_filters.first]));
  1088. }
  1089. EXPECT_EQ(input->removed_filters.size(), output->removed_filters.size());
  1090. for (const auto& removed_filters : input->removed_filters) {
  1091. EXPECT_TRUE(IsEqual(removed_filters.second,
  1092. output->removed_filters[removed_filters.first]));
  1093. }
  1094. }
  1095. TEST(AppServiceTypesMojomTraitsTest, RoundTripShortcuts) {
  1096. {
  1097. auto shortcut = std::make_unique<apps::Shortcut>("test_id", "test_name",
  1098. /*position*/ 1);
  1099. apps::ShortcutPtr output;
  1100. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Shortcut>(
  1101. shortcut, output));
  1102. EXPECT_EQ(*shortcut, *output);
  1103. }
  1104. {
  1105. auto shortcut = std::make_unique<apps::Shortcut>("", "", /*position*/ 0);
  1106. apps::ShortcutPtr output;
  1107. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Shortcut>(
  1108. shortcut, output));
  1109. EXPECT_EQ(*shortcut, *output);
  1110. }
  1111. {
  1112. auto shortcut =
  1113. std::make_unique<apps::Shortcut>("A", "B", /*position*/ 100);
  1114. apps::ShortcutPtr output;
  1115. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Shortcut>(
  1116. shortcut, output));
  1117. EXPECT_EQ(*shortcut, *output);
  1118. }
  1119. {
  1120. auto shortcut = std::make_unique<apps::Shortcut>("", "B", /*position*/ 1);
  1121. apps::ShortcutPtr output;
  1122. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Shortcut>(
  1123. shortcut, output));
  1124. EXPECT_EQ(*shortcut, *output);
  1125. }
  1126. {
  1127. auto shortcut = std::make_unique<apps::Shortcut>("A", "", /*position*/ 1);
  1128. apps::ShortcutPtr output;
  1129. ASSERT_TRUE(mojo::test::SerializeAndDeserialize<crosapi::mojom::Shortcut>(
  1130. shortcut, output));
  1131. EXPECT_EQ(*shortcut, *output);
  1132. }
  1133. }