blob: 2aa50f7929319411045999341a178397e27a1f31 [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include <string>
#include <vector>
#include <base/environment.h>
#include <base/files/scoped_temp_dir.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <gtest/gtest.h>
#include "vm_tools/garcon/icon_finder.cc"
namespace vm_tools {
namespace garcon {
namespace {
class IconFinderTest : public ::testing::Test {
public:
IconFinderTest() {
CHECK(temp_dir_.CreateUniqueTempDir());
data_dir_ = temp_dir_.GetPath();
desktop_file_dir_ = data_dir_.Append("applications");
CHECK(base::CreateDirectory(desktop_file_dir_));
icon_theme_dir_ = data_dir_.Append("icons").Append("hicolor");
icon_dir_ = icon_theme_dir_.Append("48x48").Append("apps");
CHECK(base::CreateDirectory(icon_dir_));
}
IconFinderTest(const IconFinderTest&) = delete;
IconFinderTest& operator=(const IconFinderTest&) = delete;
~IconFinderTest() override = default;
void WriteIndexThemeFile(const std::string& contents) {
base::FilePath file_path = icon_theme_dir_.Append("index.theme");
EXPECT_EQ(contents.size(),
base::WriteFile(file_path, contents.c_str(), contents.size()));
}
void WriteDesktopFile(const std::string& desktop_file_name,
const std::string& contents) {
base::FilePath file_path = desktop_file_dir_.Append(desktop_file_name);
EXPECT_EQ(contents.size(),
base::WriteFile(file_path, contents.c_str(), contents.size()));
}
const base::FilePath& icon_theme_dir() { return icon_theme_dir_; }
const base::FilePath& icon_dir() { return icon_dir_; }
const base::FilePath& data_dir() { return data_dir_; }
private:
base::ScopedTempDir temp_dir_;
base::FilePath data_dir_;
base::FilePath desktop_file_dir_;
base::FilePath icon_theme_dir_;
base::FilePath icon_dir_;
};
} // namespace
// This test verifies that icon_finder uses environment variable XDG_DATA_DIRS
// to search for app icons when it's set.
TEST_F(IconFinderTest, UseXdgDataDirsEnv) {
std::unique_ptr<base::Environment> env = base::Environment::Create();
env->SetVar("XDG_DATA_DIRS", "/a:/b");
env->SetVar("XDG_DATA_HOME", "/c");
std::vector<base::FilePath> expected_dirs = {
base::FilePath("/a/icons/gnome"), base::FilePath("/b/icons/gnome"),
base::FilePath("/c/icons/gnome"), base::FilePath("/a/icons/hicolor"),
base::FilePath("/b/icons/hicolor"), base::FilePath("/c/icons/hicolor")};
EXPECT_EQ(GetPathsForIconIndexDirs(), expected_dirs);
}
// This test verifies that default XDG data directories are used when
// environment variable XDG_DATA_DIRS is not set.
TEST_F(IconFinderTest, DefaultDirs) {
std::unique_ptr<base::Environment> env = base::Environment::Create();
env->SetVar("XDG_DATA_DIRS", "");
env->SetVar("XDG_DATA_HOME", "");
std::vector<base::FilePath> icon_dirs = GetPathsForIconIndexDirs();
EXPECT_NE(std::find(icon_dirs.begin(), icon_dirs.end(),
base::FilePath("/usr/share/icons/gnome")),
icon_dirs.end());
EXPECT_NE(std::find(icon_dirs.begin(), icon_dirs.end(),
base::FilePath("/usr/local/share/icons/hicolor")),
icon_dirs.end());
}
// This test verifies that we get a default list of dirs when the index.theme
// file is missing.
TEST_F(IconFinderTest, NoIndexThemeNoDir) {
std::vector<base::FilePath> expected_dirs = {
icon_theme_dir().Append("48x48").Append("apps"),
icon_theme_dir().Append("256x256").Append("apps"),
icon_theme_dir().Append("128x128").Append("apps"),
icon_theme_dir().Append("96x96").Append("apps"),
icon_theme_dir().Append("64x64").Append("apps"),
icon_theme_dir().Append("32x32").Append("apps"),
};
EXPECT_EQ(GetPathsForIcons(icon_theme_dir(), 48, 1), expected_dirs);
}
// This test verifies that the correct icon dirs are returned.
TEST_F(IconFinderTest, CorrectDirsReturned) {
WriteIndexThemeFile(
"[Icon Theme]\n"
"Name=Hicolor\n"
"Comment=Fallback icon theme\n"
"Hidden=true\n"
"Directories=48x48/apps\n"
"\n\n"
"[48x48/apps]\n"
"Size=48\n"
"Context=Applications\n"
"Type=Threshold\n\n");
std::vector<base::FilePath> expected_dirs = {icon_dir()};
EXPECT_TRUE(GetPathsForIcons(icon_theme_dir(), 48, 1) == expected_dirs);
}
// This test verifies that empty dir is returned when no desktop file exists.
TEST_F(IconFinderTest, NoDesktopfileNoDir) {
EXPECT_TRUE(LocateIconFile("gimp.desktop", 48, 1) == base::FilePath());
}
// This test verifies that correct icon file path is returned.
TEST_F(IconFinderTest, HappyCase) {
std::unique_ptr<base::Environment> env = base::Environment::Create();
env->SetVar("XDG_DATA_DIRS", data_dir().value());
WriteDesktopFile("gimp.desktop",
"[Desktop Entry]\n"
"Type=Application\n"
"Name=gimp\n"
"Icon=gimp");
WriteIndexThemeFile(
"[Icon Theme]\n"
"Name=Hicolor\n"
"Comment=Fallback icon theme\n"
"Hidden=true\n"
"Directories=48x48/apps\n"
"\n\n"
"[48x48/apps]\n"
"Size=48\n"
"Context=Applications\n"
"Type=Threshold\n\n");
base::FilePath icon_file_path = icon_dir().Append("gimp.png");
base::WriteFile(icon_file_path, "", 0);
EXPECT_TRUE(LocateIconFile("gimp", 48, 1) == icon_file_path);
}
} // namespace garcon
} // namespace vm_tools