shell_integration_linux_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/shell_integration_linux.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cstdlib>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/base_paths.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/environment.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/test/scoped_path_override.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FPL FILE_PATH_LITERAL
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochusing ::testing::ElementsAre;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides mock environment variables values based on a stored map.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockEnvironment : public base::Environment {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockEnvironment() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Set(const std::string& name, const std::string& value) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variables_[name] = value;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetVar(const char* variable_name, std::string* result) OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ContainsKey(variables_, variable_name)) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = variables_[variable_name];
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SetVar(const char* variable_name,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const std::string& new_value) OVERRIDE {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool UnSetVar(const char* variable_name) OVERRIDE {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::string> variables_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockEnvironment);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataWriteLocation) {
732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::MessageLoop message_loop;
742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop);
752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that it returns $XDG_DATA_HOME.
772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("HOME", "/home/user");
802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("XDG_DATA_HOME", "/user/path");
812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    base::FilePath path;
822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    ASSERT_TRUE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path));
832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_EQ(base::FilePath("/user/path"), path);
842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that $XDG_DATA_HOME falls back to $HOME/.local/share.
872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("HOME", "/home/user");
902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    base::FilePath path;
912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    ASSERT_TRUE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path));
922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_EQ(base::FilePath("/home/user/.local/share"), path);
932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it fails.
962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    base::FilePath path;
992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    ASSERT_FALSE(ShellIntegrationLinux::GetDataWriteLocation(&env, &path));
1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetDataSearchLocations) {
1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::MessageLoop message_loop;
1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop);
1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that it returns $XDG_DATA_HOME + $XDG_DATA_DIRS.
1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("HOME", "/home/user");
1112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("XDG_DATA_HOME", "/user/path");
1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2");
1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_THAT(
1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ShellIntegrationLinux::GetDataSearchLocations(&env),
1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ElementsAre(base::FilePath("/user/path"),
1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/system/path/1"),
1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/system/path/2")));
1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that $XDG_DATA_HOME falls back to $HOME/.local/share.
1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("HOME", "/home/user");
1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2");
1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_THAT(
1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ShellIntegrationLinux::GetDataSearchLocations(&env),
1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ElementsAre(base::FilePath("/home/user/.local/share"),
1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/system/path/1"),
1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/system/path/2")));
1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it still
1332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // succeeds.
1342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
1352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
1362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("XDG_DATA_DIRS", "/system/path/1:/system/path/2");
1372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_THAT(
1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ShellIntegrationLinux::GetDataSearchLocations(&env),
1392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ElementsAre(base::FilePath("/system/path/1"),
1402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/system/path/2")));
1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Test that $XDG_DATA_DIRS falls back to the two default paths.
1442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  {
1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    MockEnvironment env;
1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("HOME", "/home/user");
1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    env.Set("XDG_DATA_HOME", "/user/path");
1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_THAT(
1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ShellIntegrationLinux::GetDataSearchLocations(&env),
1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ElementsAre(base::FilePath("/user/path"),
1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/usr/local/share"),
1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    base::FilePath("/usr/share")));
1532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutLocations) {
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath kProfilePath("Profile 1");
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kExtensionId[] = "test_extension";
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const char kTemplateFilename[] = "chrome-test_extension-Profile_1.desktop";
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath kTemplateFilepath(kTemplateFilename);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kNoDisplayDesktopFile[] = "[Desktop Entry]\nNoDisplay=true";
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No existing shortcuts.
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellIntegration::ShortcutLocations result =
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutLocations(
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kProfilePath, kExtensionId);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.on_desktop);
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE,
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              result.applications_menu_location);
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.in_quick_launch_bar);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.hidden);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shortcut on desktop.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath desktop_path = temp_dir.path();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(desktop_path));
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(file_util::WriteFile(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        desktop_path.AppendASCII(kTemplateFilename),
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "", 0));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellIntegration::ShortcutLocations result =
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutLocations(
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kProfilePath, kExtensionId, desktop_path);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(result.on_desktop);
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE,
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              result.applications_menu_location);
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.in_quick_launch_bar);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.hidden);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shortcut in applications directory.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath apps_path = temp_dir.path().AppendASCII("applications");
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    env.Set("XDG_DATA_HOME", temp_dir.path().value());
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(apps_path));
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(file_util::WriteFile(
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        apps_path.AppendASCII(kTemplateFilename),
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "", 0));
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellIntegration::ShortcutLocations result =
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutLocations(
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kProfilePath, kExtensionId);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.on_desktop);
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS,
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              result.applications_menu_location);
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.in_quick_launch_bar);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.hidden);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shortcut in applications directory with NoDisplay=true.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath apps_path = temp_dir.path().AppendASCII("applications");
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    env.Set("XDG_DATA_HOME", temp_dir.path().value());
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(apps_path));
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        apps_path.AppendASCII(kTemplateFilename),
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kNoDisplayDesktopFile, strlen(kNoDisplayDesktopFile)));
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellIntegration::ShortcutLocations result =
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutLocations(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kProfilePath, kExtensionId);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Doesn't count as being in applications menu.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.on_desktop);
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_NONE,
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              result.applications_menu_location);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.in_quick_launch_bar);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(result.hidden);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shortcut on desktop and in applications directory.
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir1;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir1.CreateUniqueTempDir());
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath desktop_path = temp_dir1.path();
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir2;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir2.CreateUniqueTempDir());
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath apps_path = temp_dir2.path().AppendASCII("applications");
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(desktop_path));
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(file_util::WriteFile(
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        desktop_path.AppendASCII(kTemplateFilename),
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "", 0));
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    env.Set("XDG_DATA_HOME", temp_dir2.path().value());
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(apps_path));
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(file_util::WriteFile(
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        apps_path.AppendASCII(kTemplateFilename),
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "", 0));
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShellIntegration::ShortcutLocations result =
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutLocations(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kProfilePath, kExtensionId, desktop_path);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(result.on_desktop);
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(ShellIntegration::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS,
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              result.applications_menu_location);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.in_quick_launch_bar);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(result.hidden);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ShellIntegrationTest, GetExistingShortcutContents) {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kTemplateFilename[] = "shortcut-test.desktop";
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath kTemplateFilepath(kTemplateFilename);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kTestData1[] = "a magical testing string";
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kTestData2[] = "a different testing string";
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that it searches $XDG_DATA_HOME/applications.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockEnvironment env;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env.Set("XDG_DATA_HOME", temp_dir.path().value());
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Create a file in a non-applications directory. This should be ignored.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        temp_dir.path().AppendASCII(kTemplateFilename),
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTestData2, strlen(kTestData2)));
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir.path().AppendASCII("applications")));
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir.path().AppendASCII("applications")
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            .AppendASCII(kTemplateFilename),
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kTestData1, strlen(kTestData1)));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string contents;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutContents(
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kTemplateFilepath, &contents));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestData1, contents);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that it falls back to $HOME/.local/share/applications.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    env.Set("HOME", temp_dir.path().value());
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir.path().AppendASCII(".local/share/applications")));
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir.path().AppendASCII(".local/share/applications")
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            .AppendASCII(kTemplateFilename),
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTestData1, strlen(kTestData1)));
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string contents;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutContents(
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kTemplateFilepath, &contents));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kTestData1, contents);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that it searches $XDG_DATA_DIRS/applications.
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockEnvironment env;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    env.Set("XDG_DATA_DIRS", temp_dir.path().value());
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        temp_dir.path().AppendASCII("applications")));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        temp_dir.path().AppendASCII("applications")
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .AppendASCII(kTemplateFilename),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kTestData2, strlen(kTestData2)));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string contents;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutContents(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kTemplateFilepath, &contents));
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(kTestData2, contents);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that it searches $X/applications for each X in $XDG_DATA_DIRS.
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir1;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir1.CreateUniqueTempDir());
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ScopedTempDir temp_dir2;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir2.CreateUniqueTempDir());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockEnvironment env;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    env.Set("XDG_DATA_DIRS", temp_dir1.path().value() + ":" +
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             temp_dir2.path().value());
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Create a file in a non-applications directory. This should be ignored.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir1.path().AppendASCII(kTemplateFilename),
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTestData1, strlen(kTestData1)));
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only create a findable desktop file in the second path.
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir2.path().AppendASCII("applications")));
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(file_util::WriteFile(
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        temp_dir2.path().AppendASCII("applications")
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            .AppendASCII(kTemplateFilename),
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kTestData2, strlen(kTestData2)));
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string contents;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ShellIntegrationLinux::GetExistingShortcutContents(
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &env, kTemplateFilepath, &contents));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestData2, contents);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExtensionShortcutFilename) {
3822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::FilePath kProfilePath("a/b/c/Profile Name?");
3832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const char kExtensionId[] = "extensionid";
3842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_EQ(base::FilePath("chrome-extensionid-Profile_Name_.desktop"),
3852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch            ShellIntegrationLinux::GetExtensionShortcutFilename(
3862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                kProfilePath, kExtensionId));
3872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
3882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(ShellIntegrationTest, GetExistingProfileShortcutFilenames) {
3902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::FilePath kProfilePath("a/b/c/Profile Name?");
3912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const char kApp1Filename[] = "chrome-extension1-Profile_Name_.desktop";
3922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const char kApp2Filename[] = "chrome-extension2-Profile_Name_.desktop";
3932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const char kUnrelatedAppFilename[] = "chrome-extension-Other_Profile.desktop";
3942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::MessageLoop message_loop;
3962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  content::TestBrowserThread file_thread(BrowserThread::FILE, &message_loop);
3972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  base::ScopedTempDir temp_dir;
3992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
4002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  ASSERT_EQ(0,
4012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch            file_util::WriteFile(
4022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                temp_dir.path().AppendASCII(kApp1Filename), "", 0));
4032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  ASSERT_EQ(0,
4042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch            file_util::WriteFile(
4052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                temp_dir.path().AppendASCII(kApp2Filename), "", 0));
4062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // This file should not be returned in the results.
4072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  ASSERT_EQ(0,
4082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch            file_util::WriteFile(
4092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                temp_dir.path().AppendASCII(kUnrelatedAppFilename), "", 0));
4102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  std::vector<base::FilePath> paths =
4112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      ShellIntegrationLinux::GetExistingProfileShortcutFilenames(
4122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          kProfilePath, temp_dir.path());
4132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Path order is arbitrary. Sort the output for consistency.
4142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  std::sort(paths.begin(), paths.end());
4152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_THAT(paths,
4162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              ElementsAre(base::FilePath(kApp1Filename),
4172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                          base::FilePath(kApp2Filename)));
4182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetWebShortcutFilename) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType* path;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* url;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FPL("http___foo_.desktop"), "http://foo" },
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FPL("http___foo_bar_.desktop"), "http://foo/bar/" },
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FPL("http___foo_bar_a=b&c=d.desktop"), "http://foo/bar?a=b&c=d" },
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we're starting to be more evil...
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FPL("http___foo_.desktop"), "http://foo/bar/baz/../../../../../" },
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FPL("http___foo_.desktop"), "http://foo/bar/././../baz/././../" },
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { FPL("http___.._.desktop"), "http://../../../../" },
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(chrome::kBrowserProcessExecutableName) + "-" +
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              test_cases[i].path,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ShellIntegrationLinux::GetWebShortcutFilename(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GURL(test_cases[i].url)).value()) <<
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        " while testing " << test_cases[i].url;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ShellIntegrationTest, GetDesktopFileContents) {
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::FilePath kChromeExePath("/opt/google/chrome/google-chrome");
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* url;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* title;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* icon_name;
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool nodisplay;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_output;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Real-world case.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://gmail.com",
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GMail",
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "chrome-http__gmail.com",
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "#!/usr/bin/env xdg-open\n"
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[Desktop Entry]\n"
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Version=1.0\n"
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Terminal=false\n"
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Type=Application\n"
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Name=GMail\n"
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Icon=chrome-http__gmail.com\n"
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "StartupWMClass=gmail.com\n"
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure that empty icons are replaced by the chrome icon.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://gmail.com",
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GMail",
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "#!/usr/bin/env xdg-open\n"
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[Desktop Entry]\n"
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Terminal=false\n"
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Application\n"
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Name=GMail\n"
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Icon=chromium-browser\n"
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "StartupWMClass=gmail.com\n"
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Test adding NoDisplay=true.
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "http://gmail.com",
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "GMail",
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "chrome-http__gmail.com",
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "#!/usr/bin/env xdg-open\n"
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "[Desktop Entry]\n"
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Terminal=false\n"
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Application\n"
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Name=GMail\n"
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Exec=/opt/google/chrome/google-chrome --app=http://gmail.com/\n"
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Icon=chrome-http__gmail.com\n"
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "NoDisplay=true\n"
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "StartupWMClass=gmail.com\n"
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we're starting to be more evil...
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://evil.com/evil --join-the-b0tnet",
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Ownz0red\nExec=rm -rf /",
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "chrome-http__evil.com_evil",
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "#!/usr/bin/env xdg-open\n"
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[Desktop Entry]\n"
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Terminal=false\n"
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Application\n"
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Name=http://evil.com/evil%20--join-the-b0tnet\n"
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Exec=/opt/google/chrome/google-chrome "
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "--app=http://evil.com/evil%20--join-the-b0tnet\n"
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Icon=chrome-http__evil.com_evil\n"
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "StartupWMClass=evil.com__evil%20--join-the-b0tnet\n"
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://evil.com/evil; rm -rf /; \"; rm -rf $HOME >ownz0red",
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Innocent Title",
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "chrome-http__evil.com_evil",
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "#!/usr/bin/env xdg-open\n"
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[Desktop Entry]\n"
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Terminal=false\n"
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Application\n"
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Name=Innocent Title\n"
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Exec=/opt/google/chrome/google-chrome "
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"--app=http://evil.com/evil;%20rm%20-rf%20/;%20%22;%20rm%20"
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Note: $ is escaped as \$ within an arg to Exec, and then
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the \ is escaped as \\ as all strings in a Desktop file should
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // be; finally, \\ becomes \\\\ when represented in a C++ string!
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-rf%20\\\\$HOME%20%3Eownz0red\"\n"
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Icon=chrome-http__evil.com_evil\n"
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "StartupWMClass=evil.com__evil;%20rm%20-rf%20_;%20%22;%20"
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "rm%20-rf%20$HOME%20%3Eownz0red\n"
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://evil.com/evil | cat `echo ownz0red` >/dev/null",
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Innocent Title",
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "chrome-http__evil.com_evil",
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "#!/usr/bin/env xdg-open\n"
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[Desktop Entry]\n"
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Terminal=false\n"
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Application\n"
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Name=Innocent Title\n"
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Exec=/opt/google/chrome/google-chrome "
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "--app=http://evil.com/evil%20%7C%20cat%20%60echo%20ownz0red"
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "%60%20%3E/dev/null\n"
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Icon=chrome-http__evil.com_evil\n"
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "StartupWMClass=evil.com__evil%20%7C%20cat%20%60echo%20ownz0red"
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "%60%20%3E_dev_null\n"
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(i);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_cases[i].expected_output,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ShellIntegrationLinux::GetDesktopFileContents(
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            kChromeExePath,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            web_app::GenerateApplicationNameFromURL(GURL(test_cases[i].url)),
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GURL(test_cases[i].url),
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            std::string(),
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::FilePath(),
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ASCIIToUTF16(test_cases[i].title),
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_cases[i].icon_name,
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::FilePath(),
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_cases[i].nodisplay));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ShellIntegrationTest, GetDirectoryFileContents) {
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const struct {
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const char* title;
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const char* icon_name;
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const char* expected_output;
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } test_cases[] = {
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Real-world case.
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "Chrome Apps",
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "chrome-apps",
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "[Desktop Entry]\n"
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Directory\n"
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Name=Chrome Apps\n"
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Icon=chrome-apps\n"
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure that empty icons are replaced by the chrome icon.
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "Chrome Apps",
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "",
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "[Desktop Entry]\n"
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Version=1.0\n"
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Type=Directory\n"
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Name=Chrome Apps\n"
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "Icon=chromium-browser\n"
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) {
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE(i);
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        test_cases[i].expected_output,
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ShellIntegrationLinux::GetDirectoryFileContents(
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ASCIIToUTF16(test_cases[i].title),
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            test_cases[i].icon_name));
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
617