tag_unittest.cc 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  1. // Copyright 2020 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 "chrome/updater/tag.h"
  5. #include "base/strings/string_piece.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. namespace {
  8. using updater::tagging::AppArgs;
  9. using updater::tagging::ErrorCode;
  10. using updater::tagging::TagArgs;
  11. // Builder pattern helper to construct the TagArgs struct.
  12. class TagArgsBuilder {
  13. public:
  14. TagArgs Build() { return std::move(inner_); }
  15. TagArgsBuilder& WithBundleName(const std::string& bundle_name) {
  16. this->inner_.bundle_name = bundle_name;
  17. return *this;
  18. }
  19. TagArgsBuilder& WithInstallationId(const std::string& installation_id) {
  20. this->inner_.installation_id = installation_id;
  21. return *this;
  22. }
  23. TagArgsBuilder& WithBrandCode(const std::string& brand_code) {
  24. this->inner_.brand_code = brand_code;
  25. return *this;
  26. }
  27. TagArgsBuilder& WithClientId(const std::string& client_id) {
  28. this->inner_.client_id = client_id;
  29. return *this;
  30. }
  31. TagArgsBuilder& WithExperimentLabels(const std::string& experiment_labels) {
  32. this->inner_.experiment_labels = experiment_labels;
  33. return *this;
  34. }
  35. TagArgsBuilder& WithReferralId(const std::string& referral_id) {
  36. this->inner_.referral_id = referral_id;
  37. return *this;
  38. }
  39. TagArgsBuilder& WithLanguage(const std::string& language) {
  40. this->inner_.language = language;
  41. return *this;
  42. }
  43. TagArgsBuilder& WithFlighting(bool flighting) {
  44. this->inner_.flighting = flighting;
  45. return *this;
  46. }
  47. TagArgsBuilder& WithBrowserType(TagArgs::BrowserType browser_type) {
  48. this->inner_.browser_type = browser_type;
  49. return *this;
  50. }
  51. TagArgsBuilder& WithUsageStatsEnable(bool usage_stats_enable) {
  52. this->inner_.usage_stats_enable = usage_stats_enable;
  53. return *this;
  54. }
  55. TagArgsBuilder& WithApp(AppArgs app) {
  56. this->inner_.apps.push_back(std::move(app));
  57. return *this;
  58. }
  59. private:
  60. TagArgs inner_;
  61. };
  62. // Builder pattern helper to construct the AppArgs struct.
  63. class AppArgsBuilder {
  64. public:
  65. explicit AppArgsBuilder(const std::string& app_id) : inner_(app_id) {}
  66. AppArgs Build() { return std::move(inner_); }
  67. AppArgsBuilder& WithAppName(const std::string& app_name) {
  68. this->inner_.app_name = app_name;
  69. return *this;
  70. }
  71. AppArgsBuilder& WithNeedsAdmin(AppArgs::NeedsAdmin needs_admin) {
  72. this->inner_.needs_admin = needs_admin;
  73. return *this;
  74. }
  75. AppArgsBuilder& WithAp(const std::string& ap) {
  76. this->inner_.ap = ap;
  77. return *this;
  78. }
  79. AppArgsBuilder& WithEncodedInstallerData(
  80. const std::string& encoded_installer_data) {
  81. this->inner_.encoded_installer_data = encoded_installer_data;
  82. return *this;
  83. }
  84. AppArgsBuilder& WithInstallDataIndex(const std::string& install_data_index) {
  85. this->inner_.install_data_index = install_data_index;
  86. return *this;
  87. }
  88. AppArgsBuilder& WithExperimentLabels(const std::string& experiment_labels) {
  89. this->inner_.experiment_labels = experiment_labels;
  90. return *this;
  91. }
  92. AppArgsBuilder& WithUntrustedData(const std::string& untrusted_data) {
  93. this->inner_.untrusted_data = untrusted_data;
  94. return *this;
  95. }
  96. private:
  97. AppArgs inner_;
  98. };
  99. void VerifyTagParseSuccess(
  100. base::StringPiece tag,
  101. absl::optional<base::StringPiece> app_installer_data_args,
  102. const TagArgs& expected) {
  103. TagArgs actual;
  104. ASSERT_EQ(ErrorCode::kSuccess, Parse(tag, app_installer_data_args, &actual));
  105. EXPECT_EQ(expected.bundle_name, actual.bundle_name);
  106. EXPECT_EQ(expected.installation_id, actual.installation_id);
  107. EXPECT_EQ(expected.brand_code, actual.brand_code);
  108. EXPECT_EQ(expected.client_id, actual.client_id);
  109. EXPECT_EQ(expected.experiment_labels, actual.experiment_labels);
  110. EXPECT_EQ(expected.referral_id, actual.referral_id);
  111. EXPECT_EQ(expected.language, actual.language);
  112. EXPECT_EQ(expected.browser_type, actual.browser_type);
  113. EXPECT_EQ(expected.usage_stats_enable, actual.usage_stats_enable);
  114. EXPECT_EQ(expected.apps.size(), actual.apps.size());
  115. for (size_t i = 0; i < actual.apps.size(); ++i) {
  116. const AppArgs& app_expected = expected.apps[i];
  117. const AppArgs& app_actual = actual.apps[i];
  118. EXPECT_EQ(app_expected.app_id, app_actual.app_id);
  119. EXPECT_EQ(app_expected.app_name, app_actual.app_name);
  120. EXPECT_EQ(app_expected.needs_admin, app_actual.needs_admin);
  121. EXPECT_EQ(app_expected.ap, app_actual.ap);
  122. EXPECT_EQ(app_expected.encoded_installer_data,
  123. app_actual.encoded_installer_data);
  124. EXPECT_EQ(app_expected.install_data_index, app_actual.install_data_index);
  125. EXPECT_EQ(app_expected.experiment_labels, app_actual.experiment_labels);
  126. }
  127. }
  128. void VerifyTagParseFail(
  129. base::StringPiece tag,
  130. absl::optional<base::StringPiece> app_installer_data_args,
  131. ErrorCode expected) {
  132. TagArgs args;
  133. ASSERT_EQ(expected, Parse(tag, app_installer_data_args, &args));
  134. }
  135. } // namespace
  136. namespace updater {
  137. using tagging::AppArgs;
  138. using tagging::ErrorCode;
  139. using tagging::Parse;
  140. using tagging::TagArgs;
  141. TEST(TagParserTest, InvalidValueNameIsSupersetOfValidName) {
  142. VerifyTagParseFail(
  143. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  144. "appname1=Hello",
  145. absl::nullopt, ErrorCode::kUnrecognizedName);
  146. }
  147. TEST(TagParserTest, AppNameSpaceForValue) {
  148. VerifyTagParseFail(
  149. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  150. "appname= ",
  151. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  152. }
  153. TEST(TagParserTest, AppNameEncodedSpaceForValue) {
  154. VerifyTagParseFail(
  155. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  156. "appname=%20",
  157. absl::nullopt, ErrorCode::kApp_AppNameCannotBeWhitespace);
  158. }
  159. TEST(TagParserTest, AppNameValid) {
  160. VerifyTagParseSuccess(
  161. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  162. "appname=Test",
  163. absl::nullopt,
  164. TagArgsBuilder()
  165. .WithBundleName("Test")
  166. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  167. .WithAppName("Test")
  168. .Build())
  169. .Build());
  170. }
  171. // This must work because the enterprise MSI code assumes spaces are allowed.
  172. TEST(TagParserTest, AppNameWithSpace) {
  173. VerifyTagParseSuccess(
  174. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  175. "appname=Test App",
  176. absl::nullopt,
  177. TagArgsBuilder()
  178. .WithBundleName("Test App")
  179. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  180. .WithAppName("Test App")
  181. .Build())
  182. .Build());
  183. }
  184. TEST(TagParserTest, AppNameWithSpaceAtEnd) {
  185. VerifyTagParseSuccess(
  186. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  187. "appname= T Ap p ",
  188. absl::nullopt,
  189. TagArgsBuilder()
  190. .WithBundleName("T Ap p")
  191. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  192. .WithAppName("T Ap p")
  193. .Build())
  194. .Build());
  195. }
  196. TEST(TagParserTest, AppNameWithEncodedSpacesAtEnd) {
  197. VerifyTagParseSuccess(
  198. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  199. "appname=%20T%20Ap%20p%20",
  200. absl::nullopt,
  201. TagArgsBuilder()
  202. .WithBundleName("T Ap p")
  203. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  204. .WithAppName("T Ap p")
  205. .Build())
  206. .Build());
  207. }
  208. TEST(TagParserTest, AppNameWithMultipleSpaces) {
  209. VerifyTagParseSuccess(
  210. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  211. "appname= T Ap p",
  212. absl::nullopt,
  213. TagArgsBuilder()
  214. .WithBundleName("T Ap p")
  215. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  216. .WithAppName("T Ap p")
  217. .Build())
  218. .Build());
  219. }
  220. TEST(TagParserTest, AppNameUnicode) {
  221. std::string non_ascii_name = "रहा";
  222. VerifyTagParseSuccess(
  223. "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&"
  224. "appname=%E0%A4%B0%E0%A4%B9%E0%A4%BE",
  225. absl::nullopt,
  226. TagArgsBuilder()
  227. .WithBundleName(non_ascii_name)
  228. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  229. .WithAppName(non_ascii_name)
  230. .Build())
  231. .Build());
  232. }
  233. TEST(TagParserTest, AppNameUnicode2) {
  234. std::string non_ascii_name = "स्थापित कर रहा है।";
  235. std::string escaped(
  236. "%E0%A4%B8%E0%A5%8D%E0%A4%A5%E0%A4%BE%E0%A4%AA%E0%A4%BF"
  237. "%E0%A4%A4%20%E0%A4%95%E0%A4%B0%20%E0%A4%B0%E0%A4%B9%E0"
  238. "%A4%BE%20%E0%A4%B9%E0%A5%88%E0%A5%A4");
  239. std::stringstream tag;
  240. tag << "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&";
  241. tag << "appname=" << escaped;
  242. VerifyTagParseSuccess(
  243. tag.str(), absl::nullopt,
  244. TagArgsBuilder()
  245. .WithBundleName(non_ascii_name)
  246. .WithApp(AppArgsBuilder("d0324988-da8a-49e5-bce5-925fcd04eab7")
  247. .WithAppName(non_ascii_name)
  248. .Build())
  249. .Build());
  250. }
  251. TEST(TagParserTest, AppIdValid) {
  252. VerifyTagParseSuccess(
  253. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B", absl::nullopt,
  254. TagArgsBuilder()
  255. .WithApp(
  256. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  257. .Build());
  258. }
  259. TEST(TagParserTest, AppIdNotASCII) {
  260. VerifyTagParseFail("appguid=रहा", absl::nullopt,
  261. ErrorCode::kApp_AppIdIsNotValid);
  262. }
  263. // Most tests here do not reflect this, but appids can be non-GUID ASCII
  264. // strings.
  265. TEST(TagParserTest, AppIdNotAGuid) {
  266. VerifyTagParseSuccess(
  267. "appguid=non-guid-id", absl::nullopt,
  268. TagArgsBuilder().WithApp(AppArgsBuilder("non-guid-id").Build()).Build());
  269. }
  270. TEST(TagParserTest, AppIdCaseInsensitive) {
  271. VerifyTagParseSuccess(
  272. "appguid=ShouldBeCaseInsensitive", absl::nullopt,
  273. TagArgsBuilder()
  274. .WithApp(AppArgsBuilder("shouldbecaseinsensitive").Build())
  275. .Build());
  276. }
  277. TEST(TagParserTest, NeedsAdminInvalid) {
  278. VerifyTagParseFail(
  279. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  280. "needsadmin=Hello",
  281. absl::nullopt, ErrorCode::kApp_NeedsAdminValueIsInvalid);
  282. }
  283. TEST(TagParserTest, NeedsAdminSpaceForValue) {
  284. VerifyTagParseFail(
  285. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  286. "needsadmin= ",
  287. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  288. }
  289. TEST(TagParserTest, NeedsAdminTrueUpperCaseT) {
  290. VerifyTagParseSuccess(
  291. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  292. "needsadmin=True",
  293. absl::nullopt,
  294. TagArgsBuilder()
  295. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  296. .WithNeedsAdmin(AppArgs::NeedsAdmin::kYes)
  297. .Build())
  298. .Build());
  299. }
  300. TEST(TagParserTest, NeedsAdminTrueLowerCaseT) {
  301. VerifyTagParseSuccess(
  302. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  303. "needsadmin=true",
  304. absl::nullopt,
  305. TagArgsBuilder()
  306. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  307. .WithNeedsAdmin(AppArgs::NeedsAdmin::kYes)
  308. .Build())
  309. .Build());
  310. }
  311. TEST(TagParserTest, NeedsFalseUpperCaseF) {
  312. VerifyTagParseSuccess(
  313. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  314. "needsadmin=False",
  315. absl::nullopt,
  316. TagArgsBuilder()
  317. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  318. .WithNeedsAdmin(AppArgs::NeedsAdmin::kNo)
  319. .Build())
  320. .Build());
  321. }
  322. TEST(TagParserTest, NeedsAdminFalseLowerCaseF) {
  323. VerifyTagParseSuccess(
  324. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  325. "needsadmin=false",
  326. absl::nullopt,
  327. TagArgsBuilder()
  328. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  329. .WithNeedsAdmin(AppArgs::NeedsAdmin::kNo)
  330. .Build())
  331. .Build());
  332. }
  333. //
  334. // Test the handling of the contents of the extra arguments.
  335. //
  336. TEST(TagParserTest, AssignmentOnly) {
  337. VerifyTagParseFail("=", absl::nullopt, ErrorCode::kUnrecognizedName);
  338. }
  339. TEST(TagParserTest, ExtraAssignment1) {
  340. VerifyTagParseFail(
  341. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  342. "usagestats=1=",
  343. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  344. }
  345. TEST(TagParserTest, ExtraAssignment2) {
  346. VerifyTagParseFail(
  347. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  348. "=usagestats=1",
  349. absl::nullopt, ErrorCode::kUnrecognizedName);
  350. }
  351. TEST(TagParserTest, ExtraAssignment3) {
  352. VerifyTagParseFail(
  353. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  354. "usagestats=1&=",
  355. absl::nullopt, ErrorCode::kUnrecognizedName);
  356. }
  357. TEST(TagParserTest, ExtraAssignment4) {
  358. VerifyTagParseFail(
  359. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  360. "=&usagestats=1",
  361. absl::nullopt, ErrorCode::kUnrecognizedName);
  362. }
  363. TEST(TagParserTest, ValueWithoutName) {
  364. VerifyTagParseFail(
  365. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  366. "=hello",
  367. absl::nullopt, ErrorCode::kUnrecognizedName);
  368. }
  369. // Also tests ending extra arguments with '='.
  370. TEST(TagParserTest, NameWithoutValue) {
  371. VerifyTagParseFail(
  372. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  373. "usagestats=",
  374. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  375. }
  376. TEST(TagParserTest, NameWithoutValueBeforeNextArgument) {
  377. VerifyTagParseFail(
  378. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  379. "usagestats=&client=hello",
  380. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  381. }
  382. TEST(TagParserTest, NameWithoutArgumentSeparatorAfterIntValue) {
  383. VerifyTagParseFail(
  384. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  385. "usagestats=1client=hello",
  386. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  387. }
  388. TEST(TagParserTest, NameWithoutArgumentSeparatorAfterStringValue) {
  389. VerifyTagParseFail(
  390. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  391. "usagestats=yesclient=hello",
  392. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  393. }
  394. TEST(TagParserTest, TagHasDoubleAmpersand) {
  395. VerifyTagParseSuccess(
  396. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  397. "usagestats=1&&client=hello",
  398. {"appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  399. "installerdata=foobar"},
  400. TagArgsBuilder()
  401. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  402. .WithEncodedInstallerData("foobar")
  403. .Build())
  404. .WithUsageStatsEnable(true)
  405. .WithClientId("hello")
  406. .Build());
  407. }
  408. TEST(TagParserTest, TagAmpersandOnly) {
  409. VerifyTagParseSuccess("&", absl::nullopt, TagArgsBuilder().Build());
  410. }
  411. TEST(TagParserTest, TagBeginsInAmpersand) {
  412. VerifyTagParseSuccess(
  413. "&appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  414. "usagestats=1",
  415. absl::nullopt,
  416. TagArgsBuilder()
  417. .WithApp(
  418. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  419. .WithUsageStatsEnable(true)
  420. .Build());
  421. }
  422. TEST(TagParserTest, TagEndsInAmpersand) {
  423. VerifyTagParseSuccess(
  424. "&appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  425. "usagestats=1&",
  426. absl::nullopt,
  427. TagArgsBuilder()
  428. .WithApp(
  429. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  430. .WithUsageStatsEnable(true)
  431. .Build());
  432. }
  433. TEST(TagParserTest, WhitespaceOnly) {
  434. for (const auto* whitespace : {"", " ", "\t", "\r", "\n", "\r\n"}) {
  435. VerifyTagParseSuccess(whitespace, absl::nullopt, TagArgsBuilder().Build());
  436. }
  437. }
  438. //
  439. // Test the parsing of the extra command and its arguments into a string.
  440. //
  441. TEST(TagParserTest, OneValidAttribute) {
  442. VerifyTagParseSuccess(
  443. "&appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  444. "usagestats=1",
  445. absl::nullopt,
  446. TagArgsBuilder()
  447. .WithApp(
  448. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  449. .WithUsageStatsEnable(true)
  450. .Build());
  451. }
  452. TEST(TagParserTest, TwoValidAttributes) {
  453. VerifyTagParseSuccess(
  454. "&appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  455. "usagestats=1&client=hello",
  456. absl::nullopt,
  457. TagArgsBuilder()
  458. .WithApp(
  459. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  460. .WithUsageStatsEnable(true)
  461. .WithClientId("hello")
  462. .Build());
  463. }
  464. TEST(TagParserTest, TagHasSwitchInTheMiddle) {
  465. VerifyTagParseFail(
  466. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  467. "usagestats=1/other_value=9",
  468. absl::nullopt, ErrorCode::kTagIsInvalid);
  469. }
  470. TEST(TagParserTest, TagHasDoubleQuoteInTheMiddle) {
  471. VerifyTagParseFail(
  472. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  473. "usagestats=1\"/other_value=9",
  474. absl::nullopt, ErrorCode::kTagIsInvalid);
  475. }
  476. TEST(TagParserTest, TagHasDoubleQuoteInTheMiddleAndNoForwardSlash) {
  477. VerifyTagParseFail(
  478. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  479. "usagestats=1\"other_value=9",
  480. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  481. }
  482. TEST(TagParserTest, TagHasSpaceAndForwardSlashBeforeQuote) {
  483. VerifyTagParseFail(
  484. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  485. "usagestats=1 /other_value=9",
  486. absl::nullopt, ErrorCode::kTagIsInvalid);
  487. }
  488. TEST(TagParserTest, TagHasForwardSlashBeforeQuote) {
  489. VerifyTagParseFail(
  490. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  491. "usagestats=1/other_value=9",
  492. absl::nullopt, ErrorCode::kTagIsInvalid);
  493. }
  494. TEST(TagParserTest, AttributeSpecifiedTwice) {
  495. VerifyTagParseFail(
  496. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  497. "usagestats=1\" \"client=10",
  498. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  499. }
  500. TEST(TagParserTest, WhiteSpaceBeforeArgs1) {
  501. VerifyTagParseSuccess(
  502. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  503. " usagestats=1",
  504. absl::nullopt,
  505. TagArgsBuilder()
  506. .WithApp(
  507. AppArgsBuilder("8617EE50-F91C-4DC1-B937-0969EEF59B0B").Build())
  508. .WithUsageStatsEnable(true)
  509. .Build());
  510. }
  511. TEST(TagParserTest, WhiteSpaceBeforeArgs2) {
  512. VerifyTagParseSuccess(
  513. "\tappguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  514. "usagestats=1",
  515. absl::nullopt,
  516. TagArgsBuilder()
  517. .WithApp(
  518. AppArgsBuilder("8617EE50-F91C-4DC1-B937-0969EEF59B0B").Build())
  519. .WithUsageStatsEnable(true)
  520. .Build());
  521. }
  522. TEST(TagParserTest, WhiteSpaceBeforeArgs3) {
  523. VerifyTagParseSuccess(
  524. "\rappguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  525. "usagestats=1",
  526. absl::nullopt,
  527. TagArgsBuilder()
  528. .WithApp(
  529. AppArgsBuilder("8617EE50-F91C-4DC1-B937-0969EEF59B0B").Build())
  530. .WithUsageStatsEnable(true)
  531. .Build());
  532. }
  533. TEST(TagParserTest, WhiteSpaceBeforeArgs4) {
  534. VerifyTagParseSuccess(
  535. "\nappguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B"
  536. "&usagestats=1",
  537. absl::nullopt,
  538. TagArgsBuilder()
  539. .WithApp(
  540. AppArgsBuilder("8617EE50-F91C-4DC1-B937-0969EEF59B0B").Build())
  541. .WithUsageStatsEnable(true)
  542. .Build());
  543. }
  544. TEST(TagParserTest, WhiteSpaceBeforeArgs5) {
  545. VerifyTagParseSuccess("\r\nusagestats=1", absl::nullopt,
  546. TagArgsBuilder().WithUsageStatsEnable(true).Build());
  547. }
  548. TEST(TagParserTest, ForwardSlash1) {
  549. VerifyTagParseFail("/", absl::nullopt, ErrorCode::kTagIsInvalid);
  550. }
  551. TEST(TagParserTest, ForwardSlash2) {
  552. VerifyTagParseFail("/ appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B",
  553. absl::nullopt, ErrorCode::kTagIsInvalid);
  554. }
  555. TEST(TagParserTest, BackwardSlash1) {
  556. VerifyTagParseFail("\\", absl::nullopt, ErrorCode::kUnrecognizedName);
  557. }
  558. TEST(TagParserTest, BackwardSlash2) {
  559. VerifyTagParseFail("\\appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B",
  560. absl::nullopt, ErrorCode::kUnrecognizedName);
  561. }
  562. TEST(TagParserTest, BackwardSlash3) {
  563. VerifyTagParseFail("\\ appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B",
  564. absl::nullopt, ErrorCode::kUnrecognizedName);
  565. }
  566. TEST(TagParserTest, AppArgsMustHaveValue) {
  567. for (const auto* tag :
  568. {"appguid", "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&ap",
  569. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&experiments",
  570. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&appname",
  571. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&needsadmin",
  572. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&installdataindex",
  573. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&untrusteddata"}) {
  574. VerifyTagParseFail(tag, absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  575. }
  576. }
  577. //
  578. // Test specific extra commands.
  579. //
  580. TEST(TagParserTest, UsageStatsOutsideExtraCommand) {
  581. VerifyTagParseFail(
  582. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  583. "/usagestats",
  584. absl::nullopt, ErrorCode::kTagIsInvalid);
  585. }
  586. TEST(TagParserTest, UsageStatsOn) {
  587. VerifyTagParseSuccess(
  588. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  589. "usagestats=1",
  590. absl::nullopt,
  591. TagArgsBuilder()
  592. .WithApp(
  593. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  594. .WithUsageStatsEnable(true)
  595. .Build());
  596. }
  597. TEST(TagParserTest, UsageStatsOff) {
  598. VerifyTagParseSuccess(
  599. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  600. "usagestats=0",
  601. absl::nullopt,
  602. TagArgsBuilder()
  603. .WithApp(
  604. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  605. .WithUsageStatsEnable(false)
  606. .Build());
  607. }
  608. TEST(TagParserTest, UsageStatsNone) {
  609. VerifyTagParseSuccess(
  610. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  611. "usagestats=2",
  612. absl::nullopt,
  613. TagArgsBuilder()
  614. .WithApp(
  615. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  616. .Build());
  617. }
  618. TEST(TagParserTest, UsageStatsInvalidPositiveValue) {
  619. VerifyTagParseFail(
  620. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  621. "usagestats=3",
  622. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  623. }
  624. TEST(TagParserTest, UsageStatsInvalidNegativeValue) {
  625. VerifyTagParseFail(
  626. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  627. "usagestats=-1",
  628. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  629. }
  630. TEST(TagParserTest, UsageStatsValueIsString) {
  631. VerifyTagParseFail(
  632. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  633. "usagestats=true",
  634. absl::nullopt, ErrorCode::kGlobal_UsageStatsValueIsInvalid);
  635. }
  636. TEST(TagParserTest, BundleNameValid) {
  637. VerifyTagParseSuccess(
  638. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  639. "bundlename=Google%20Bundle",
  640. absl::nullopt,
  641. TagArgsBuilder()
  642. .WithApp(
  643. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  644. .WithBundleName("Google Bundle")
  645. .Build());
  646. }
  647. TEST(TagParserTest, BundleNameSpaceForValue) {
  648. VerifyTagParseFail(
  649. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  650. "bundlename= ",
  651. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  652. }
  653. TEST(TagParserTest, BundleNameEncodedSpaceForValue) {
  654. VerifyTagParseFail(
  655. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  656. "bundlename=%20",
  657. absl::nullopt, ErrorCode::kGlobal_BundleNameCannotBeWhitespace);
  658. }
  659. TEST(TagParserTest, BundleNameNotPresentButAppNameIs) {
  660. VerifyTagParseSuccess(
  661. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  662. "appname=Google%20Chrome",
  663. absl::nullopt,
  664. TagArgsBuilder()
  665. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  666. .WithAppName("Google Chrome")
  667. .Build())
  668. .WithBundleName("Google Chrome")
  669. .Build());
  670. }
  671. TEST(TagParserTest, BundleNameNorAppNamePresent) {
  672. VerifyTagParseSuccess(
  673. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&", absl::nullopt,
  674. TagArgsBuilder()
  675. .WithApp(
  676. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  677. .Build());
  678. }
  679. TEST(TagParserTest, BundleNameNotPresentAndNoApp) {
  680. VerifyTagParseSuccess(
  681. "browser=0", absl::nullopt,
  682. TagArgsBuilder().WithBrowserType(TagArgs::BrowserType::kUnknown).Build());
  683. }
  684. TEST(TagParserTest, InstallationIdValid) {
  685. VerifyTagParseSuccess(
  686. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  687. "iid=98CEC468-9429-4984-AEDE-4F53C6A14869",
  688. absl::nullopt,
  689. TagArgsBuilder()
  690. .WithApp(
  691. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  692. .WithInstallationId("98CEC468-9429-4984-AEDE-4F53C6A14869")
  693. .Build());
  694. }
  695. TEST(TagParserTest, InstallationIdContainsNonASCII) {
  696. VerifyTagParseSuccess(
  697. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  698. "iid=रहा",
  699. absl::nullopt,
  700. TagArgsBuilder()
  701. .WithApp(
  702. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  703. .WithInstallationId("रहा")
  704. .Build());
  705. }
  706. TEST(TagParserTest, BrandCodeValid) {
  707. VerifyTagParseSuccess(
  708. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  709. "brand=GOOG",
  710. absl::nullopt,
  711. TagArgsBuilder()
  712. .WithApp(
  713. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  714. .WithBrandCode("GOOG")
  715. .Build());
  716. }
  717. TEST(TagParserTest, ClientIdValid) {
  718. VerifyTagParseSuccess(
  719. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  720. "client=some_partner",
  721. absl::nullopt,
  722. TagArgsBuilder()
  723. .WithApp(
  724. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  725. .WithClientId("some_partner")
  726. .Build());
  727. }
  728. TEST(TagParserTest, UpdaterExperimentIdValid) {
  729. VerifyTagParseSuccess(
  730. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  731. "omahaexperiments=experiment%3DgroupA%7Cexpir",
  732. absl::nullopt,
  733. TagArgsBuilder()
  734. .WithApp(
  735. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  736. .WithExperimentLabels("experiment=groupA|expir")
  737. .Build());
  738. }
  739. TEST(TagParserTest, UpdaterExperimentIdSpaceForValue) {
  740. VerifyTagParseFail(
  741. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  742. "omahaexperiments= ",
  743. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  744. }
  745. TEST(TagParserTest, UpdaterExperimentIdEncodedSpaceForValue) {
  746. VerifyTagParseFail(
  747. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  748. "omahaexperiments=%20",
  749. absl::nullopt, ErrorCode::kGlobal_ExperimentLabelsCannotBeWhitespace);
  750. }
  751. TEST(TagParserTest, AppExperimentIdValid) {
  752. VerifyTagParseSuccess(
  753. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  754. "experiments=experiment%3DgroupA%7Cexpir",
  755. absl::nullopt,
  756. TagArgsBuilder()
  757. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  758. .WithExperimentLabels("experiment=groupA|expir")
  759. .Build())
  760. .Build());
  761. }
  762. TEST(TagParserTest, AppExperimentIdSpaceForValue) {
  763. VerifyTagParseFail(
  764. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  765. "experiments= ",
  766. absl::nullopt, ErrorCode::kAttributeMustHaveValue);
  767. }
  768. TEST(TagParserTest, AppExperimentIdEncodedSpaceForValue) {
  769. VerifyTagParseFail(
  770. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  771. "experiments=%20",
  772. absl::nullopt, ErrorCode::kApp_ExperimentLabelsCannotBeWhitespace);
  773. }
  774. TEST(TagParserTest, ReferralIdValid) {
  775. VerifyTagParseSuccess(
  776. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  777. "referral=ABCD123",
  778. absl::nullopt,
  779. TagArgsBuilder()
  780. .WithApp(
  781. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  782. .WithReferralId("ABCD123")
  783. .Build());
  784. }
  785. TEST(TagParserTest, ApValid) {
  786. VerifyTagParseSuccess(
  787. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  788. "ap=developer",
  789. absl::nullopt,
  790. TagArgsBuilder()
  791. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  792. .WithAp("developer")
  793. .Build())
  794. .Build());
  795. }
  796. TEST(TagParserTest, AppInstallerDataArgsValid) {
  797. VerifyTagParseSuccess(
  798. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&",
  799. {"appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  800. "installerdata=%E0%A4foobar"},
  801. TagArgsBuilder()
  802. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  803. .WithEncodedInstallerData("%E0%A4foobar")
  804. .Build())
  805. .Build());
  806. }
  807. TEST(TagParserTest, AppInstallerDataArgsInvalidAppId) {
  808. VerifyTagParseFail("appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&",
  809. {"appguid=E135384F-85A2-4328-B07D-2CF70313D505&"
  810. "installerdata=%E0%A4foobar"},
  811. ErrorCode::kAppInstallerData_AppIdNotFound);
  812. }
  813. TEST(TagParserTest, AppInstallerDataArgsInvalidAttribute) {
  814. VerifyTagParseFail("appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&",
  815. {"appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  816. "needsadmin=true&"},
  817. ErrorCode::kUnrecognizedName);
  818. }
  819. TEST(TagParserTest, InstallerDataNotAllowedInTag) {
  820. VerifyTagParseFail(
  821. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  822. "appname=TestApp2&"
  823. "needsadmin=true&"
  824. "installerdata=Hello%20World",
  825. absl::nullopt, ErrorCode::kUnrecognizedName);
  826. }
  827. TEST(TagParserTest, InstallDataIndexValid) {
  828. VerifyTagParseSuccess(
  829. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  830. "installdataindex=foobar",
  831. absl::nullopt,
  832. TagArgsBuilder()
  833. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  834. .WithInstallDataIndex("foobar")
  835. .Build())
  836. .Build());
  837. }
  838. TEST(TagParserTest, BrowserTypeValid) {
  839. std::tuple<base::StringPiece, TagArgs::BrowserType>
  840. pairs[static_cast<int>(TagArgs::BrowserType::kMax)] = {
  841. {"0", TagArgs::BrowserType::kUnknown},
  842. {"1", TagArgs::BrowserType::kDefault},
  843. {"2", TagArgs::BrowserType::kInternetExplorer},
  844. {"3", TagArgs::BrowserType::kFirefox},
  845. {"4", TagArgs::BrowserType::kChrome},
  846. };
  847. for (const auto& pair : pairs) {
  848. std::stringstream tag;
  849. tag << "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&";
  850. tag << "browser=" << std::get<0>(pair);
  851. VerifyTagParseSuccess(
  852. tag.str(), absl::nullopt,
  853. TagArgsBuilder()
  854. .WithApp(
  855. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  856. .WithBrowserType(std::get<1>(pair))
  857. .Build());
  858. }
  859. }
  860. TEST(TagParserTest, BrowserTypeInvalid) {
  861. EXPECT_EQ(5, int(TagArgs::BrowserType::kMax))
  862. << "Browser type may have been added. Update the BrowserTypeValid test "
  863. "and change browser values in tag strings below.";
  864. VerifyTagParseSuccess(
  865. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  866. "browser=5",
  867. absl::nullopt,
  868. TagArgsBuilder()
  869. .WithApp(
  870. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  871. .WithBrowserType(TagArgs::BrowserType::kUnknown)
  872. .Build());
  873. VerifyTagParseSuccess(
  874. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  875. "browser=9",
  876. absl::nullopt,
  877. TagArgsBuilder()
  878. .WithApp(
  879. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  880. .WithBrowserType(TagArgs::BrowserType::kUnknown)
  881. .Build());
  882. }
  883. TEST(TagParserTest, ValidLang) {
  884. VerifyTagParseSuccess(
  885. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  886. "lang=en",
  887. absl::nullopt,
  888. TagArgsBuilder()
  889. .WithApp(
  890. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  891. .WithLanguage("en")
  892. .Build());
  893. }
  894. // Language must be passed even if not supported. See http://b/1336966.
  895. TEST(TagParserTest, UnsupportedLang) {
  896. VerifyTagParseSuccess(
  897. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  898. "lang=foobar",
  899. absl::nullopt,
  900. TagArgsBuilder()
  901. .WithApp(
  902. AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b").Build())
  903. .WithLanguage("foobar")
  904. .Build());
  905. }
  906. TEST(TagParserTest, AppNameSpecifiedTwice) {
  907. VerifyTagParseSuccess(
  908. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  909. "appname=TestApp&"
  910. "appname=TestApp2&",
  911. absl::nullopt,
  912. TagArgsBuilder()
  913. .WithApp(AppArgsBuilder("8617EE50-F91C-4DC1-B937-0969EEF59B0B")
  914. .WithAppName("TestApp2")
  915. .Build())
  916. .WithBundleName("TestApp2")
  917. .Build());
  918. }
  919. TEST(TagParserTest, CaseInsensitiveAttributeNames) {
  920. VerifyTagParseSuccess(
  921. "APPguID=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  922. "APPNAME=TestApp&",
  923. absl::nullopt,
  924. TagArgsBuilder()
  925. .WithApp(AppArgsBuilder("8617EE50-F91C-4DC1-B937-0969EEF59B0B")
  926. .WithAppName("TestApp")
  927. .Build())
  928. .WithBundleName("TestApp")
  929. .Build());
  930. }
  931. TEST(TagParserTest, BracesEncoding) {
  932. VerifyTagParseSuccess(
  933. "appguid=%7B8617EE50-F91C-4DC1-B937-0969EEF59B0B%7D&"
  934. "appname=TestApp&",
  935. absl::nullopt,
  936. TagArgsBuilder()
  937. .WithApp(AppArgsBuilder("{8617EE50-F91C-4DC1-B937-0969EEF59B0B}")
  938. .WithAppName("TestApp")
  939. .Build())
  940. .WithBundleName("TestApp")
  941. .Build());
  942. }
  943. //
  944. // Test multiple applications in the extra arguments
  945. //
  946. TEST(TagParserTestMultipleEntries, TestNotStartingWithAppId) {
  947. VerifyTagParseFail(
  948. "appname=TestApp&"
  949. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  950. "appname=TestApp&"
  951. "appname=false&"
  952. "iid=98CEC468-9429-4984-AEDE-4F53C6A14869&"
  953. "ap=test_ap&"
  954. "usagestats=1&"
  955. "browser=2&",
  956. absl::nullopt, ErrorCode::kApp_AppIdNotSpecified);
  957. }
  958. // This also tests that the last occurrence of a global extra arg is the one
  959. // that is saved.
  960. TEST(TagParserTestMultipleEntries, ThreeApplications) {
  961. VerifyTagParseSuccess(
  962. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  963. "appname=TestApp&"
  964. "needsadmin=false&"
  965. "iid=98CEC468-9429-4984-AEDE-4F53C6A14869&"
  966. "ap=test_ap&"
  967. "usagestats=1&"
  968. "browser=2&"
  969. "brand=GOOG&"
  970. "client=_some_client&"
  971. "experiments=_experiment_a&"
  972. "untrusteddata=ABCDEFG&"
  973. "referral=A123456789&"
  974. "appguid=5E46DE36-737D-4271-91C1-C062F9FE21D9&"
  975. "appname=TestApp2&"
  976. "needsadmin=true&"
  977. "experiments=_experiment_b&"
  978. "untrusteddata=1234567&"
  979. "iid=98CEC468-9429-4984-AEDE-4F53C6A14869&"
  980. "ap=test_ap2&"
  981. "usagestats=0&"
  982. "browser=3&"
  983. "brand=g00g&"
  984. "client=_different_client&"
  985. "appguid=5F46DE36-737D-4271-91C1-C062F9FE21D9&"
  986. "appname=TestApp3&"
  987. "needsadmin=prefers&",
  988. {"appguid=5F46DE36-737D-4271-91C1-C062F9FE21D9&"
  989. "installerdata=installerdata_app3&"
  990. "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&"
  991. "installerdata=installerdata_app1"},
  992. TagArgsBuilder()
  993. .WithBundleName("TestApp")
  994. .WithInstallationId("98CEC468-9429-4984-AEDE-4F53C6A14869")
  995. .WithBrandCode("g00g")
  996. .WithClientId("_different_client")
  997. .WithReferralId("A123456789")
  998. .WithBrowserType(TagArgs::BrowserType::kFirefox)
  999. .WithUsageStatsEnable(false)
  1000. .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b")
  1001. .WithAppName("TestApp")
  1002. .WithNeedsAdmin(AppArgs::NeedsAdmin::kNo)
  1003. .WithAp("test_ap")
  1004. .WithEncodedInstallerData("installerdata_app1")
  1005. .WithExperimentLabels("_experiment_a")
  1006. .WithUntrustedData("A=3&Message=Hello,%20World!")
  1007. .Build())
  1008. .WithApp(AppArgsBuilder("5e46de36-737d-4271-91c1-c062f9fe21d9")
  1009. .WithAppName("TestApp2")
  1010. .WithNeedsAdmin(AppArgs::NeedsAdmin::kYes)
  1011. .WithAp("test_ap2")
  1012. .WithExperimentLabels("_experiment_b")
  1013. .WithUntrustedData("X=5")
  1014. .Build())
  1015. .WithApp(AppArgsBuilder("5f46de36-737d-4271-91c1-c062f9fe21d9")
  1016. .WithAppName("TestApp3")
  1017. .WithEncodedInstallerData("installerdata_app3")
  1018. .WithNeedsAdmin(AppArgs::NeedsAdmin::kPrefers)
  1019. .Build())
  1020. .Build());
  1021. }
  1022. } // namespace updater