xref: /aosp_15_r20/external/cronet/base/win/shortcut_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/win/shortcut.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_temp_dir.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/test/test_file_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/test/test_shortcut_win.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_com_initializer.h"
17*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
18*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace base {
21*6777b538SAndroid Build Coastguard Worker namespace win {
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace {
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker static const char kFileContents[] = "This is a target.";
26*6777b538SAndroid Build Coastguard Worker static const char kFileContents2[] = "This is another target.";
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker class ShortcutTest : public testing::Test {
29*6777b538SAndroid Build Coastguard Worker  protected:
SetUp()30*6777b538SAndroid Build Coastguard Worker   void SetUp() override {
31*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
32*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(temp_dir_2_.CreateUniqueTempDir());
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker     link_file_ = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("My Link.lnk"));
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker     // Shortcut 1's properties
37*6777b538SAndroid Build Coastguard Worker     {
38*6777b538SAndroid Build Coastguard Worker       const FilePath target_file(
39*6777b538SAndroid Build Coastguard Worker           temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Target 1.txt")));
40*6777b538SAndroid Build Coastguard Worker       WriteFile(target_file, kFileContents, std::size(kFileContents));
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker       link_properties_.set_target(target_file);
43*6777b538SAndroid Build Coastguard Worker       link_properties_.set_working_dir(temp_dir_.GetPath());
44*6777b538SAndroid Build Coastguard Worker       link_properties_.set_arguments(L"--magic --awesome");
45*6777b538SAndroid Build Coastguard Worker       link_properties_.set_description(L"Chrome is awesome.");
46*6777b538SAndroid Build Coastguard Worker       link_properties_.set_icon(link_properties_.target, 4);
47*6777b538SAndroid Build Coastguard Worker       link_properties_.set_app_id(L"Chrome");
48*6777b538SAndroid Build Coastguard Worker       link_properties_.set_dual_mode(false);
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker       // The CLSID below was randomly selected.
51*6777b538SAndroid Build Coastguard Worker       static constexpr CLSID toast_activator_clsid = {
52*6777b538SAndroid Build Coastguard Worker           0x08d401c2,
53*6777b538SAndroid Build Coastguard Worker           0x3f79,
54*6777b538SAndroid Build Coastguard Worker           0x41d8,
55*6777b538SAndroid Build Coastguard Worker           {0x89, 0xd0, 0x99, 0x25, 0xee, 0x16, 0x28, 0x63}};
56*6777b538SAndroid Build Coastguard Worker       link_properties_.set_toast_activator_clsid(toast_activator_clsid);
57*6777b538SAndroid Build Coastguard Worker     }
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker     // Shortcut 2's properties (all different from properties of shortcut 1).
60*6777b538SAndroid Build Coastguard Worker     {
61*6777b538SAndroid Build Coastguard Worker       const FilePath target_file_2(
62*6777b538SAndroid Build Coastguard Worker           temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Target 2.txt")));
63*6777b538SAndroid Build Coastguard Worker       WriteFile(target_file_2, kFileContents2, std::size(kFileContents2));
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker       FilePath icon_path_2;
66*6777b538SAndroid Build Coastguard Worker       CreateTemporaryFileInDir(temp_dir_.GetPath(), &icon_path_2);
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_target(target_file_2);
69*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_working_dir(temp_dir_2_.GetPath());
70*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_arguments(L"--super --crazy");
71*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_description(L"The best in the west.");
72*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_icon(icon_path_2, 0);
73*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_app_id(L"Chrome.UserLevelCrazySuffix");
74*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_dual_mode(true);
75*6777b538SAndroid Build Coastguard Worker       link_properties_2_.set_toast_activator_clsid(CLSID_NULL);
76*6777b538SAndroid Build Coastguard Worker     }
77*6777b538SAndroid Build Coastguard Worker   }
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   ScopedCOMInitializer com_initializer_;
80*6777b538SAndroid Build Coastguard Worker   ScopedTempDir temp_dir_;
81*6777b538SAndroid Build Coastguard Worker   ScopedTempDir temp_dir_2_;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   // The link file to be created/updated in the shortcut tests below.
84*6777b538SAndroid Build Coastguard Worker   FilePath link_file_;
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   // Properties for the created shortcut.
87*6777b538SAndroid Build Coastguard Worker   ShortcutProperties link_properties_;
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker   // Properties for the updated shortcut.
90*6777b538SAndroid Build Coastguard Worker   ShortcutProperties link_properties_2_;
91*6777b538SAndroid Build Coastguard Worker };
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker }  // namespace
94*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,CreateAndResolveShortcutProperties)95*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, CreateAndResolveShortcutProperties) {
96*6777b538SAndroid Build Coastguard Worker   // Test all properties.
97*6777b538SAndroid Build Coastguard Worker   FilePath file_1(temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Link1.lnk")));
98*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(file_1, link_properties_,
99*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   ShortcutProperties properties_read_1;
102*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(ResolveShortcutProperties(
103*6777b538SAndroid Build Coastguard Worker       file_1, ShortcutProperties::PROPERTIES_ALL, &properties_read_1));
104*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<unsigned>(ShortcutProperties::PROPERTIES_ALL),
105*6777b538SAndroid Build Coastguard Worker             properties_read_1.options);
106*6777b538SAndroid Build Coastguard Worker   ValidatePathsAreEqual(link_properties_.target, properties_read_1.target);
107*6777b538SAndroid Build Coastguard Worker   ValidatePathsAreEqual(link_properties_.working_dir,
108*6777b538SAndroid Build Coastguard Worker                         properties_read_1.working_dir);
109*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.arguments, properties_read_1.arguments);
110*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.description, properties_read_1.description);
111*6777b538SAndroid Build Coastguard Worker   ValidatePathsAreEqual(link_properties_.icon, properties_read_1.icon);
112*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.icon_index, properties_read_1.icon_index);
113*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.app_id, properties_read_1.app_id);
114*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.dual_mode, properties_read_1.dual_mode);
115*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.toast_activator_clsid,
116*6777b538SAndroid Build Coastguard Worker             properties_read_1.toast_activator_clsid);
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   // Test simple shortcut with no special properties set.
119*6777b538SAndroid Build Coastguard Worker   FilePath file_2(temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Link2.lnk")));
120*6777b538SAndroid Build Coastguard Worker   ShortcutProperties only_target_properties;
121*6777b538SAndroid Build Coastguard Worker   only_target_properties.set_target(link_properties_.target);
122*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(file_2, only_target_properties,
123*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker   ShortcutProperties properties_read_2;
126*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(ResolveShortcutProperties(
127*6777b538SAndroid Build Coastguard Worker       file_2, ShortcutProperties::PROPERTIES_ALL, &properties_read_2));
128*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<unsigned>(ShortcutProperties::PROPERTIES_ALL),
129*6777b538SAndroid Build Coastguard Worker             properties_read_2.options);
130*6777b538SAndroid Build Coastguard Worker   ValidatePathsAreEqual(only_target_properties.target,
131*6777b538SAndroid Build Coastguard Worker                         properties_read_2.target);
132*6777b538SAndroid Build Coastguard Worker   ValidatePathsAreEqual(FilePath(), properties_read_2.working_dir);
133*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(L"", properties_read_2.arguments);
134*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(L"", properties_read_2.description);
135*6777b538SAndroid Build Coastguard Worker   ValidatePathsAreEqual(FilePath(), properties_read_2.icon);
136*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, properties_read_2.icon_index);
137*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(L"", properties_read_2.app_id);
138*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(properties_read_2.dual_mode);
139*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(CLSID_NULL, properties_read_2.toast_activator_clsid);
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,CreateAndResolveShortcut)142*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, CreateAndResolveShortcut) {
143*6777b538SAndroid Build Coastguard Worker   ShortcutProperties only_target_properties;
144*6777b538SAndroid Build Coastguard Worker   only_target_properties.set_target(link_properties_.target);
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, only_target_properties,
147*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   FilePath resolved_name;
150*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, nullptr));
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker   char read_contents[std::size(kFileContents)];
153*6777b538SAndroid Build Coastguard Worker   ReadFile(resolved_name, read_contents);
154*6777b538SAndroid Build Coastguard Worker   EXPECT_STREQ(kFileContents, read_contents);
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,ResolveShortcutWithArgs)157*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, ResolveShortcutWithArgs) {
158*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
159*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker   FilePath resolved_name;
162*6777b538SAndroid Build Coastguard Worker   std::wstring args;
163*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, &args));
164*6777b538SAndroid Build Coastguard Worker 
165*6777b538SAndroid Build Coastguard Worker   char read_contents[std::size(kFileContents)];
166*6777b538SAndroid Build Coastguard Worker   ReadFile(resolved_name, read_contents);
167*6777b538SAndroid Build Coastguard Worker   EXPECT_STREQ(kFileContents, read_contents);
168*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(link_properties_.arguments, args);
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,CreateShortcutWithOnlySomeProperties)171*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, CreateShortcutWithOnlySomeProperties) {
172*6777b538SAndroid Build Coastguard Worker   ShortcutProperties target_and_args_properties;
173*6777b538SAndroid Build Coastguard Worker   target_and_args_properties.set_target(link_properties_.target);
174*6777b538SAndroid Build Coastguard Worker   target_and_args_properties.set_arguments(link_properties_.arguments);
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, target_and_args_properties,
177*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
178*6777b538SAndroid Build Coastguard Worker 
179*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, target_and_args_properties);
180*6777b538SAndroid Build Coastguard Worker }
181*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,CreateShortcutVerifyProperties)182*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, CreateShortcutVerifyProperties) {
183*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
184*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, link_properties_);
187*6777b538SAndroid Build Coastguard Worker }
188*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,UpdateShortcutVerifyPropertiess)189*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, UpdateShortcutVerifyPropertiess) {
190*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
191*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_2_,
194*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kUpdateExisting));
195*6777b538SAndroid Build Coastguard Worker 
196*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, link_properties_2_);
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,UpdateShortcutUpdateOnlyTargetAndResolve)199*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, UpdateShortcutUpdateOnlyTargetAndResolve) {
200*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
201*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   ShortcutProperties update_only_target_properties;
204*6777b538SAndroid Build Coastguard Worker   update_only_target_properties.set_target(link_properties_2_.target);
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_,
207*6777b538SAndroid Build Coastguard Worker                                          update_only_target_properties,
208*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kUpdateExisting));
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   ShortcutProperties expected_properties = link_properties_;
211*6777b538SAndroid Build Coastguard Worker   expected_properties.set_target(link_properties_2_.target);
212*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, expected_properties);
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker   FilePath resolved_name;
215*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, nullptr));
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   char read_contents[std::size(kFileContents2)];
218*6777b538SAndroid Build Coastguard Worker   ReadFile(resolved_name, read_contents);
219*6777b538SAndroid Build Coastguard Worker   EXPECT_STREQ(kFileContents2, read_contents);
220*6777b538SAndroid Build Coastguard Worker }
221*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,UpdateShortcutMakeDualMode)222*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, UpdateShortcutMakeDualMode) {
223*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
224*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker   ShortcutProperties make_dual_mode_properties;
227*6777b538SAndroid Build Coastguard Worker   make_dual_mode_properties.set_dual_mode(true);
228*6777b538SAndroid Build Coastguard Worker 
229*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, make_dual_mode_properties,
230*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kUpdateExisting));
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker   ShortcutProperties expected_properties = link_properties_;
233*6777b538SAndroid Build Coastguard Worker   expected_properties.set_dual_mode(true);
234*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, expected_properties);
235*6777b538SAndroid Build Coastguard Worker }
236*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,UpdateShortcutRemoveDualMode)237*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, UpdateShortcutRemoveDualMode) {
238*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_2_,
239*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
240*6777b538SAndroid Build Coastguard Worker 
241*6777b538SAndroid Build Coastguard Worker   ShortcutProperties remove_dual_mode_properties;
242*6777b538SAndroid Build Coastguard Worker   remove_dual_mode_properties.set_dual_mode(false);
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_,
245*6777b538SAndroid Build Coastguard Worker                                          remove_dual_mode_properties,
246*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kUpdateExisting));
247*6777b538SAndroid Build Coastguard Worker 
248*6777b538SAndroid Build Coastguard Worker   ShortcutProperties expected_properties = link_properties_2_;
249*6777b538SAndroid Build Coastguard Worker   expected_properties.set_dual_mode(false);
250*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, expected_properties);
251*6777b538SAndroid Build Coastguard Worker }
252*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,UpdateShortcutClearArguments)253*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, UpdateShortcutClearArguments) {
254*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
255*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
256*6777b538SAndroid Build Coastguard Worker 
257*6777b538SAndroid Build Coastguard Worker   ShortcutProperties clear_arguments_properties;
258*6777b538SAndroid Build Coastguard Worker   clear_arguments_properties.set_arguments(std::wstring());
259*6777b538SAndroid Build Coastguard Worker 
260*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, clear_arguments_properties,
261*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kUpdateExisting));
262*6777b538SAndroid Build Coastguard Worker 
263*6777b538SAndroid Build Coastguard Worker   ShortcutProperties expected_properties = link_properties_;
264*6777b538SAndroid Build Coastguard Worker   expected_properties.set_arguments(std::wstring());
265*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, expected_properties);
266*6777b538SAndroid Build Coastguard Worker }
267*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,FailUpdateShortcutThatDoesNotExist)268*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, FailUpdateShortcutThatDoesNotExist) {
269*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
270*6777b538SAndroid Build Coastguard Worker                                           ShortcutOperation::kUpdateExisting));
271*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(link_file_));
272*6777b538SAndroid Build Coastguard Worker }
273*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,ReplaceShortcutAllProperties)274*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, ReplaceShortcutAllProperties) {
275*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
276*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
277*6777b538SAndroid Build Coastguard Worker 
278*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_2_,
279*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kReplaceExisting));
280*6777b538SAndroid Build Coastguard Worker 
281*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, link_properties_2_);
282*6777b538SAndroid Build Coastguard Worker }
283*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,ReplaceShortcutSomeProperties)284*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, ReplaceShortcutSomeProperties) {
285*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
286*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
287*6777b538SAndroid Build Coastguard Worker 
288*6777b538SAndroid Build Coastguard Worker   ShortcutProperties new_properties;
289*6777b538SAndroid Build Coastguard Worker   new_properties.set_target(link_properties_2_.target);
290*6777b538SAndroid Build Coastguard Worker   new_properties.set_arguments(link_properties_2_.arguments);
291*6777b538SAndroid Build Coastguard Worker   new_properties.set_description(link_properties_2_.description);
292*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, new_properties,
293*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kReplaceExisting));
294*6777b538SAndroid Build Coastguard Worker 
295*6777b538SAndroid Build Coastguard Worker   // Expect only properties in |new_properties| to be set, all other properties
296*6777b538SAndroid Build Coastguard Worker   // should have been overwritten.
297*6777b538SAndroid Build Coastguard Worker   ShortcutProperties expected_properties(new_properties);
298*6777b538SAndroid Build Coastguard Worker   expected_properties.set_working_dir(FilePath());
299*6777b538SAndroid Build Coastguard Worker   expected_properties.set_icon(FilePath(), 0);
300*6777b538SAndroid Build Coastguard Worker   expected_properties.set_app_id(std::wstring());
301*6777b538SAndroid Build Coastguard Worker   expected_properties.set_dual_mode(false);
302*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, expected_properties);
303*6777b538SAndroid Build Coastguard Worker }
304*6777b538SAndroid Build Coastguard Worker 
TEST_F(ShortcutTest,FailReplaceShortcutThatDoesNotExist)305*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, FailReplaceShortcutThatDoesNotExist) {
306*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
307*6777b538SAndroid Build Coastguard Worker                                           ShortcutOperation::kReplaceExisting));
308*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(link_file_));
309*6777b538SAndroid Build Coastguard Worker }
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker // Test that the old arguments remain on the replaced shortcut when not
312*6777b538SAndroid Build Coastguard Worker // otherwise specified.
TEST_F(ShortcutTest,ReplaceShortcutKeepOldArguments)313*6777b538SAndroid Build Coastguard Worker TEST_F(ShortcutTest, ReplaceShortcutKeepOldArguments) {
314*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_,
315*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kCreateAlways));
316*6777b538SAndroid Build Coastguard Worker 
317*6777b538SAndroid Build Coastguard Worker   // Do not explicitly set the arguments.
318*6777b538SAndroid Build Coastguard Worker   link_properties_2_.options &= ~ShortcutProperties::PROPERTIES_ARGUMENTS;
319*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateOrUpdateShortcutLink(link_file_, link_properties_2_,
320*6777b538SAndroid Build Coastguard Worker                                          ShortcutOperation::kReplaceExisting));
321*6777b538SAndroid Build Coastguard Worker 
322*6777b538SAndroid Build Coastguard Worker   ShortcutProperties expected_properties(link_properties_2_);
323*6777b538SAndroid Build Coastguard Worker   expected_properties.set_arguments(link_properties_.arguments);
324*6777b538SAndroid Build Coastguard Worker   ValidateShortcut(link_file_, expected_properties);
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker 
327*6777b538SAndroid Build Coastguard Worker }  // namespace win
328*6777b538SAndroid Build Coastguard Worker }  // namespace base
329