1 // Copyright (c) 2012 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.
5 #include "base/test/test_shortcut_win.h"
11 #include "base/file_path.h"
12 #include "base/string16.h"
13 #include "base/utf_string_conversions.h"
14 #include "base/win/scoped_comptr.h"
15 #include "base/win/scoped_propvariant.h"
16 #include "base/win/windows_version.h"
17 #include "testing/gtest/include/gtest/gtest.h"
24 // Validates |actual_path|'s LongPathName case-insensitively matches
25 // |expected_path|'s LongPathName.
26 void ValidatePathsAreEqual(const FilePath
& expected_path
,
27 const FilePath
& actual_path
) {
28 wchar_t long_expected_path_chars
[MAX_PATH
] = {0};
29 wchar_t long_actual_path_chars
[MAX_PATH
] = {0};
31 // If |expected_path| is empty confirm immediately that |actual_path| is also
33 if (expected_path
.empty()) {
34 EXPECT_TRUE(actual_path
.empty());
38 // Proceed with LongPathName matching which will also confirm the paths exist.
39 EXPECT_NE(0U, ::GetLongPathName(
40 expected_path
.value().c_str(), long_expected_path_chars
, MAX_PATH
))
41 << "Failed to get LongPathName of " << expected_path
.value();
42 EXPECT_NE(0U, ::GetLongPathName(
43 actual_path
.value().c_str(), long_actual_path_chars
, MAX_PATH
))
44 << "Failed to get LongPathName of " << actual_path
.value();
46 FilePath
long_expected_path(long_expected_path_chars
);
47 FilePath
long_actual_path(long_actual_path_chars
);
48 EXPECT_FALSE(long_expected_path
.empty());
49 EXPECT_FALSE(long_actual_path
.empty());
51 EXPECT_EQ(long_expected_path
, long_actual_path
);
56 void ValidateShortcut(const FilePath
& shortcut_path
,
57 const ShortcutProperties
& properties
) {
58 ScopedComPtr
<IShellLink
> i_shell_link
;
59 ScopedComPtr
<IPersistFile
> i_persist_file
;
61 wchar_t read_target
[MAX_PATH
] = {0};
62 wchar_t read_working_dir
[MAX_PATH
] = {0};
63 wchar_t read_arguments
[MAX_PATH
] = {0};
64 wchar_t read_description
[MAX_PATH
] = {0};
65 wchar_t read_icon
[MAX_PATH
] = {0};
66 int read_icon_index
= 0;
70 // Initialize the shell interfaces.
71 EXPECT_TRUE(SUCCEEDED(hr
= i_shell_link
.CreateInstance(
72 CLSID_ShellLink
, NULL
, CLSCTX_INPROC_SERVER
)));
76 EXPECT_TRUE(SUCCEEDED(hr
= i_persist_file
.QueryFrom(i_shell_link
)));
81 EXPECT_TRUE(SUCCEEDED(hr
= i_persist_file
->Load(
82 shortcut_path
.value().c_str(), 0))) << "Failed to load shortcut at "
83 << shortcut_path
.value();
87 if (properties
.options
& ShortcutProperties::PROPERTIES_TARGET
) {
88 EXPECT_TRUE(SUCCEEDED(
89 i_shell_link
->GetPath(read_target
, MAX_PATH
, NULL
, SLGP_SHORTPATH
)));
90 ValidatePathsAreEqual(properties
.target
, FilePath(read_target
));
93 if (properties
.options
& ShortcutProperties::PROPERTIES_WORKING_DIR
) {
94 EXPECT_TRUE(SUCCEEDED(
95 i_shell_link
->GetWorkingDirectory(read_working_dir
, MAX_PATH
)));
96 ValidatePathsAreEqual(properties
.working_dir
, FilePath(read_working_dir
));
99 if (properties
.options
& ShortcutProperties::PROPERTIES_ARGUMENTS
) {
100 EXPECT_TRUE(SUCCEEDED(
101 i_shell_link
->GetArguments(read_arguments
, MAX_PATH
)));
102 EXPECT_EQ(properties
.arguments
, read_arguments
);
105 if (properties
.options
& ShortcutProperties::PROPERTIES_DESCRIPTION
) {
106 EXPECT_TRUE(SUCCEEDED(
107 i_shell_link
->GetDescription(read_description
, MAX_PATH
)));
108 EXPECT_EQ(properties
.description
, read_description
);
111 if (properties
.options
& ShortcutProperties::PROPERTIES_ICON
) {
112 EXPECT_TRUE(SUCCEEDED(
113 i_shell_link
->GetIconLocation(read_icon
, MAX_PATH
, &read_icon_index
)));
114 ValidatePathsAreEqual(properties
.icon
, FilePath(read_icon
));
115 EXPECT_EQ(properties
.icon_index
, read_icon_index
);
118 if (GetVersion() >= VERSION_WIN7
) {
119 ScopedComPtr
<IPropertyStore
> property_store
;
120 EXPECT_TRUE(SUCCEEDED(hr
= property_store
.QueryFrom(i_shell_link
)));
124 if (properties
.options
& ShortcutProperties::PROPERTIES_APP_ID
) {
125 ScopedPropVariant pv_app_id
;
126 EXPECT_EQ(S_OK
, property_store
->GetValue(PKEY_AppUserModel_ID
,
127 pv_app_id
.Receive()));
128 switch (pv_app_id
.get().vt
) {
130 EXPECT_TRUE(properties
.app_id
.empty());
133 EXPECT_EQ(properties
.app_id
, pv_app_id
.get().pwszVal
);
136 ADD_FAILURE() << "Unexpected variant type: " << pv_app_id
.get().vt
;
140 if (properties
.options
& ShortcutProperties::PROPERTIES_DUAL_MODE
) {
141 ScopedPropVariant pv_dual_mode
;
142 EXPECT_EQ(S_OK
, property_store
->GetValue(PKEY_AppUserModel_IsDualMode
,
143 pv_dual_mode
.Receive()));
144 switch (pv_dual_mode
.get().vt
) {
146 EXPECT_FALSE(properties
.dual_mode
);
149 EXPECT_EQ(properties
.dual_mode
,
150 static_cast<bool>(pv_dual_mode
.get().boolVal
));
153 ADD_FAILURE() << "Unexpected variant type: " << pv_dual_mode
.get().vt
;